【发布时间】:2013-01-08 00:26:50
【问题描述】:
我一直在网上搜索试图找到这个问题的答案,但它似乎在逃避我。在问这个问题之前,我已经咨询了以下来源。
- http://www.csn.ul.ie/~caolan/publink/winresdump/winresdump/doc/pefile.html
- http://msdn.microsoft.com/en-us/magazine/cc301805.aspx
我了解 PE 格式(或者至少我认为我了解)。使用命令行调试器 (cdb),我希望能够反汇编 RVA 所在的地址,以查看第一个调用是什么。对于本机应用程序(如记事本),我希望看到 notepad!WinMainCRTStartup,对于 .NET 应用程序,我希望看到 CLR 的 jmp 命令。
以记事本为例,我在上面执行了dumpbin /headers,得到的入口点值为3570。当我执行 cdb notepad 并执行此命令 - u [内存中的基地址]+0x3570 - 我没有收到 WinMainCRTStartup 调用。
我是否误解了 dumpbin 的 PE 输出?我如何才能确切地知道在内存中的何处查找应用程序的启动功能?
编辑(1/7/13):我忘了提到我在 64 位 Windows 7 上运行它。如果我尝试在 Windows XP 模式下使用 cdb(从一个 32 位操作系统),反汇编我从 PE 文件分析中获得的 AddressOfEntryPoint 让我得到了对 WinMainCRTStartup 的调用,正如我所期望的那样。换句话说,我被告知要查看的确切地址包含我认为在 32 位操作系统中应该看到的地址。在 64 位机器上运行应用程序真的会有这么大的不同吗?
只是为了增加复杂性,如果我在 cdb 的 64 位操作系统中对 ImageBaseAddress 执行 !dh,我会得到我需要使用的 EXACT AddressOfEntryPoint。
【问题讨论】:
标签: debugging windbg portable-executable