文章目录
可执行文件的格式是操作系统执行机制的一种反应,研究可执行文件的数据格式和运行机制,是研究逆向和脱壳的基础;windows中可执行文件的格式被称为PE格式
下面会将我学习PE格式的一些笔记进行整理(网上有很多类似的文章),汇总成几篇文章,方便自己以后查看;第一篇就先简单对PE有一个直观的印象吧
1.学习目的
为什么要学习PE文件格式?学习前要想一下学习的目的,不要盲目的瞎学习;因为PE文件格式细节很多,没有目的的学习过几个月基本就会忘记了
说一下我的目的,为了学习下面的内容,我才会不定期温习PE文件的格式
-
学习
anti debug
时,会涉及PE里面的各种标志位 -
学习
hook
时,有专门的hook输入表的方法,输入表中IAT
是什么? -
学习写壳和脱壳时,会涉及到
IAT
、导出表等几乎PE文件的所有细节(后面会文章总结这里) -
逆向时,使用各种工具很容易看到PE文件细节的各种展示,不会PE文件格式咋看?
-
学习
ELF
格式时,对比学习PE格式,效果会更好
一句话,学就完了;要带有目的的学PE文件的格式
2.整体结构
PE(protable executable file
)文件是Windows中可执行文件的格式,且仅用于Windows操作系统
-
详细描述:PE格式的文件描述可以看
WinNT.h
中Image Format
和End Image format
之间的内容 -
不同版本:PE也叫PE32,是32位可执行文件;PE+或PE32+是64位可执行文件;严格来说,除了OBJ文件之外的所有文件都是可执行文件
先看一下PE文件的框架图,有一个直观的印象
简单理解PE就分成2块:
- 引导部分:DOS首部、NT首部和Section Table都是引导部分;PE文件的各种格式细节都在这个部分,学习PE文件格式也主要是学习这部分
- 实体部分:这部分主要是Section,有效的代码和数据都在这个部分
3.存在形式
学习PE文件经常会遇到2种形式:
- 磁盘中的文件(File):存在磁盘中的exe、dll等文件,PE文件的成员中被
File
或Raw
修饰的基本都是描述磁盘文件的信息 - 内存中的镜像(Image):PE加载器负责将磁盘文件(哪一部分)载入到内存,内存中的文件被成为
模块或镜像
上图是PE文件的2种形式的示意图,摘取自《加密与解密》;可以看到section部分在Image中膨胀了,这是由于File和Image的对齐大小不同导致的
扩展:模块的基址相关扩内容
常见的几个地址一定要区分好,PE格式里经常使用
-
起始地址:镜像的起始地址被称为模块句柄(
hModule
),可以通过这个句柄访问内存中其他的数据结构,即基地址(ImageBase
)-
VA:基地址是内存虚拟空间的虚拟地址(Virtrual Address,VA),可以理解成是绝对地址
-
RVA:PE文件中其他地址可以简单理解成是相对虚拟地址(RVA),主要是为了支持DLL不一定能加载到默认地址处产生的重定位操作
有如下对应关系:
虚拟地址(VA) = 基地址(ImageBase)+ 相对虚拟地址(RVA)
-
-
GetModuleHandle
函数Windows NT中镜像的基地址(
ImageBase
)作为镜像的实例句柄(Hinstance
);可通过GetModuleHandle()
函数这个句柄(也就是PE文件加载在内存中的基地址)//GetModuleHandle:获取一个进程的加载基址(传入NULL,获取进程自己的基址;传入其他模块名字,可得到对应模块加载基址) HMODULE GetModuleHandle(LPCTSTR lpModuleName); //其他方法:CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessID)一系列操作 或者 EnumProcessModules 等获取进程基址
-
默认加载基地址:基地址由PE文件自身进行设定;VC++默认的exe加载基地址是
0x400000
(不支持ASLR时),dll的默认基地址是10000000h
;Windows自己的exe和dll有些会有自己的加载基地址
4.工具查看
工欲善其事必先利其器,学PE格式得有几个工具吧,推荐使用Stud_PE和CFF Explorer,其中CFF是一个综合工具,很强大
info 1.PE header信息
Stud_PE查看
显示了最常用的一些基本信息:
- 头部信息:程序的入口点(
EntryPoint
,脱壳时重点找的位置),基址(ImageBase
,使用IDA和OD都要用的地址),区块的个数(Number of sections
,脱壳和写壳才关心),文件对齐(File Alignment
,写壳才关心)、内存对齐(Section Alignment
,写壳才关心)等 - 数据目录表:导入表,导出表等,下面是导入表的信息,可以看到里面有程序使用的所有DLL,且每个DLL使用的导出函数都有一个对应的表格
CFF Explorer查看
info 2.section table信息
这部分在脱壳中用的最多,因为一般的壳都会额外增加一个或多个区块来存放壳的代码和数据;后续有一部分笔记会写一个简单的壳,会重点研究这里
5.结束
后面会用几篇文章介绍PE文件更详细的信息,会先用WinDbg,后用专用工具进行介绍
6.参考
-
1.《加密与解密》第11章 PE文件格式
-
2.《逆向工程核心原理》第13章 PE文件格式