【问题标题】:How to find offset of Dword where Address Of entry point of an executable is stored如何找到存储可执行文件入口点地址的 Dword 偏移量
【发布时间】:2011-11-20 16:10:54
【问题描述】:

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

我读了很多关于PE文件here

但还是想不通。需要帮助

【问题讨论】:

    标签: exe portable-executable entry-point


    【解决方案1】:

    AddressOfEntryPoint 的偏移量将是其前面部分的大小之和:sizeof(IMAGE_DOS_HEADER)+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)+sizeof(WORD)+sizeof(BYTE)+sizeof(BYTE)+sizeof(DWORD) +sizeof(DWORD)+sizeof(DWORD)

    【讨论】:

      【解决方案2】:

      嗯,看起来@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 机器上的定义也不同。

      【讨论】:

        猜你喜欢
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-02
        • 1970-01-01
        • 2023-03-14
        • 2016-02-16
        • 2016-04-08
        相关资源
        最近更新 更多