【问题标题】:call stack and disassembly doubt调用栈和反汇编疑问
【发布时间】:2009-06-17 11:33:11
【问题描述】:

三个疑惑 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挂钩?

【问题讨论】:

    标签: visual-studio debugging assembly windbg


    【解决方案1】:

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

    2) 在 New Breakpoint 对话框中输入如下内容:

    {,,user32.dll}_SendMessageW@16
    

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

    3) __imp__ 指的是 DLL 导入表 - 当前模块中的代码通过 JMP 重定向到真正的 Windows DLL 中,__imp__ 符号指的是JMP。这些JMPs 存在于进行调用的 DLL 或 EXE 中的表中。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        2 & 3 - 不知道。对不起。

        【讨论】:

        • 同意,但将“line”替换为“instruction”
        猜你喜欢
        • 2018-04-28
        • 2014-05-29
        • 2010-11-04
        • 2013-04-11
        • 1970-01-01
        • 2014-07-12
        • 2013-05-17
        • 1970-01-01
        • 2011-07-23
        相关资源
        最近更新 更多