翻阅了很多资料,也有了一个完整的思路,我们先从PE的各部份认识起,然后将会对PE文件有一个全新的认识和进步,希望对各位有所帮助,文章中如果有不当的地方或者错误欢迎给我指出或者留言在本博客!
首先我们得了解为什么要手工打造PE文件:
我们知道,往往从一个系统可执行文件结构上,就可以看整个操作系统的一些特性。也就是说PE里有Windows操作系统结构与运行机理的影子。由此可见,PE文件必然是一个非常庞杂且逻辑复杂的结构,那么为什么我们还要“自取其辱”来手工制造一个PE文件呢?这就要从PE文件的重要性说起了。
我们现今组成Windows大家庭的主要成员就是PE文件了,里面包括EXE、DLL、OCX、SYS等一切最有价值的文件都是PE文件格式,出于对版权的考虑或对某种技术的渴求,任何一种与Windows系统相关的行为最终都要归集到这里--PE文件。
特别是对于想学习加壳、破解、搞虚拟机的朋友们来说,熟知PE文件结构更是必不可少的基本功!
但也正是由于PE文件的复杂性,我们才要采取一些特别的办法来攻克它,其中手工打造PE文件就是一条捷径。
你可以想像一下,如果你都可以手工打造PE文件的话,那么对于PE文件的了解更是可见一斑了。但是我还想提醒一下各位读者,即便是如此,我们所了解的也仅仅是一部分,不过一般情况下已经足够了。
下面我们就来看看PE文件的整体结构,找了很多,这个算是比较完整和清晰的了,花了点时间做成了一个表:
分类
详细
大小(byte)
解释
DOS头部
DOSHeader(IMAGE_DOS_HEADER)
64
MZ头部
DOSStub
112
实模式残余程序
PE文件头
"PE"00(Signature)
4
PE文件标志
IMAGE_FILE_HEADER
20
PE文件头
IMAGE_OPTIONAL_HEADER32
96
PE文件可选头
数据目录表
128
块表
IMAGE_SECTION_HEADER
40
各段头部
IMAGE_SECTION_HEADER
40
IMAGE_SECTION_HEADER
40
块
.text
512
一般存储汇编机器码
.rdata
512
存储输入表、输出表、IAT、资源等等信息
.data
512
一般存储const字符串等
调试信息
COFF行号
NULL
COFF符号表
NULL
CodeView调试信息
NULL