C语言 u1 开头的 2 个字节是什么.PE 文件的内存映射 IAT 中的数据地址?



因此,为了解析 PE 进程内存中的 IAT 表并获取导入函数的名称,我们必须遍历每个模块的函数,并为每个模块使用 thunkData->u1。AddressOfData + 2 到达函数名称字符串的开头(我不想开始解释这些指针是什么,因为我假设任何知道答案的人都已经知道这一点。 u1 是 Windows 具有的预定义结构,并且始终包含 AddressOfData(

所以基本上对于IAT中的每个函数,我们都必须使用U1。AddressOfData + 2 获取字符串开头的地址,但我不明白它的开头 2 个字节是什么?Microsoft文档没有解释这一点:

https://learn.microsoft.com/en-us/windows/win32/debug/pe-format

(查找延迟导入名称表(

我尝试调试它并查看它们开头的值是什么,它们是 0x8600 和 0xe700 之类的东西,所以通常是 1 个字节的数据和一个字节的 00

那么这是什么呢?

IMAGE_THUNK_DATA结构中,如果函数地址尚未解析且函数未按序号捕捉 -AddressOfData指向PIMAGE_IMPORT_BY_NAME(如果在 winnt.h 和/或ntimage.h中查找,则可见(

typedef struct _IMAGE_IMPORT_BY_NAME {
USHORT  Hint;
CHAR   Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

名称前的前 2 个字节 - 这是AddressOfNames- 导出名称表中的提示索引(查找IMAGE_EXPORT_DIRECTORY(。 此名称表按字母顺序排序,以便按名称进行快速二叉搜索功能。用于快速检查的提示,然后进入二进制搜索。如何使用它可以在wrkSRC 代码中查看

//
// Lookup Name in NameTable
//
NameTableBase = (PULONG)((PCHAR)DllBase + (ULONG)ExportDirectory->AddressOfNames);
NameOrdinalTableBase = (PUSHORT)((PCHAR)DllBase + (ULONG)ExportDirectory->AddressOfNameOrdinals);
//
// Before dropping into binary search, see if
// the hint index results in a successful
// match. If the hint index is zero, then
// drop into binary search.
//
HintIndex = ((PIMAGE_IMPORT_BY_NAME)NameThunk->u1.AddressOfData)->Hint;
if ((ULONG)HintIndex < ExportDirectory->NumberOfNames &&
!strcmp((PSZ)((PIMAGE_IMPORT_BY_NAME)NameThunk->u1.AddressOfData)->Name,
(PSZ)((PCHAR)DllBase + NameTableBase[HintIndex]))) {
OrdinalNumber = NameOrdinalTableBase[HintIndex];
}
else {
//
// Lookup the import name in the name table using a binary search.
//

但是,此索引通常只能在系统映像中有效。 如果我们自己构建映像 - 在最佳投射中,此提示只能对一个 Windows 版本有效(我们从lib文件中获得了提示( - 当新版本窗口创建时 - 通常会添加新的导出 API,因为表格按字母顺序排序 - 索引[可以]更改

最新更新