PE之代码解析导入表

PE之代码解析导入表
1)导入表
导入表(ImportTable)是PE文件核心数据结构,主要存于.idata区块,用于记录程序运行时需调用的外部DLL(动态链接库)及对应函数信息。PE文件不会包含所有函数实现,而是通过导入表声明外部依赖,系统加载PE文件时,会依据导入表解析DLL路径与函数地址,完成动态链接,确保程序调用外部函数时能准确定位实现逻辑。其核心结构为IMAGE_IMPORT_DESCRIPTOR(IID)数组,每个IID对应一个依赖的DLL,包含DLL名称偏移,导入函数名称表(INT),导入地址表(IAT)偏移等关键字段,是实现PE动态链接的核心依据。

其他导入表的核心数据通常存储在.idata(导入数据)区块中,但这是PE文件的通用规范而非绝对强制规则:
常规情况:标准PE文件会将导入表相关数据(包括IMAGE_IMPORT_DESCRIPTOR数组,导入名称表INT,导入地址表IAT,DLL名称字符串等)集中归类到.idata区块。该区块的命名是行业约定俗成的,其核心作用就是专门承载与动态导入相关的所有数据,系统加载PE文件时,会优先扫描.idata区块解析导入表逻辑。

特殊情况:部分定制化PE文件(如加壳,混淆的程序,精简版PE)可能打破这一规范:比如将导入表数据嵌入到.data(数据区块),.rdata(只读数据区块)甚至自定义命名的区块(如.custom,.vmp)中;还有些PE会合并区块(如将.idata与.rdata合并),此时导入表物理存储在合并后的区块,但逻辑上仍属于导入表结构。


2)解析导入表
解析导入表需先通过PE头DataDirectory中IMAGE_DIRECTORY_ENTRY_IMPORT字段,获取导入表的相对虚拟地址(RVA)和大小,转换为文件偏移后定位IID数组,所以咱们需要写一个RvaToOffset函数;逐个遍历IID并通过名称偏移提取依赖的DLL名称;再解析INT/IAT,区分函数是按名称(借助IMAGE_IMPORT_BY_NAME结构体)还是序号导入,最终咱们就可以得到每个DLL对应的导入函数列表。后期咱们会在逆向分析,病毒溯源中识别程序外部依赖和调用逻辑经常遇到,这也是理解PE动态链接机制的核心步骤。

3)程序开发流程
前几个基本PE文件流程掌握以后,咱们使用之前的流程来进行导入表常见的信息获取。首先把要分析的EXE或DLL文件,以二进制方式打开,把文件里所有内容都读到内存里的一个临时区域(咱们叫它buf)。接着把这个buf转换成能识别PE文件开头DOS头的格式,找到DOS头里的e_lfanew这个关键值,用它加上buf的起始位置,就能定位到PE文件的核心NT头了。接下来要找导入表,就得从NT头里的OptionalHeader.DataDirectory这块儿,找到对应导入表的那个索引(IMAGE_DIRECTORY_ENTRY_IMPORT),拿到导入目录表的地址。然后用RvaToOffset这个函数专门把PE文件里的虚拟地址(RVA)转换成实际的文件偏移位置,它会先检查PE文件是不是合法的,再看地址是在文件头区域还是各个区块里,遍历区块算偏移,要是地址无效或者文件有问题就返回0——用这个函数算出导入表的实际位置,转换成导入描述符的指针(pImportDescriptor)。咱们接着往下走以pImportDescriptor->Name不为空为条件,逐个遍历每一个导入描述符:先把当前导入描述符里Name字段的虚拟地址(RVA),用RvaToOffset函数转成文件偏移,再加上buf的起始位置,就能拿到对应的DLL名字(szDllName),接着打印出这个DLL的名称、时间戳、转发链、Name字段的虚拟地址、FirstThunk值,还有OriginalFirstThunk(OFTs)的数值。然后处理这个DLL对应的导入函数:先把OriginalFirstThunk的虚拟地址转成文件偏移,加上buf得到导入地址表(IAT)的指针pIAT(类型是PIMAGE_THUNK_DATA64),再初始化index(索引)和importOffset(导入偏移)两个变量。接下来以pIAT->u1.Ordinal不为0为条件,遍历这个DLL下的所有导入函数:先打印OriginalFirstThunk的虚拟地址,再算出它的文件偏移(importOffset加上当前index)并打印,之后把index加8(因为是64位结构,每次占8个字节)。接着判断函数导入方式:如果pIAT->u1.Ordinal的最高位不是1(没带0x80000000标记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值