第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文件格式的主要内容,如果未能解决你的问题,请参考以下文章