受欢迎的博客标签

逆向工程系列-windows PE文件结构及其加载机制

Published

破解软件属于软件逆向,需要弄懂可执行文件的结构以及它是怎样被操作系统加载进内存的,然后怎样被cpu一条指令一条指令的运行的。必须要有汇编基础。

原理是查找软件的运行的流程,并通过修改这个流程来改变软件的行为。
可以直接修改可执行文件,也可以通过dll注入或是远程写入进程等方法在程序正在运行是修改程序。
有时候要靠修改素材来实现,比如游戏修改中改变地图,等等的。
需要学习汇.

 

PE 的意思就是Portable Executable(可移植的执行体)。常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。

32位称为PE32,64位称为PE+或PE32+

EXE和DLL文件之间的不同完全是语义上的。它们都使用完全相同的PE格式。仅有的区别是用了一个单个的位来指出这个文件应该被作为EXE还是一个DLL.

PE结构

Win32可执行程序的大体结构,就是通常所说的PE结构。

PE 文件格式被组织为一个线性的数据流,它由一个MS-DOS 头部开始,接着是一个是模式的程序残余以及一个PE 文件标志,这之后紧接着PE文件头和可选头部。这些之后是所有的段头部,段头部之后跟随着所有的段实体。文件的结束处是一些其它的区域,其中是一些混杂的信息,包括重分配信息、符号表信息、行号信息以及字串表数据。

如下图所示,PE文件结构被划分为四大部份,包括:DOS部分、PE头、节表、和节数据。

PE结构分为4大部分,其中每个部分又进行了细分,存在若干个小的部分。从数据管理的角度来看,可以把PE文件大致分为两部分,DOS头、PE头和节表属于PE文件的数据管理结构或数据组织结构部分,而节表数据才是PE文件真正的数据部分,其中包含着代码、数据、资源等内容。


PE结构如下图:

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     MS-DOS       
    MZ  头部      --------------> 64 byte

  ̄  ̄  ̄  ̄  ̄  ̄
     MS-DOS       
 实模式残余程序   --------------> 112 byte 

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    PE文件标志    --------------> 4 byte

 ̄  ̄  ̄  ̄  ̄  ̄ 
     PE文件头     --------------> 20 byte

 ̄  ̄  ̄  ̄  ̄  ̄ 
   PE文件可选头   --------------> 224 byte

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     各段头部     --------------> n * 40 byte

  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

DOS MZ header:所有PE文件(甚至32位的DLLs) 必须以一个简单的DOS MZ header 开始。有了它,一旦程序在DOS下执

PE文件分析相关的概念

3.节表
程序的组织按照各属性的不同而被保存在不同的节中,在PE头部之后就是一个数组结构的节表。描述节表的结构体是IMAGE_SECTION_HEADER,如果PE文件中有N个节,那么节表就是由N个IMAGE_SECTION_HEADER组成的数组。节表中存储了各个节的属性、文件位置、内存位置等相关的信息。

4.节表数据
PE文件的真正程序部分就保存在节数据中。在PE结构中,有几个节表,就对应有几个节表的数据。根据节表的属性、地址等信息,程序的数据就分布在节表指定的位置中。

 

加载

PE文件一个方便的特点是磁盘上的数据结构和加载到内存中的数据结构是相同的。加载一个可执行文件到内存中 (例如,通过调用LoadLibrary)主要就是映射一个PE文件中的几个确定的区域到地址空间中。因此,一个数据结构比如IMAGE_NT_HEADERS (稍后我将会解释)在磁盘上和在内存中是一样的。关键的一点是如果你知道怎么在一个PE文件中找到一些东西,当这个PE文件被加载到内存中后你几乎能找到相同的信息。

要注意到PE文件并不仅仅是被映射到内存中作为一个内存映射文件。代替的,Windows加载器分析这个PE文件并决定映射这个文件的哪些部分。当映射到内存中时文件中偏移位置较高的数据映射到较高的内存地址处。一个项目在磁盘文件中的偏移也许不同于它被加载到内存中时的偏移。然而,所有被表现出来的信息都允许你进行从磁盘文件偏移到内存偏移的转换

 

每个节都有一个不同的名字。这个名字被用来意指节的作用。例如,一个叫做.rdata的节表示一个只读数据节。使用节名只是为了人们方便,对操作系统来说没有任何意义。一个命名为FOOBAR的节和一个命名为.text.的节一样有效。

 

 

 

PE文件格式分析

https://www.cnblogs.com/Bachelor/p/3210748.html