1

有像 CFF explorer 这样的反汇编程序,它显示AddressOfEntryPoint任何可执行文件的位置以及存储它的偏移量。我知道如何找到那个 ( IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint),但我希望能够以编程方式找到存储 AddressOfEntryPoint 的 PE exe 文件中的偏移量。

我在这里阅读了很多关于 PE 文件的信息

但还是想不通。需要帮助

4

2 回答 2

2

的偏移量AddressOfEntryPoint将是其前面部分的大小之和:sizeof(IMAGE_DOS_HEADER)+ sizeof(DWORD)+ sizeof(IMAGE_FILE_HEADER)+ sizeof(WORD)+ sizeof(BYTE)+ sizeof(BYTE)+ sizeof(DWORD)+ sizeof(DWORD)+sizeof(DWORD)

于 2011-11-20T17:09:13.313 回答
1

好吧,看起来@JosephH 写了正确的答案,但是这个答案并不正确,而且一点也不好看。

要获得 EP,您需要将文件作为二进制文件读取(并非所有文件都需要)。

所以假设你有unsigned char* data;哪些指向二进制信息。

IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER *)data;                       //cast it to DOS header (some calls it MZ header)
IMAGE_NT_HEADERS* peHeader = (IMAGE_NT_HEADERS *)&data[dosHeader->e_lfanew];  //find NT header (PE header)
DWORD ep = 0;
if (peHeader->Magic == 0x10b)  //32-bit executable
    ep = ((IMAGE_NT_HEADERS32 *)peHeader)->OptionalHeader.AddressOfEntryPoint;  //Get EP
else  //64-bit executable
    ep = ((IMAGE_NT_HEADERS64 *)peHeader)->OptionalHeader.AddressOfEntryPoint;  //Get EP

我认为我的答案更好,因为它更能自我解释,而且你不能相信偏移量,因为结构会不时改变。如您所见,即使IMAGE_NT_HEADERS我使用的在 x86 和 x64 机器上的定义也不同。

于 2015-03-16T10:35:23.913 回答