Windows下有PE(Portable Executable):可执行文件
COFF(Common Object File Format):通用模板文件格式文件
其中,PE文件结构十分重要。典型结构如下:
Figure 1 illustrates the Microsoft PEexecutable format.
具体在看雪论坛有中文翻译版Microsoft PECOFF规范v8和v8.1中文版
一:MS—DOS占位程序
只要关注0x3C处,这里存放PE文件签名的偏移地址(相对于该文件的初始地址)
二:PE文件头
这里存放着该文件的重要信息
1.签名
存放四个字节的数据 PE\0\0 (一般从0x3c处就可以索引到)在F0处
2.PE文件头
3,PE可选头
主要注意的是可选文件头中的DataDirectory,其中包含了各个表的信息。几个比较重要的如下
这里可以找到idata的RVA(就是虚拟偏移地址),是从PE文件头结束位置开始算起偏移了104 即(F4H) 244 + 20 +204 = 170(H)
可见,导入表地址为0001A1D8
三:节表
这里存放节的十分详细的信息,需要十分关注
这里就是一个节表idata
查文档就可以知道 VirtualSize = 0001A00 H 明显导入表落在idata内 PointerToRawData: 7400
这样就可以算导入表的文件中地址了 0001A1D8 - 0001A000 + 7400 = 75D8H
idata节如下
四:各个节
idata节:这里存放导入到文件里的函数的信息 每5x4个作为一个导入目录表,最后以5x4个空字节结束
在上面的一个图中 可以知道Import Address Table RVA (Thunk Table) = 0001A098 经计算可以知道 实际的地址在 7498H处。
它的高位是0 所以直接表示RVA
最后得到 一个函数的地址 1A414-1A000+7400=7814H
(一个MessageBox)
导出表和资源目录表其实都类似,结构不同罢了。接下来准备用C++写一个PE分析,知道有python的pefile库十分方便,但是感觉自己对PE还是理解不够,所以自己写一个来深入了解PE。
具体参考 PE文件结构详解(一)基本概念