Windows逆向工程提升之IMAGE_IMPORT_DESCRIPTOR

目录

[Import Table 概述](#Import Table 概述)

[IMAGE_IMPORT_DESCRIPTOR 结构详解](#IMAGE_IMPORT_DESCRIPTOR 结构详解)

字段解析

[IMAGE_THUNK_DATA 结构](#IMAGE_THUNK_DATA 结构)

[IMAGE_IMPORT_BY_NAME 结构](#IMAGE_IMPORT_BY_NAME 结构)

结构图解


Import Table 概述

在 PE 文件中,Import Table(导入表)用于指定可执行文件或动态链接库需要从其他模块(通常是 DLL 文件)加载的符号(函数或变量)。

  • Import Table 是 PE 文件中负责动态链接机制的重要结构。
  • 它定义了哪些函数(或变量)需要从外部模块加载。
  • 常见的导入模块:kernel32.dll, user32.dll 等。

IMAGE_IMPORT_DESCRIPTOR 结构详解

IMAGE_IMPORT_DESCRIPTOR 是描述 PE 文件在运行时需要从外部 DLL 中导入的函数和模块信息的一种数据结构,位于 Import Table 中。

在 Windows SDK 头文件 winnt.h 中,IMAGE_IMPORT_DESCRIPTOR 的定义如下:

cpp 复制代码
typedef struct _IMAGE_IMPORT_DESCRIPTOR {  
    union {  
        DWORD Characteristics;      // 0 for terminating null import descriptor  
        DWORD OriginalFirstThunk;   // RVA of _IMAGE_THUNK_DATA array  
    } DUMMYUNIONNAME;  
    DWORD TimeDateStamp;            // Time/Date stamp  
    DWORD ForwarderChain;           // Index of the first forwarder reference  
    DWORD Name;                     // RVA of the DLL name (ASCII)  
    DWORD FirstThunk;               // RVA of _IMAGE_THUNK_DATA array for IAT (Import Address Table)  
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;  

字段解析

|---------------------|----------------------------------------------|
| 字段名 | 描述 |
| ​OriginalFirstThunk | 导入名称表(INT)的RVA,指向IMAGE_THUNK_DATA数组(函数名称或序号) |
| ​TimeDateStamp | 绑定时间戳(若为0,表示未绑定;若为0xFFFFFFFF,表示绑定无效) |
| ​ForwarderChain | 转发函数的索引(通常为0,复杂场景下用于跨DLL转发) |
| ​Name | DLL名称的RVA(如"kernel32.dll") |
| ​FirstThunk | 导入地址表(IAT)的RVA,加载时系统将用实际函数地址填充此表 |


IMAGE_THUNK_DATA 结构

IMAGE_IMPORT_DESCRIPTOR 引用的 _IMAGE_THUNK_DATA 数组用于保存导入的函数信息。

  • 按序号导入:最高位为1时,低31位为函数序号(如0x80000001表示序号1)。
  • 按名称导入:最高位为0时,值为指向IMAGE_IMPORT_BY_NAME的RVA。

_IMAGE_THUNK_DATA 的定义如下:

cpp 复制代码
typedef struct _IMAGE_THUNK_DATA {  
    union {  
        PBYTE  ForwarderString; // Pointer to string in forwarders  
        PDWORD Function;        // Pointer to imported function  
        DWORD Ordinal;          // Ordinal value  
        PBYTE  AddressOfData;   // RVA of IMAGE_IMPORT_BY_NAME  
    } u1;  
} IMAGE_THUNK_DATA32, *PIMAGE_THUNK_DATA32;  
  1. ForwarderString: 字符串指针,表示转发器模块的符号名。

  2. Function: 动态加载后的函数指针。

  3. Ordinal: 按序号导入的函数(如果使用序号导入)。

  4. AddressOfData: 指向 IMAGE_IMPORT_BY_NAME 的 RVA。


IMAGE_IMPORT_BY_NAME 结构

用于描述每个导入函数的符号。

cpp 复制代码
typedef struct _IMAGE_IMPORT_BY_NAME {  
    WORD Hint;       // 函数名称的提示序号,辅助快速查找。  
    BYTE Name[1];    // 函数名以 null 结尾的字符串。  
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;  

字段解析:

  1. Hint: 提示值,用于帮助 PE 装载器快速定位函数。

  2. Name: 函数名称的字符串。


结构图解

相关推荐
黎雁·泠崖1 分钟前
Java&C语法对比:分支与循环结构核心全解析
java·c语言
鹿角片ljp7 分钟前
Java IO流案例:使用缓冲流恢复《出师表》文章顺序
java·开发语言·windows
Hello_Embed39 分钟前
RS485 双串口通信 + LCD 实时显示(中断版)
c语言·笔记·单片机·学习·操作系统·嵌入式
FL16238631291 小时前
[C++][cmake]基于C++在windows上onnxruntime+opencv部署yolo26-seg的实例分割onnx模型
c++·windows·opencv
xiaobobo33302 小时前
c语言什么时候适合用三目运算什么时候适合用阶梯判断
c语言·三目运算·阶梯判断·花括号作用域
宵时待雨2 小时前
数据结构(初阶)笔记归纳4:单链表的实现
c语言·开发语言·数据结构·笔记·算法
非凡ghost2 小时前
SoftPerfect Network Scanner(网络扫描管理工具)
网络·windows·学习·软件需求
蝎蟹居2 小时前
GBT 4706.1-2024逐句解读系列(29) 第7.9~7.10条款:开关,档位应明确标识
人工智能·单片机·嵌入式硬件·物联网·安全
代码无bug抓狂人2 小时前
C语言之5位黑洞数
c语言·算法
北辰当尹3 小时前
第27天 安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
android·安全·php