三疑 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?
最佳答案
1) 它们是在该堆栈帧中执行的指令相对于函数开始的字节偏移量。
2) 在“新建断点”对话框中输入如下内容:
{,,user32.dll}_SendMessageW@16
其中 16
是函数期望的参数字节数(在 Win32 中,这几乎总是参数数的 4 倍)。 W
指的是 API 的 Unicode 版本;如果您正在调试 ANSI 应用程序,请使用 A
。
3) __imp__
引用 DLL 导入表 - 当前模块中的代码通过 JMP
重定向到真正的 Windows DLL ,而 __imp__
符号指的是 JMP
。这些 JMP
存在于进行调用的 DLL 或 EXE 中的表中。
关于visual-studio - 调用栈和反汇编疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006468/