【发布时间】:2019-09-02 13:05:56
【问题描述】:
因此,为了解析PE进程内存中的IAT表并获取导入函数的名称,我们必须遍历每个模块的函数,并且对于每个模块,使用thunkData->u1.AddressOfData + 2 到函数名称字符串的开头(我不想开始解释这些指针是什么,因为我假设知道答案的任何人都已经知道这一点。并且 u1 是 Windows 具有的预定义结构并且它总是里面有 AddressOfData)
所以基本上对于 IAT 中的每个函数,我们都必须使用 u1.AddressOfData + 2 来获取字符串的开头地址,但我不知道它的开头 2 个字节是什么?微软文档没有解释这一点:
https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
(查找延迟导入名称表)
我尝试调试它并查看它们开头的值是什么,它们是 0x8600 和 0xe700 之类的东西,所以通常是 1 个字节的数据和 1 个字节的 00
这是什么?
【问题讨论】:
-
这是
IMAGE_IMPORT_BY_NAME- 第一个WORD(2 个字节)是Hint(在导入的模块的导出表中的提示索引)。真的这已经过时了。提示几乎总是包含错误值 -
那么提示是这个函数被加载的模块的导出表的索引吗?为什么它总是包含错误的值,这是否意味着这2个字节是无用的,从未使用过?
-
是的,这个字节没用。需要寻找当前的加载器实现 - 可能会使用,也可能不会。 Hint 是从哪里得到的?来自您在构建 pe 时使用的 lib。真正更新了系统映像(移动到下一个 Windows 版本时的最小值),导出表更改,索引更改。关于练习 提示通常是错误的。但这不会导致错误 - 这只是快速检查,如果未命中 - 按名称转到二进制搜索正确索引
标签: c windows winapi portable-executable