如何在 RAW 内存中找到 (PE) 可执行入口点?

How to find a (PE)Executable entry point in RAW memory?

我正在做一个 ASM 项目,我想知道 portable executable 程序在原始内存中的入口点。原始内存是指静态内存,就像我正在使用十六进制编辑器编辑原始 .exe 文件一样。从程序的 PE table 我可以查找名为 "EntryPoint:" 的条目,但该条目一旦加载到内存中就包含程序的入口点!我需要找到程序将在磁盘中的原始内存中查找第一条指令的位置。有些程序从 .text 部分的第一个地址开始执行,这很常见但并不总是发生,这就是为什么我想知道入口点。

为了解决这个问题,我使用了 windows API 中的函数 MapViewOfFile 并在内存中加载了一个 example.exe 程序,然后寻找它的原始内容。

我目前正在使用 Radasm 使用 MASM

谢谢!

入口点由 PE header 中的 AddressOfEntryPoint 给出,它为您提供了入口点的 virtual 地址。如果您想找出文件中的位置,您需要浏览 table 部分并找出哪个部分包含该虚拟地址——即带有 VirtualAddress 和 [= 的部分12=] 这样 AddressOfEntryPoint >= VirtualAddress 并且偏移量 AddressOfEntryPoint - VirtualAddress < VirtualSize.

找到后,只需计算 PointerToRawData + 偏移量即可确定它在文件中的位置。