有像CFF explorer这样的反汇编器,它显示任何可执行文件的AddressOfEntryPoint
及其存储位置的偏移量。我知道如何找到(IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint
),但我希望能够在存储AddressOfEntryPoint的PE exe文件中以编程方式找到偏移量。
我在这里读了很多关于PE文件的内容
但还是想不明白。帮助需要
AddressOfEntryPoint
的偏移量将是其前面部分的大小之和:sizeof(IMAGE_DOS_HEADER)
+ sizeof(DWORD)
+ sizeof(IMAGE_FILE_HEADER)
+ sizeof(WORD)
+ sizeof(BYTE)
+ sizeof(BYTE)
+ sizeof(DWORD)
+ sizeof(DWORD)
+ sizeof(DWORD)
看起来@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机器上的定义也不同。