PE部分数据

时间:2014-05-06 15:15:19

标签: c winapi

我有一个可移植的可执行文件(.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文件中一个部分的信息,例如其属性和虚拟偏移量。请记住,section的数量是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)。

我必须提到缓冲区变量是我读取PE数据的地方。

1 个答案:

答案 0 :(得分:3)

您需要使用SizeOfOptionalHeader值跳过可选标头。不要依赖于固定尺寸。 winnt.h有一个你应该使用的宏:

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