我正在尝试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
1条答案
按热度按时间vlurs2pr1#
使用哪个字段并不重要,因为
IMAGE_THUNK_DATA
结构将其元素封装在一个联合体中,并且所有字段都是DWORD
的类型,即4字节有符号整数。IMAGE_THUNK_DATA32
的定义:当你解析原始的
IAT
时,它包含了RVA
s到IMAGE_IMPORT_BY_NAME
结构数组的元素,你应该引用字段AddessOfData
,当你解析包含实际函数地址的IAT
时,你应该引用字段Function
。