Assembly 在程序集中使用/跳转之前检查地址是否存在?

Assembly 在程序集中使用/跳转之前检查地址是否存在?,assembly,memory-address,Assembly,Memory Address,假设我已将一些随机地址(如0x00001234加载到eax中。在跳转到该地址或取消引用该地址之前,是否有方法测试该地址是否有效/存在? 或者我必须实现一个异常处理程序吗?当然,如果您的操作系统允许您接管页面错误机制,那么这很容易做到。只需实现您自己的故障处理程序,在该地址临时存储ret指令,然后调用到该位置即可 您必须在处理程序中设置一个标志来指示它无效(用于写入ret或尝试执行它),并且如果它有效,您需要替换原始内容 或者,您也可以遍历IDT/GDT/LDT表,查看其中是否存在您的地址 祝你好

假设我已将一些随机地址(如
0x00001234
加载到
eax
中。在跳转到该地址或取消引用该地址之前,是否有方法测试该地址是否有效/存在?
或者我必须实现一个异常处理程序吗?

当然,如果您的操作系统允许您接管页面错误机制,那么这很容易做到。只需实现您自己的故障处理程序,在该地址临时存储
ret
指令,然后调用
到该位置即可

您必须在处理程序中设置一个标志来指示它无效(用于写入
ret
或尝试执行它),并且如果它有效,您需要替换原始内容

或者,您也可以遍历IDT/GDT/LDT表,查看其中是否存在您的地址

祝你好运,找到一个允许凡人完成这两项任务的操作系统:-)


如果你能告诉我们你为什么要这样做,而不是仅仅假设这是实现你想要的最好方法,我们可以想出另一个解决方案。

确切地说,你为什么要尝试将jmp映射到“随机”地址?这听起来确实是一个非常糟糕的主意。尽管如此,Win32还是为此提供了一个IsBadCodePtr函数。值得注意的是,
VERR
VERW
指令可能会根据上下文执行此操作(因为“有效”和“存在”在地址概念中几乎没有意义)