【问题标题】:PE Section Data体育部分数据
【发布时间】:2014-05-06 15:15:19
【问题描述】:

我有一个 Portable Executable ( .exe ) 文件,我想检索它的部分。我确实喜欢这样:

IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*) buffer; // DOS Header
IMAGE_NT_HEADERS* pNTHeaders = (IMAGE_NT_HEADERS*) ((BYTE *) pDOSHeader + pDOSHeader->e_lfanew); // PE Header   

到目前为止一切都很好。我发现了这个:

节表:紧跟在 PE 头之后。它是一个 IMAGE_SECTION_HEADER 结构的数组,每个结构都包含有关 PE 文件中一个部分的信息,例如其属性和虚拟偏移量。请记住,节数是 FileHeader 的第二个成员(从 PE 头开始的 6 个字节)。如果 PE 文件中有 8 个节,则表中将有 8 个此结构的重复项。每个头结构都是 40 字节,它们之间没有“填充”。

现在,当我这样做时:

IMAGE_SECTION_HEADER* pSection = (IMAGE_SECTION_HEADER*) (pNTHeaders->FileHeader.PointerToSymbolTable);

或:

IMAGE_SECTION_HEADER* pSection = (IMAGE_SECTION_HEADER*) ((BYTE *) pNTHeaders + sizeof(IMAGE_NT_HEADERS));

pSection 的地址为 NULL ( 0 )。

我不得不提到 buffer 变量是我读取 PE 数据的地方。

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    您需要使用SizeOfOptionalHeader 值来跳过可选标题。不要依赖它是固定大小的。 winnt.h 有一个你应该使用的宏:

    #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)  \
        ((ULONG_PTR)(ntheader) +                                      \
         FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +           \
         ((ntheader))->FileHeader.SizeOfOptionalHeader   \
        ))
    

    【讨论】:

      猜你喜欢
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多