代码之家  ›  专栏  ›  技术社区  ›  bielu000

OptionalHeader后的空数据

  •  0
  • bielu000  · 技术社区  · 6 年前

    我正在研究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;
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   RbMm    6 年前

    DWORD

    DWORD calculated_ptr = (DWORD)inth + optional_headers_size;

    DWORD_PTR

    SizeOfOptionalHeader IMAGE_OPTIONAL_HEADER IMAGE_NT_HEADERS

    DWORD_PTR calculated_ptr = (DWORD_PTR)inth + inth->FileHeader.SizeOfOptionalHeader;

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

    inth 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);