我正在尝试为Windows编写一个exe包装器。到目前为止,我已经掌握了一些基础知识。不过,我正在阅读的部分是“BOUND IMPORT Directory Table”(或“.idata”部分?),基本上是PE文件的该部分,其中包含加载程序需要导入的DLL列表。

我想知道哪种最好的方法是:

[A]找出IAT的位置(因为针对几个不同的.exe运行PEView似乎表明此列表可以包含在多个不同的位置),然后阅读该列表

或者

[B]只要找到一种方法即可直接读取exe需要导入的DLL列表。

有没有办法做到这一点?人们对IAT应该在哪里以及如何阅读它有什么进一步的建议吗?

最佳答案

是的,您可以通过遍历可执行文件的头来找到IAT。在winnt.h中查找标题声明。

有关如何在标题中查找信息的详细信息,请参见MSDN杂志上的Matt Pietrek的系列文章“深入了解Win32便携式可执行文件格式”,第III部分。

您还可以从here获得实际的Microsoft PE规范。

TL; DR:基本上,查找顺序如下:

  • 从二进制的基地址开始。那是一个IMAGE_DOS_HEADER结构。
  • 按照e_lfanew字段进入IMAGE_NT_HEADERS结构。
  • 按照OptionalHeader进入IMAGE_OPTIONAL_HEADER结构(尽管它的名字,它不再是可选的)。
  • 跟随DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]IMAGE_IMPORT_DESCRIPTOR结构的数组。每个导入的DLL都有一个条目。该数组中的最后一个条目将被清零。
  • 每个条目中的Name字段是一个RVA,它指向DLL的名称。 FirstThunk字段是指向该DLL的IAT的RVA,该IAT是IMAGE_THUNK_DATA结构的数组。
  • 关于c - PE格式-IAT问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7673754/

    10-14 12:06