逆向工程核心原理 第十三章 PE文件格式

0x00 前言

在没有接触壳之前,也不着急着做什么练习,PE文件格式还是要学一学的。

0x01 正文

1.VA&RVA

VA:进程虚拟内存的绝对地址
RVA:相对虚拟地址。从某个基准位置(ImageBase)开始的相对地址

公式:RVA+ImageBase=VA

PS:
32位Windows中,进程分配有4GB虚拟内存,因此进程中的VA范围是00000000~FFFFFFFF

2.PE头

2.1 DOS头

IMAGE_DOS_HEADER

在微软创建PE文件格式的时候,正在广泛使用DOS文件,所以考虑到对DOS文件的兼容性,于是在PE头的最前面添加了一个IMAGE_DOS_HEADER结构体,用来扩展已有的DOS EXE头。

IMAGE_DOS_HEADER结构体大小为40个字节。

python中有一个专门用来解析PE的库。
在这里插入图片描述
其中最为重要的有两个

一个是magic还有一个是Ifanew

magic:DOS签名,默认值MZ
在这里插入图片描述
ifanew:指示NT头的偏移,简单的说就是指向NT头所在的位置。

2.2 DOS存根

DOS存根在DOS头下放,是一个可选项,且大小不固定。

直白的说就是为了兼容DOS环境下运行。

2.3 NT头

IMAGE_NT_HEADERS里有三个成员变量

signature签名 值为PE
在这里插入图片描述
在这里插入图片描述

2.3.1 NT头 文件头

IMAGE_FILE_HEADERS结果题有四个重要成员。
在这里插入图片描述
Machine
唯一Machine码,兼容32位Intel x86芯片的Machine码为14C。
在这里插入图片描述
NumberOfSections
NumberOfSections用来支出文件中存在的节区数量,该数值一定要大于0。如果和实际节数不同则运行出错

SizeOfOptionalHeader
用来指出IMAGE_OPTIONAL_HEADER3结构体的长度。
Characteristics
该字段用于表示文件的属性,文件是否是可运行状态,是否为DLL,文件等信息。
0002h,不可执行。

2.3.2 NT头:可选头

IMAGE_OPTIONAL_HEADER
重要字典
Magic
32位为Magic码为10B
64位为20B
AddressOfEntryPoint
AddressOfEntryPoint持有PE的RVA值。指出程序最先执行的代码起始地址。
在这里插入图片描述
程序的相对起始位置。
使用OD进行查看
在这里插入图片描述
ImageBase
进程虚拟内存的范围是0~FFFFFFFF。
EXE,DLL文件被装载到用户内存的07FFFFFFF中,SYS文件被载入内和内存的80000000FFFFFFFF。
VB/VC++?Delphi 创建好EXE文件后,ImageBase的值为00400000。DLL为1000000
PE装载器先创建进程,再将文件载入内存,然后把EIP寄存器的值设置为ImageBase+AddressOfEntryPoint
SectionAlignment,FileAlignment:
PE文件的Body部分划分为若干节区,这些节存储着不同类别的数据。FileAlignment指定了截取在磁盘文件中的最小单位,SectionAlignment制定了截取中的最小单位。
自盘文件或内存的截取大小必定为FileAligment或SectionAlignment值的整数倍
SizeOfImage
加载PE文件到内存时,SizeOfImage指定了PE Image在虚拟内存中所占空间的大小。一般而言,文件的大小与加载到内存中的大小是不同的。
SizeOfHeader
SizeOfHeader用来指出整个PE头的大小。值是FileAlignment的整数倍,第一节区所在位置与SizeOfHeader距文件开始偏移的量相同。
Subsystem
区分系统驱动文件语普通的可执行文件。
DataDorectory
由IMAGE_DATA_DIRECTORY结构体组成的数组。

2.4 节区头

节区头定义了各节区属性。
code:代码
data:数据
resource:资源

2.5 RVA to RAW

1.查找RVA的节区
2。使用公式计算文件偏移
RAW-PointerToRawData=RVA-VirtualAddress

2.6 IAT

IAT是一种表格,用来记录程序正在使用哪些库的哪些函数

5.7 DLL

动态链接库

5.7.1 加载DLL的方式

显式链接:程序使用DLL时进行加载,使用完毕之后释放内存。
隐式链接:程序开始一桶加载DLL,程序终止释放占用的内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘟嘟_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值