用od调试程序时经常会遇到这样的情况,程序中断在一个函数的入口点
od会把所有调用这个函数的地址列出来,但有时候调用这个函数的地方太多了
我想问的是:如何精确的确定本次执行的到底是哪个地址调用了这个函数?我现在是run跟踪确定,或者一个一个的试,但感觉都不是很方便,高手有更好的方法吗?指点一下啊,非常感谢

  • 标 题:答复
  • 作 者:softworm
  • 时 间:2008-02-21 19:28

有个ring3的插件Conditional Branch Logger,我更喜欢ring0的DebugCtlMSR,openrce上有讨论.

Hook int1:

 

代码:
__declspec(naked) void NewInt01()
{
  //  - Interrupt 1 Handler -
  //
  //  offset   | contains
  //  ---------+-----------------------------
  //  esp     : EIP Context
  //  esp + 4  : CS  Context
  //  esp + 8  : EFLAGS Context

  __asm
  {
      pushad

      mov    eax, dr6
      bt    eax, 0Eh  //单步?
      jnc    __oldint01

      mov    ecx, 1D9h
      rdmsr
      or    eax, 3
      wrmsr
    
      
    __oldint01:  
      popad
      jmp    OldHandler01
  }
}
在OD中trace时记录的只有控制转移指令