我正在尝试编写 python 脚本来从导入表中提取信息。我设法获取了每个 dll 导入的函数名称。但是我不确定如何访问提示。有什么建议吗?
1 回答
我将假设您有一个指向 32 位模块的 IMAGE_THUNK_DATA 结构(或 PE32+ 的 IMAGE_THUNK_DATA64)的指针,因为您已经在枚举名称,所以我们将从那里开始介绍基础。我还假设您正在处理 32 位模块,因为您没有另外指定。
IMAGE_THUNK_DATA 数组只是一个 DWORD 数组,每个 DWORD 代表一个导入的函数。要知道函数是按名称而不是序号导入的,您必须检查 DWORD 中是否未设置最高位(即 0x80000000)。
1> 如果设置了高位,则 DWORD 的值与 0xFFFF(仅取低位 WORD)为序数(也是“提示”值)。因此,该函数是按序号导入的,并且没有可用的名称。
2> 如果没有设置高位,整个 DWORD 是一个 RVA(指向内存映像的指针,没有基数)指向一个 IMAGE_IMPORT_BY_NAME 结构。如果您从文件图像中读取,则必须将 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 当然只是标记了导入函数名的字符数组的开头,因为名称可以大于一个字符。
第一个 WORD 是提示,如果您已经有名称,则必须跳过它。您是否有一段代码可以表明您遇到问题?