gpt4 book ai didi

c - OptionalHeader 后为空数据

转载 作者:行者123 更新时间:2023-11-30 16:29:26 25 4
gpt4 key购买 nike

我正在研究 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 和 Size 设置为 0。这部分是:DELAY_IMPORT_DESCRIPTORS、CLI_HEADER,但最后一个没有任何名称。

我算了一下最后这三个部分的大小是24字节。这和我之前提到的完全一样。

那么我如何计算出第一个 IMAGE_SECTION_HEADER 到底在哪里?

问题已解决,但我不确定我的解决方案。

DWORD padding = (IMAGE_NUMBEROF_DIRECTORY_ENTRIES - inth->FileHeader.NumberOfSections) * sizeof(IMAGE_DATA_DIRECTORY);
DWORD calculated_ptr = (DWORD)inth + padding + optional_headers_size;

最佳答案

首先 - 永远不要使用DWORD到位指针。这是错误。 DWORD当指针为 4 或 8 时,始终为 4 字节大小。代码如下

DWORD calculated_ptr = (DWORD)inth + optional_headers_size;

总是错的。您可以使用DWORD_PTR (这正是指针的大小)而不是 DWORD .

然后SizeOfOptionalHeader IMAGE_OPTIONAL_HEADER 的大小很容易理解这是 IMAGE_NT_HEADERS一部分 。但像这样的代码

DWORD_PTR calculated_ptr = (DWORD_PTR)inth + inth->FileHeader.SizeOfOptionalHeader;使用SizeOfOptionalHeader大小为IMAGE_NT_HEADERS 。你只是混淆了 IMAGE_NT_HEADERS 的大小大小为IMAGE_OPTIONAL_HEADER

所以正确的解决方案是

    PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)(
(ULONG_PTR)&inth->OptionalHeader + inth->FileHeader.SizeOfOptionalHeader);

需要添加SizeOfOptionalHeaderinth (PIMAGE_NT_HEADERS 的地址)但是到 &inth->OptionalHeader

或者更好地使用PIMAGE_SECTION_HEADER pish = IMAGE_FIRST_SECTION(inth);

IMAGE_FIRST_SECTION - 这是 winnt.h 中定义的就绪宏与 (PIMAGE_SECTION_HEADER)((ULONG_PTR)&inth->OptionalHeader + inth->FileHeader.SizeOfOptionalHeader); 具有相同的效果(产生相同的代码)

关于c - OptionalHeader 后为空数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com