逆向工程之PE文件(二)
三 . RVA To RAW
PE文件从磁盘到内存的映射:
查找RVA所在节区
使用简单的公式计算文件偏移:
RAW - PointerToRawData = RVA - ImageBase
RAW = RVA - ImageBase + PointerToRawData
example:ImageBase为0x10000000,节区为.text,文件中起始地址为0x00000400,内存中的起始地址为0x01001000,RVA = 5000,RAW = 5000 - 1000 + 400 = 4400。
四 . IAT
IAT(地址导入表):IAT保存的内容与Windows操作系统的核心进程,内存,DLL结构等有关。IAT是一种表格,记录程序正在使用那些库中的那些函数。(很重要,但是书上这里还没开始学习)
五 . DLL
1.DLL的基本概念和相关知识
在我们的电脑里都许多的文件,有一部分就是后缀为dll的文件;DLL文件是动态链接库文件;
对于DLL的描述如下:
- 不要把库包含到程序中,单独组成DLL文件,需要时调用即可。
- 内存映射技术使加载后的DLL代码、资源在多个进程中实现共享。
- 更新库时只要替换相关DLL文件即可,简便易行。
加载DLL的方式实际有两种:一种是“显式链接”(Explicit Linking ),程序使用DLL时加载,使用完毕后释放内存;另一种是“隐式链接”( Implicit Linking ),程序开始时即一同加载DLL,程序终止时再释放占用的内存。IAT提供的机制即与隐式链接有关。下面使用OllyDbg打开notepad.exe来查看IAT。
这里调用CreateFileW()函数,这个函数在kernel.dll中;DLL文件的Imagebase一般在100000000
实际操作中无法保证DLL一定会被加载到PE头内指定的ImageBase处。但是EXE文件(生成进程的主体)却能准确加载到自身的ImageBase中,因为它拥有自己的虚拟空间。
加载DLL的方式:
显式链接:程序使用DLL时进行加载,使用完毕之后释放内存。
隐式链接:程序开始一桶加载DLL,程序终止释放占用的内存。
2. IMAGE_IMPORT_DESCRIPTOR
IMAGE_IMPORT_DESCRIPTOR结构体中记录着PE文件要导入哪些库文件。
Import:导入,向库提供服务(函数)。
Export:导出,从库向其他PE文件提供服务(函数)。
这是该结构体的代码:
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD