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

标签 python portable-executable import-table

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

最佳答案

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

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

1> 如果高位被置位,则 DWORD 与 0xFFFF 进行 AND 运算后的值(仅取低 WORD)就是序数(也是“提示”值)。因此,该函数是按序数导入的,并且没有可用的名称。

2> 如果未设置高位,则整个 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 当然仅标记导入函数名称的字符数组的开头,因为名称可以大于一个字符。

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

关于python - 我们如何在PE文件中的IMAGE_IMPORT_BY_NAME STRUCT中获取提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41581363/

相关文章:

python - 为什么继承 str 或 int 的行为与继承列表或字典的行为不同?

python - 检查字符串中的有效域名?

portable-executable - IMAGE_THUNK_DATA 的结构是什么?

python - Tensorflow-gpu获取卷积算法失败

python - 返回抓取的结果数

windows - __imp_ 符号的语义

c - 如何将二进制数据添加(和使用)到已编译的可执行文件中?

c++ - 将可执行文件加载到当前进程的内存中,然后执行它

c++ - 在进程中注入(inject)标准函数后崩溃