在搞弄一些x86 asm时,我想知道一个错误导致EIP设置为00000000或另一个不存在的内存位置的情况。是否可以使用SEH或类似的错误处理机制来捕获这些情况并恢复执行? (假设堆栈,堆和寄存器没有被废弃)

最佳答案

没有真正好的方法可以在发生这种情况之前将其捕获,但是您可以尝试的一件事是检查堆栈(ESP和/或EBP的内存)并检查指向代码的指针。

如果导致此问题的指令是call,那么您很幸运-ESP上的双字词将是返回地址,指向违规者之后。

如果它是jmp,则机会更小,但是您仍然可以寻找可能的执行痕迹。

最坏的情况是,这是由带有被破坏的retESP引起的-通常在这一点上,堆栈是完全伪造的。您仍然可以检查其他寄存器的值,也许其中一个将包含一个可能为您提供一些线索的指针,并且您按照in this post的说明在整个堆栈区域中扫描堆栈帧模式。

07-24 09:22