【问题标题】:Pe32 Header - DataDirectory pointer sizePe32 标头 - 数据目录指针大小
【发布时间】:2020-01-18 19:16:55
【问题描述】:

我有两个问题:

  1. Pe32 标头由许多子标头组成。其中之一是可选标题。 MSDN 说IMAGE_OPTIONAL_HEADER 的最后一个元素是指向可执行文件的第一个IMAGE_DATA_DIRECTORY 结构的指针。当我查看 NASM 的 WIN32N.INC 时,所有内容都与 MSDN 中列出的相同,不同之处在于指向第一个结构的指针大小为 8 字节而不是 4 字节(就像普通的 32 位指针):

    STRUCT IMAGE_OPTIONAL_HEADER
        .Magic RESW 1
        ...
        .DataDirectory RESQ 1 <----- why RESQ?
    ENDSTRUC
    
  2. 当我想将 NASM 中作为“变量”存储的二进制数据中的 16 个 DataDirectories 复制到结构中时:是否可以创建具有 32 个条目的结构(导出目录 RVA + 大小,导入目录 RVA + 大小等...)并让指向可选标头中第一个 DataDirectory 结构的指针指向它的开头?因为否则就没有办法从第一个元素到其他元素,不是吗?

谁能解释一下?

【问题讨论】:

    标签: pointers winapi assembly nasm portable-executable


    【解决方案1】:

    DataDirectory 是结构数组,而不是指针

    MSDN tells you那个布局其实是

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

    而您的 .INC 文件只是出于某种未知原因将其定义为 QWORD。

    SDK 中的 WinNT.h 将可选标头定义为:

      ...
      DWORD   NumberOfRvaAndSizes;
      IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
    

    IMAGE_NUMBEROF_DIRECTORY_ENTRIES 是 16。

    你不应该只复制 16 个项目,NumberOfRvaAndSizes 成员指定大小,它可以是

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多