我正在尝试 PE 格式的代码示例,但有一部分代码看起来像这样
auto iatArr = (IMAGE_THUNK_DATA*)(exeBuf + offset_impAddrArr);
for (int i = 0; i < len_iatCallVia; iatArr++,i++) {
if (auto nameRVA = iatArr->u1.Function) {
PIMAGE_IMPORT_BY_NAME k = (PIMAGE_IMPORT_BY_NAME)(exeBuf + rvaToOffset(exeBuf, nameRVA));
printf("[+] imported API -- %s (hint = %i)\n", &k->Name, k->Hint);
}
}
所以问题是我想知道为什么作者使用“Function”字段而不是AddressOfData,因为我认为Function字段存储了函数的地址,那么为什么地址可以直接转换为PIMAGE_IMPORT_BY_NAME??
我用谷歌搜索了一些关于 IMAGE_THUNK_DATA 和 IAT 之类的结构的信息,但我发现的只是人们关注如何使用 IAT,我唯一发现有点用处的是here 它告诉了
DWORD Function; // Memory address of the imported function
DWORD AddressOfData; // RVA to an IMAGE_IMPORT_BY_NAME with the imported API name
'AddressOfData
'列将RVA存储到'IMAGE IMPORT BY NAME'
结构中,其中包含导入的API名称,而'Function'
字段保存导入函数的RVA。 'AddressOfData'
属性提供导入 API 的名称和提示,而 'Function'
字段标识正在导入的实际函数。