有像 CFF explorer 这样的反汇编程序,它显示AddressOfEntryPoint
任何可执行文件的位置以及存储它的偏移量。我知道如何找到那个 ( IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint
),但我希望能够以编程方式找到存储 AddressOfEntryPoint 的 PE exe 文件中的偏移量。
但还是想不通。需要帮助
有像 CFF explorer 这样的反汇编程序,它显示AddressOfEntryPoint
任何可执行文件的位置以及存储它的偏移量。我知道如何找到那个 ( IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint
),但我希望能够以编程方式找到存储 AddressOfEntryPoint 的 PE exe 文件中的偏移量。
但还是想不通。需要帮助
的偏移量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 机器上的定义也不同。