我有一个 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
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好。我找到了这个:
节表:紧跟在 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));
Run Code Online (Sandbox Code Playgroud)
pSection 的地址为 NULL ( 0 )。
我不得不提到缓冲区变量是我读取 PE 数据的地方。
您需要使用该SizeOfOptionalHeader值来跳过可选标题。不要依赖它是固定大小的。winnt.h有一个你应该使用的宏:
#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \
((ULONG_PTR)(ntheader) + \
FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
((ntheader))->FileHeader.SizeOfOptionalHeader \
))
Run Code Online (Sandbox Code Playgroud)