体育节数据

cha*_*qus 0 c winapi

我有一个 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 数据的地方。

Igo*_*sky 5

您需要使用该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)