代码之家  ›  专栏  ›  技术社区  ›  anand

调用堆栈和反汇编疑问

  •  2
  • anand  · 技术社区  · 16 年前

    三大疑点 1) 假设我得到如下的调用堆栈

        user32.dll!_InternalCallWinProc@20()  + 0x28 bytes  
    user32.dll!_UserCallWinProcCheckWow@32()  + 0xb7 bytes  
    user32.dll!_CallWindowProcAorW@24()  + 0x51 bytes   
    user32.dll!_CallWindowProcW@20()  + 0x1b bytes  
    

    现在,每个函数末尾提到的字节是什么?和第一个语句一样,什么是0x28字节。

    2)如何将断点放在VS中的Windows系统DLL上? 在windbg中,我可以搜索Windows系统dll的特定函数

    >x wininet!*funcA*
    

    使用此命令,我可以获取此函数的地址,并可以放置断点。 在Visual Studio中也可以这样做吗?

    3)我没有dll的符号文件。我要进行反汇编的调用堆栈是

    7814XXX0  call        dword ptr [__imp__WindowsFuncA@32 (781EXXXXh)] 
    

    是什么 __imp__ 在上面的调用堆栈中?这是否意味着这个windows函数被挂接到了其他的dll?

    3 回复  |  直到 16 年前
        1
  •  9
  •   RichieHindle    16 年前

    1) 它们是在该堆栈帧中执行的指令相对于函数开头的字节偏移量。

    2) 在“新建断点”对话框中输入类似的内容:

    {,,user32.dll}_SendMessageW@16
    

    何处 16 是函数期望的参数字节数(在Win32中,这几乎总是参数数的4倍)。这个 W 引用API的Unicode版本;使用 A 如果您正在调试一个ANSI应用程序。

    3) __imp__ 引用dll导入表-当前模块中的代码通过 JMP 在真正的Windows DLL中, γ-干扰素 符号是指 JMP . 这些 JMP s位于进行调用的dll或exe中的表中。

        2
  •  1
  •   Alex Taylor    16 年前

    对于问题的第一部分,所提到的字节偏移量是在执行期间函数中的位置,这导致了随后在堆栈中更高的调用。

        3
  •  0
  •   pauljwilliams    16 年前

    1)它们是从函数开始到创建堆栈跟踪时正在执行的行的偏移量。

    2&3-邓诺。对不起的。