如何找到Dword的偏移量,其中存储了可执行文件的入口点的地址

时间:2011-11-20 16:10:55

标签: exe portable-executable entry-point

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

我已经阅读了很多关于PE文件here

的文章

但仍然无法弄明白。需要帮助

2 个答案:

答案 0 :(得分:2)

AddressOfEntryPoint的偏移量将是其前面各个部分的大小的总和:sizeof(IMAGE_DOS_HEADER) + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + sizeof(WORD) + { {1}} + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(DWORD)

答案 1 :(得分: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机器上的定义不同。