调用堆栈和反汇编怀疑

ana*_*and 2 debugging assembly windbg visual-studio

三个疑点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  
Run Code Online (Sandbox Code Playgroud)

现在每个函数末尾提到的字节是什么?就像第一个语句一样,什么是0x28字节.

2)如何在VS中的windows系统dll上放置断点?在windbg中,我可以搜索windows系统dll的特定功能

>x wininet!*funcA*
Run Code Online (Sandbox Code Playgroud)

使用此命令,我可以获取此函数的地址并可以放置断点.我可以在Visual Studio中执行相同的操作吗?

3)我没有dll的Symbol文件.我在反汇编中得到的调用堆栈是

7814XXX0  call        dword ptr [__imp__WindowsFuncA@32 (781EXXXXh)] 
Run Code Online (Sandbox Code Playgroud)

什么是__imp__上面调用栈?这是否意味着这个windows函数被挂钩到其他一些dll?

Ric*_*dle 9

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

2)在New Breakpoint对话框中输入这样的内容:

{,,user32.dll}_SendMessageW@16
Run Code Online (Sandbox Code Playgroud)

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

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