【问题标题】:NASM Assembly Pe32 - What is the Optional Header Data Directory valueNASM 程序集 Pe32 - 什么是可选的标头数据目录值
【发布时间】:2019-12-18 10:19:10
【问题描述】:

我正在尝试从头开始重新编码现有的 EXE,但无法确定 IMAGE_OPTIONAL_HEADER 结构元素“DataDirectory”的值。

它是 Pe32 标头的一部分。

我正在使用 NASM 和 WIN32N.INC 文件。

我知道 IMAGE_OPTIONAL_HEADER 结构元素“DataDirectory”的大小为 DQ。那是因为结构“DataDirectory”具有元素“VirtualAddress”和“isize”,它们都是DD。

STRUC IMAGE_DATA_DIRECTORY
.VirtualAddress RESD 1
.isize RESD 1
ENDSTRUC

STRUC IMAGE_OPTIONAL_HEADER
.Magic RESW 1
.MajorLinkerVersion RESB 1
.MinorLinkerVersion RESB 1
.SizeOfCode RESD 1
.SizeOfInitializedData RESD 1
.SizeOfUninitializedData RESD 1
.AddressOfEntryPoint RESD 1
.BaseOfCode RESD 1
.BaseOfData RESD 1
.ImageBase RESD 1
.SectionAlignment RESD 1
.FileAlignment RESD 1
.MajorOperatingSystemVersion RESW 1
.MinorOperatingSystemVersion RESW 1
.MajorImageVersion RESW 1
.MinorImageVersion RESW 1
.MajorSubsystemVersion RESW 1
.MinorSubsystemVersion RESW 1
.Reserved1 RESD 1
.SizeOfImage RESD 1
.SizeOfHeaders RESD 1
.CheckSum RESD 1
.Subsystem RESW 1
.DllCharacteristics RESW 1
.SizeOfStackReserve RESD 1
.SizeOfStackCommit RESD 1
.SizeOfHeapReserve RESD 1
.SizeOfHeapCommit RESD 1
.LoaderFlags RESD 1
.NumberOfRvaAndSizes RESD 1
.DataDirectory RESQ 1
ENDSTRUC

那么,DataDirectory 元素的确切值是多少?数据目录的数量远不止一个。如导出目录 RVA + 大小、导入目录 RVA + 大小等。

我是否只是将第一个虚拟地址的偏移量放在“VirtualAddress”中,并将其大小放在“isize”中?这是我的猜测,但我不确定。

【问题讨论】:

    标签: winapi assembly x86 nasm


    【解决方案1】:

    它是IMAGE_DATA_DIRECTORY 结构的数组。 MSDN 告诉你结构是什么样的:

    typedef struct _IMAGE_DATA_DIRECTORY {
      DWORD VirtualAddress;
      DWORD Size;
    } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
    

    NumberOfRvaAndSizes 字段告诉您有多少。通常为 16 个,但也可以更少。

    每个目录都会告诉你它们“指向”的东西的偏移量和大小。 IMAGE_DIRECTORY_ENTRY_* 定义告诉您它们是什么。例如,IMAGE_DIRECTORY_ENTRY_DEBUG 是 6,它告诉您IMAGE_DEBUG_DIRECTORY 的位置以及它的总大小和它的数据。

    有关详细信息,请参阅 PE/COFF format documentation 和 Matt Pietrek “An In-Depth Look into the Win32 Portable Executable File Format”和“Peering Inside the PE: A Tour of the Win32 Portable Executable File Format” MSDN/MSJ 文章。

    【讨论】:

      【解决方案2】:

      每个条目都包含一个 RVA 和大小。
      最重要的是:
      索引 0 [导出目录] 处的那个,
      索引 1 [导入目录] 处的那个,
      索引 5 [重定位表]处的那个。

      现在,根据您尝试实现的目标,此表可能对您完全无用。
      事实上,它是加载器的一种“快捷方式”,允许它快速查找特定部分的数据,而无需之前迭代所有节头表的内容。因此,它实际上只对执行时间有用。如果您只想检查 PE 文件而不将其加载到虚拟内存中,它不会提供任何有用的信息。

      正如 Anders 已经说过的,通常有 16 个,尽管在我目前正在研究的 PE 文件中,我只能找到 10 个(正如字段 NumberOfRvaAndSizes 告诉我的那样,基本上是 optionla 标头的最后一个条目,你叫它.DataDirectory 并且似乎发现它是一个QUADWORD,但它应该真的是一个DOUBLEWORD。至少如果我正确解释您的RESQ条目)。

      编辑:原来确实有 16 个条目,因为值“10”是十六进制形式...

      【讨论】:

        猜你喜欢
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多