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: 函数名称的字符串。


结构图解

相关推荐
绘梨衣的sakura路5 小时前
Fastjson ≤ 1.2.83 新型 RCE 漏洞深度分析:三层绕过机制与完整利用链
安全·web安全·json
北龙云海5 小时前
案例分享 | 面向公网业务系统境内访问白名单配置实操方案
运维·网络·安全·网络安全·告警·数据泄露·入侵攻击
2601_954526756 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
spencer_tseng6 小时前
Redis + Nacos.bat
java·windows·dos
qq_448011166 小时前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
会飞的小新7 小时前
Windows CMD 与 PowerShell 深度解析:底层原理、命令差异、自动化选型指南
运维·windows·自动化
niaiheni8 小时前
Fastjson 1.2.83 “Gadget-Free“ RCE
网络·安全·web安全
意疏8 小时前
远程办公软件哪个安全性高?UU远程8项安全防线全覆盖
网络·安全
Draina8 小时前
CBC填充预言攻击-CBC Padding Oracle Crypto Attack
python·安全·web安全·网络安全·密码学·安全性测试
MartinYeung59 小时前
DC Scameter:一份反诈骗相关的专业分析报告
人工智能·安全