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


结构图解

相关推荐
guiyanakaung5 小时前
一篇文章让你学会 Compose Multiplatform 推荐的桌面应用打包工具 Conveyor
android·windows·macos
mCell6 小时前
你可能在用错密码:服务端密码安全的真相与陷阱
后端·安全·go
全干engineer7 小时前
web3-区块链的技术安全/经济安全以及去杠杆螺旋(经济稳定)
安全·web3·去中心化·区块链·智能合约
冷雨夜中漫步7 小时前
Java中如何使用lambda表达式分类groupby
java·开发语言·windows·llama
海尔辛8 小时前
防御性安全:数字取证
数据库·安全·数字取证
不过四级不改名6779 小时前
用c语言实现简易c语言扫雷游戏
c语言·算法·游戏
曼岛_9 小时前
[架构之美]解决Windows 10主机与Windows 10虚拟机之间无法拖拽复制问题
windows·架构
我命由我1234510 小时前
嵌入式 STM32 开发问题:烧录 STM32CubeMX 创建的 Keil 程序没有反应
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·嵌入式
C++ 老炮儿的技术栈10 小时前
手动实现strcpy
c语言·开发语言·c++·算法·visual studio
一条叫做nemo的鱼10 小时前
从汇编的角度揭开C++ this指针的神秘面纱(下)
java·汇编·c++·函数调用·参数传递