如何查找存储可执行文件入口点地址的Dword偏移量



有像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机器上的定义也不同。

最新更新