《逆向工程核心原理》学习笔记5
PE头核心——IAT,EAT
一 IAT——导入地址表
用于记录程序正在使用哪些库的哪些函数的表格
其通过记录各函数的实际地址的位置,并记下
CALL DWORD PTR DS:[实际地址位置]这样一条汇编指令
当执行该PE文件的时候,PE装载器将该函数的地址写到DS:[实际地址位置]处
疑问:为啥不直接将该函数的地址写到CALL指令中呢?
解答:第一,在不同的操作系统,不同的语言(人类语言),不同的服务包(what?)中,dll(动态链接库)的版本有所不同,也就是说,在不同的环境下,库函数在内存中的位置也有所不同,所以只有在执行文件后才知道该函数被加载到哪。所以只能靠PE装载器在执行该文件后找到该函数的位置,再将它放到之前安排的位置上。
第二,dll重定位。dll文件本身也是PE文件,它本身也有ImageBase,即优先加载地址,当两个dll文件的ImageBase发生冲突时,后来的那个dll要进行重定位,PE装载器会重新为它分配一段内存空间,这也导致了函数所在的地址无法在加载前确定。
第三,PE头中表示地址用的是相对虚拟地址(RVA)。
我们知道,RVA+ImageBase=VA
因此,实际地址受ImageBase影响
二 IMAGE_IMPORT_DESCRIPTOR
IMAGE_IMPORT_DESCRIPTOR结构体记录了PE文件需要导入哪些库文件。该结构体位于PE体里,它的地址&