码迷,mamicode.com
首页 > 其他好文 > 详细

第13章:PE文件格式(2)

时间:2020-06-24 14:31:44      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:情况   size   单位   一个   名称   rip   实现   dll   相对   

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文件格式(2)

标签:情况   size   单位   一个   名称   rip   实现   dll   相对   

原文地址:https://www.cnblogs.com/Rev-omi/p/13183316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!