调用堆栈和反汇编怀疑

时间:2009-06-17 11:33:11

标签: visual-studio debugging assembly windbg

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

3 个答案:

答案 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 - 不知道。遗憾。