我有一个可移植可执行(,.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 )。
我必须指出,缓冲区变量是我读取PE数据的地方。
发布于 2014-05-06 15:41:19
您需要使用SizeOfOptionalHeader值跳过可选的标头。不要依赖它是固定的大小。winnt.h有一个宏,您应该使用:
#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \
((ULONG_PTR)(ntheader) + \
FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
((ntheader))->FileHeader.SizeOfOptionalHeader \
))https://stackoverflow.com/questions/23498583
复制相似问题