我正在尝试为Windows编写一个exe包装器。到目前为止,我已经掌握了一些基础知识。不过,我正在阅读的部分是“BOUND IMPORT Directory Table”(或“.idata”部分?),基本上是PE文件的该部分,其中包含加载程序需要导入的DLL列表。
我想知道哪种最好的方法是:
[A]找出IAT的位置(因为针对几个不同的.exe运行PEView似乎表明此列表可以包含在多个不同的位置),然后阅读该列表
或者
[B]只要找到一种方法即可直接读取exe需要导入的DLL列表。
有没有办法做到这一点?人们对IAT应该在哪里以及如何阅读它有什么进一步的建议吗?
最佳答案
是的,您可以通过遍历可执行文件的头来找到IAT。在winnt.h
中查找标题声明。
有关如何在标题中查找信息的详细信息,请参见MSDN杂志上的Matt Pietrek的系列文章“深入了解Win32便携式可执行文件格式”,第I和II部分。
您还可以从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/