标签:情况 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的顺序:
标签:情况 size 单位 一个 名称 rip 实现 dll 相对
原文地址:https://www.cnblogs.com/Rev-omi/p/13183316.html