windows IMAGE_THUNK_DATA结构中函数字段和AddressOfData字段的区别?

j9per5c4  于 2023-04-13  发布在  Windows
关注(0)|答案(1)|浏览(107)

我正在尝试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
vlurs2pr

vlurs2pr1#

使用哪个字段并不重要,因为IMAGE_THUNK_DATA结构将其元素封装在一个联合体中,并且所有字段都是DWORD的类型,即4字节有符号整数。
IMAGE_THUNK_DATA32的定义:

typedef struct _IMAGE_THUNK_DATA32
{
    union
    {
        DWORD ForwarderString;
        DWORD Function;
        DWORD Ordinal;
        DWORD AddressOfData;
    }u1;
}IMAGE_THUNK_DATA32;

当你解析原始的IAT时,它包含了RVA s到IMAGE_IMPORT_BY_NAME结构数组的元素,你应该引用字段AddessOfData,当你解析包含实际函数地址的IAT时,你应该引用字段Function

相关问题