我正在研究PE解析器,只是为了学习。
正如文档所说,第一个部分标题应该紧跟在optionalheader之后,但在我的例子中,在第一个标题之前有很多空数据。
下面是我的代码,用于计算第一部分的位置:
IMAGE_NT_HEADERS* inth = get_nt_headers(buffer);
DWORD optional_headers_size = inth->FileHeader.SizeOfOptionalHeader;
DWORD calculated_ptr = (DWORD)inth + optional_headers_size;
printf("Pointer to IMAGE_NT_HEADERS: %p\n", inth);
printf("Size of optional headers: %x\n", optional_headers_size);
printf("Pointer to first section header: %p\n", calculated_ptr);
BYTE* pointer = (BYTE*)calculated_ptr;
当我迭代“指针”时,会看到很多可以为空的数据,所以它不是我需要的部分。peview或hexplorer也显示空数据。为什么?
这个“可以为空”的数据部分大约需要24个字节。
我分析的应用程序是一个简单的helloworld.exe。
我对另外一件事感到困惑。
在fileheader中,我设置了13个节的数量,但是如果我在image_optional_header中查看peview,我会看到16个节,但是最后3个节有任何分配的值,这意味着rva和大小设置为0。
这部分包括:delay_import_描述符、cli_头,但最后一部分没有任何名称。
我计算出最后三个部分的大小是24字节。
这和我之前提到的完全一样。
那么,我如何才能计算出firts image_部分的头部在哪里呢?
问题解决了,但我不确定我的解决方案。
DWORD padding = (IMAGE_NUMBEROF_DIRECTORY_ENTRIES - inth->FileHeader.NumberOfSections) * sizeof(IMAGE_DATA_DIRECTORY);
DWORD calculated_ptr = (DWORD)inth + padding + optional_headers_size;