检查地址在 x86 程序集中是否可写
Checking if an address is writable in x86 assembly
仅使用(32 位)x86 程序集,是否可以检查地址是否可写,无需与操作系统交互,并且不会出现段错误?
该程序将在 ring 3 的 Linux 系统上 运行。我无法使用 "verw" 指令。
举个例子,我可能想检查地址 0x0804a000 是否可写。但是如果我例如do "mov eax, 0x0804a000; mov [eax], eax" 然后,如果地址不可写,程序将出现段错误。我知道的唯一其他方法是例如将sys_read调用到地址中,看是否失败,但这与操作系统交互。
有没有办法在给定约束的情况下检查地址是否可写?如果是这样,如何?
如果您有内核权限,您可能会在 MMU 中找到该信息。
但如果你不这样做,你就无法访问它,必须使用 OS 设施。
如果您的意思是不调用 OS 函数,那么至少在 Windows 上可以使用结构化异常处理。当然,它仍然是 OS 特定的,因为您需要在 FS 段访问 Windows TIB。
仅使用(32 位)x86 程序集,是否可以检查地址是否可写,无需与操作系统交互,并且不会出现段错误?
该程序将在 ring 3 的 Linux 系统上 运行。我无法使用 "verw" 指令。
举个例子,我可能想检查地址 0x0804a000 是否可写。但是如果我例如do "mov eax, 0x0804a000; mov [eax], eax" 然后,如果地址不可写,程序将出现段错误。我知道的唯一其他方法是例如将sys_read调用到地址中,看是否失败,但这与操作系统交互。
有没有办法在给定约束的情况下检查地址是否可写?如果是这样,如何?
如果您有内核权限,您可能会在 MMU 中找到该信息。
但如果你不这样做,你就无法访问它,必须使用 OS 设施。
如果您的意思是不调用 OS 函数,那么至少在 Windows 上可以使用结构化异常处理。当然,它仍然是 OS 特定的,因为您需要在 FS 段访问 Windows TIB。