2

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

4

3 回答 3

9

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

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

{,,user32.dll}_SendMessageW@16

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

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

于 2009-06-17T11:37:56.343 回答
1

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

于 2009-06-17T11:36:11.497 回答
0

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

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

于 2009-06-17T11:36:04.430 回答