我们如何在 PE 文件中获取 IMAGE_IMPORT_BY_NAME STRUCT 中的提示?

How we can get Hint in IMAGE_IMPORT_BY_NAME STRUCT in PE file?

我正在尝试编写 python 脚本以从导入 table 中提取信息。我设法获取了每个 dll 导入的函数名称。但是我不确定如何访问提示。 有什么建议吗?

我假设您有一个指向 32 位模块的 IMAGE_THUNK_DATA 结构的指针(或 PE32+ 的 IMAGE_THUNK_DATA64),因为您已经在枚举名称,所以我们将从那里开始覆盖基地。 我还假设您正在处理 32 位模块,因为您没有另外指定。

IMAGE_THUNK_DATA 数组只是一个 DWORD 数组,每个 DWORD 代表一个导入函数。要知道函数是按名称而不是序号导入的,您必须检查 DWORD 中未设置最高位(即 0x80000000)。

1> 如果设置了 high-bit,则 DWORD 的值与 0xFFFF(仅取低位字)相乘后的值就是序数(也是 "hint" 的值)。因此该函数是按序号导入的,没有可用的名称。

2> 如果未设置 high-bit,则整个 DWORD 是指向 IMAGE_IMPORT_BY_NAME 结构的 RVA(指向内存映像的指针,没有基数)。如果您从文件图像中读取,则必须将 RVA 转换为文件偏移量。我还假设您已经这样做了,否则您将没有导入的函数名称。 IMAGE_IMPORT_BY_NAME结构在winnt.h中定义如下:

typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;
    BYTE    Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

注意:Name处指定的BYTE当然只是标记导入函数名字符数组的开始,因为名称可以大于一个字符。

第一个单词是提示,如果您已经知道名字,则可以跳过。您是否可以显示您遇到问题的代码片段?