导入表

本文深入探讨了PE文件的导入表结构,包括IMAGE_IMPORT_DESCRIPTOR、IMAGE_THUNK_DATA32及IMAGE_IMPORT_BY_NAME等关键结构。解析了双桥结构在PE加载过程中的作用,即PE加载器如何通过INT找到真实函数地址并更新IAT。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个PE文件的导入表,简单说的说就是存放了其所调用的函数的地址和相关信息。

数据目录表的第1项(从0开始)就存放了导入表

导入表的结构

struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics; 
        DWORD   OriginalFirstThunk;      
    } DUMMYUNIONNAME;
    DWORD   TimeDateStamp; 
    DWORD   ForwarderChain;         
    DWORD   Name;                 
    DWORD   FirstThunk;          
} IMAGE_IMPORT_DESCRIPTOR;

其中最重要的三个参数

OriginalFirstThunk; //指向INT        

Name;                     //导入的dll的名称

FirstThunk;             //指向IAT  

其中OriginalFirstThunk 和 FirstThunk 就是著名的双桥结构。在没有被加载时,两个变量指向的空间内容一样,结构为

struct _IMAGE_THUNK_DATA32{
    union {
        DWORD ForwarderString 
        DWORD Function ; //被输入的函数的内存地址
        DWORD Ordinal ; //被输入的API的序数值
        DWORD AddressOfData ; //高位为0则指向IMAGE_IMPORT_BY_NAME
    }u1;
}IMAGE_THUNK_DATA32;

typedef struct _IMAGE_IMPORT_BY_NAME{
    WORD Hint;      //序号
    BYTE NAME[1];   //函数名
}IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;

双桥结构:

但是在PE加载的时候,双桥结构会断裂,IAT 会被PE加载器重写,PE加载器先搜索INT,PE加载器迭代搜索INT数组中的每个指针,找出 INT所指向的IMAGE_IMPORT_BY_NAME结构中的函数在内存中的真正的地址,并把它替代原来IAT中的值。此时IAT中存放的就是函数的真实地址。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值