调用堆栈和拆卸疑问(call stack and disassembly doubt)

2019-09-16 10:20发布

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

现在什么都在每个函数的末尾提到的字节? 像第一个发言的是0×28字节。

2)如何把断点在VS Windows系统的dll? 在WinDbg中,我可以搜索Windows系统DLL的特定功能

>x wininet!*funcA*

与此命令我能得到这个函数的地址,并可以把断点。 我可以做同样在Visual Studio?

3)我没有一个dll的符号文件。 我在拆卸变得调用堆栈

7814XXX0  call        dword ptr [__imp__WindowsFuncA@32 (781EXXXXh)] 

什么是__imp__上面调用栈? 这是否意味着这个窗口功能被钩到一些其他的dll?

Answer 1:

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

2)进入这样的事情到新建断点对话框:

{,,user32.dll}_SendMessageW@16

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

3) __imp__指DLL导入表-当前模块中的代码经由重定向JMP到真正的Windows DLL,并且__imp__符号指JMP 。 这些JMP小号住在一个表中的DLL或EXE进行调用。



Answer 2:

对于你的问题的第一部分,提到的字节偏移是在执行过程中的作用,导致后续调用堆栈中的较高位置。



Answer 3:

1)他们是从功能到创建堆栈跟踪时所执行行的开始的偏移量。

2和3 - 说不上。 抱歉。



文章来源: call stack and disassembly doubt