调试指令IP指向0时的指针
假设您正在运行一个处理器上启用了中断处理的程序。 指令指针指向零。 我们如何才能知道导致指令指针指向0的原因。
我不清楚这是否与ISR的位置有关? 据我所知,在某些处理器中,IP = 0意味着复位地址。 但为什么一个正在运行的程序转到了这个地址?
什么都可能是导致IP指向0的原因?
基本上所有的jmp
指令和ret
都可以跳转到0.例子:
jnz 0 ;; encoded as relative jump JNZ -(next IP)
jmp 00000000 ;; absolute jump
mov ebx, 0
jmp ebx ;; indirect jump
call 0
mov ecx,0
push ecx
ret ;; jump through stack
在C中,可以(尝试)通过NULL /未初始化的函数指针以及通过破坏栈来跳转。 一些深奥的技巧是插入一个异常处理程序(信号)指向null或使用longjmp。
在x86架构(实模式)中,指向中断处理程序的指针从地址0:0开始,但不会跳到那里。 相反,表格包含要跳转到间接的'segment:offset'对。
调试方法包括用断点平分代码,直到您运行的下一条指令导致错误。 检查栈应该告诉执行的最后一个函数是什么。 有时堆栈仍然有效,以显示完整的回调跟踪。
链接地址: http://www.djcxy.com/p/14103.html