PE结构 exe
PE文件是Windows操作系统下使用的可执行文件格式。
PE(Portable Executable)格式,是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。PE格式衍生于早期建立在VAX(R)VMS(R)上的COFF(Common Object File Format)文件格式。
Pe文件是指32位的可执行文件(PE32)。64的可执行文件称为PE+或者PE32+,是PE文件的一种扩展形式。
种类
基本结构
PE头:DOS头(DOS header)、节区头(Section header)
各节区头定义了各节区在文件或内存中的大小,位置,属性等。
PE头与各节区的尾部存在一个区域,称为NULL填充。相当于00
DOS文件头:
IMAGE_DOS_HEADER结构体(64字节)
两个重要成员:
e_magic :DOS签名(4D5A “MZ”)
e_lfanew :指示NT头的偏移
NT头:
IMAGE_NT_HEADERS
三个成员:
Singature 签名(PE:50450000h)
File Header 文件头
IMAGE_FILE_HEADER结构体:
Optional header 可选头
IMAGE_OPTIONAL_HEADER32是PE头结构体重最大的
节区头
节区中定义了各节区属性。
节区头是由IMAGE_SETION_HEADER结构体组成的数组,每个结构体对应一个节区。
重要组成成员
看一下notepad的节区头数组
RVA to RAW(文件偏移)
PE文件加载到内存是,每个节区都要能准确完成内存地址与文件偏移间的映射。这种映射一般称为RVA TO
RAW
方法如下:
查找RVA所在的节区。
使用简单的公式计算文件偏移(RAW)
换算公式:
例如 RVA=5000 File offset=?
位于.text中 (1001000<1005000<1008748)
RAW=5000-1000+400=4400
IAT(Image Address Table,导入地址表)
IAT保存的内容与windows操作系统的核心进程、内存、DLL结构有关。(理解了IAT,就掌握了windows操作系统的根基。)
DLL(动态链接库)
两个成员
Import 导入
Export 导出
IMAGE_IMPORT_DESCRIPTOR
IMAGE_EXPORT_DIRECTORY
PE病毒感染
PE病毒常见的感染其它文件的方法是在文件中添加一个新节,然后往该节中添加病毒代码和病毒执行后返回HOST程序的代码,并修改文件头中代码开始执行位置(Address Of EntryPoint)指向新添加的病毒节的代码入口,以便程序运行后先执行病毒代码。下面具体分析一下感染文件的步骤。
感染文件的基本步骤:
1, 判断目标文件开始的两个字节是否为“MZ”。
2, 判断PE文件标记“PE”。
3, 判断感染标记,如果已被感染过则跳出继续执行HOST程序,否则继续。
4, 获得Directory(数据目录)的个数,每个数据目录信息占8个字节。
5, 得到节表起始位置:
Directory的偏移地址+数据目录占用的字节数=节表起始位置
6, 得到目前最后节表的末尾偏移(紧接其后用于写入一个新的病毒节)。
节表起始位置+节的个数×(每个节表占用的字节数28H)=目前最后节表的末尾偏移
7, 开始写入节表。
l 写入节名(8B)。
l 写入节的实际字节数(4B)。
l 写入新节在内存中的开始偏移地址(4B),同时可以计算出病毒入口位置。
上节在内存中的开始偏移地址+(上节大小/节对齐+1)×节对齐=本节在内存中的开始偏移地址
l 写入本节(即病毒节)在文件中对齐后的大小。
l 写入本节在文件中的开始位置。
上节在文件中的开始位置+上节对齐后的大小=本节(即病毒)在文件中的开始位置
l 修改映象文件头中的节表数目。
l 修改Address Of EntryPoint,同时保存旧的Address Of EntryPoint,以便返回HOST继续执行。
l 更新Size Of Image(内存中整个PE映象尺寸=原Size Of Image+病毒节经过内存节对齐后的大小)。
l 写入感染标记
l 写入病毒代码到新添加的节中:
ECX=病毒长度
ESI=病毒代码位置(并不一定等于病毒执行代码开始位置)
EDI=病毒节写入位置
l 将当前文件设置为文件结尾。
PE病毒感染其它文件的方法还有很多,例如PE病毒还可以将自己分散插入到每个节的空隙中等
小文章
https://blog.csdn.net/shangguanwaner/article/details/1911966