PE格式系列_0x01:PE格式-Introduction

可执行文件的格式是操作系统执行机制的一种反应,研究可执行文件的数据格式和运行机制,是研究逆向和脱壳的基础;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.hImage FormatEnd 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文件的成员中被FileRaw修饰的基本都是描述磁盘文件的信息
  • 内存中的镜像(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文件格式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值