第13章:PE文件格式

Posted rev-omi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第13章:PE文件格式相关的知识,希望对你有一定的参考价值。

DLL(Dynamic Linked Library)

加载DLL的方式实际有两种:一种是显示链接(Explicit Linking),程序使用DLL时加载,完毕时再释放内存; 一种是隐式链接(Implicit Linking),程序开始时就加载DLL,程序终止时再释放占用的内存.

IAT提供的机制与隐式链接相关.

 技术图片

 

 如图,没有直接选择 call 7C8107F0,而是选择使用间接地址,在执行文件时,PE装载器只需要将CreatFileW()函数的地址写到01001104的位置.

第二个原因是,如果原来的地址被占用,PE装载器就只能查找其它空白内存区域将dll文件载入

实际操作中无法保证DLL一定会被加载到PE头指定的ImageBase处,但是EXE文件有自己的虚拟空间,因此可以实现这个操作.

 

IMAGE_IMPORT_DESCRIPTOR

该结构体中记录着PE文件要导入哪些库文件.其本身处在PE体中,查找到它的位置需要在可选头中的DataDirectory[1]找到.

由于本身是RVA,故需要转换为文件偏移,由于内存中的最小单位和硬盘中的最小单位的不同导致的.只需要抓住最重要的一点就是:它们距离这一个节区开头的距离都是相同的.

技术图片

 

 一个程序导入多少库就存在多少个Image_Import_Descripotor结构体.结构体数组最后以NULL结构体结束.

有以下重要成员(全部都是相对虚拟地址):

1#.OriginalFirstThunk

INT(Import Name Table)的地址.INT中各个元素的值为Image_Import_By_Name结构体指针.INT和IAT的大小相同,且都是长整型(4字节数据类型)数组.

2#.Name

库名称字符串的地址.

3#.FirstThunk

IAT的地址.INT(导入函数的名称的地址)和IAT(导入函数的地址)各元素一般都指向相同的地址(如下图),但也有很多情况是不一致的.

技术图片

 PE装载器把导入函数输入至IAT的顺序:

技术图片

 

以上是关于第13章:PE文件格式的主要内容,如果未能解决你的问题,请参考以下文章

PE文件解析 基础篇

PE文件格式详解,第三讲,可选头文件格式,以及节表

PE文件格式

第13章 Linux日志管理

PE文件格式详解,第一讲,DOS头文件格式

PE文件格式偏移参考