PE格式----目录----导入表

本文详细解析了PE文件中的导入表结构,包括IMAGE_IMPORT_DESCRIPTOR、IMAGE_THUNK_DATA及IMAGE_IMPORT_BY_NAME等关键结构。介绍了这些结构如何组织和存储导入模块的信息。

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

导入模块数组

导入表是一个IMAGE_IMPORT_DESCRIPTOR数组, 长度是14h,并且以14h字节的“0”作为数组结尾。每个模块对应一个IMAGE_IMPORT_DESCRIPTOR结构。( WinNt.h)。

struct _IMAGE_IMPORT_DESCRIPTOR {
    +0h union {
        DWORD   Characteristics;
        DWORD   OriginalFirstThunk;       //IMAGE_THUNK_DATA数组的RVA,导入函数数组      
        } DUMMYUNIONNAME;
    +4h DWORD   TimeDateStamp;            //一般为空
    +8h DWORD   ForwarderChain;         
    +ch DWORD   Name;                    //导入模块名的RVA
    +10h DWORD   FirstThunk;              
} IMAGE_IMPORT_DESCRIPTOR;  

FirstThunk在磁盘中它指向的位置跟OriginalFirstThunk是一样的,同样是指向IMAGE_THUNK_DATA数组。如果PE文件被加载进内存,FirstThunk指向的IMAGE_THUNK_DATA数组中的Function保存的就是真实内存中的函数地址,OriginalFirstThunk指向的同样是IMAGE_THUNK_DATA数组,但是保存的并不是真实内存中的函数地址,而是IMAGE_IMPORT_BY_NAME数组的RVA,保存的是导入函数的函数名。

加载前:

加载后:

 

导入函数数组

长度4h,以4h字节的0作为数组结尾。

struct _IMAGE_THUNK_DATA32{
    union {
       DWORD ForwarderString    //只有当IMAGE_IMPORT_DESCRIPTOR中的ForwarderChain有值时,它才有效
       DWORD Function           //被输入的函数的内存地址,只有在载入内存中时才有效
       DWORD Ordinal            //导入函数的序号,只有当IMAGE_THUNK_DATA的最高位是1的时候才有效
       DWORD AddressOfData      //当IMAGE_THUNK_DATA的最高位为0的时候有效,高位为0则指向IMAGE_IMPORT_BY_NAME结构体数组
    }u1;
}IMAGE_THUNK_DATA32;

x64系统内结构为:

struct _IMAGE_THUNK_DATA64{
    union {
       ULONGLONG ForwarderString    //只有当IMAGE_IMPORT_DESCRIPTOR中的ForwarderChain有值时,它才有效
       ULONGLONGFunction            //被输入的函数的内存地址,只有在载入内存中时才有效
       ULONGLONGOrdinal             //导入函数的序号,只有当IMAGE_THUNK_DATA的最高位是1的时候才有效
       ULONGLONGAddressOfData       //当IMAGE_THUNK_DATA的最高位为0的时候有效,高位为0则指向IMAGE_IMPORT_BY_NAME结构体数组
    }u1;
}IMAGE_THUNK_DATA64;

函数名数组

struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;                //函数在所在的dll的输出表中的序号                 
    BYTE    Name[1];            //要输入的函数的函数名
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

———————————————————————————————————————————

欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值