有像CFF资源管理器这样的反汇编程序,它显示任何可执行文件的AddressOfEntryPoint
以及存储它的偏移量。我知道如何找到它(IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint
),但我希望能够以编程方式在PE exe文件中找到存储AddressOfEntryPoint的偏移量。
我已经阅读了很多关于PE文件here
的文章但仍然无法弄明白。需要帮助
答案 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机器上的定义不同。