我有一个可移植的可执行文件(.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数据的地方。
答案 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 \
))