三个疑惑 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的Symbol文件。我在反汇编中得到的调用堆栈是
7814XXX0 call dword ptr [__imp__WindowsFuncA@32 (781EXXXXh)]
上述调用堆栈中的__imp__
是什么?这是否意味着这个windows函数被挂钩到其他一些dll?
答案 0 :(得分:9)
1)它们是相对于函数开头的堆栈帧中正在执行的指令的字节偏移量。
2)在New Breakpoint对话框中输入类似的内容:
{,,user32.dll}_SendMessageW@16
其中16
是函数期望的参数的字节数(在Win32中,这几乎总是参数数量的4倍)。 W
指的是API的Unicode版本;如果您正在调试ANSI应用程序,请使用A
。
3) __imp__
引用DLL导入表 - 当前模块中的代码通过JMP
重定向到真正的Windows DLL中,{{1 }}符号表示__imp__
。这些JMP
存在于DLL或EXE中的一个表中进行调用。
答案 1 :(得分:1)
对于问题的第一部分,提到的字节偏移量是执行期间函数中的位置,导致后续调用在堆栈中更高。
答案 2 :(得分:0)
1)它们是从函数开始到创建堆栈跟踪时执行的行的偏移量。
2& 3 - 不知道。遗憾。