PE知识总结(小甲鱼教程)

一、PE的基本概念:

   1)PE文件中的数据结构一般都有32位 和 64位 之分,一般会在名称上表现出来。

   2)PE文件使用的是一个平面地址空间,线性的,所有的代码和数据合并在一起。

   3)文件的内容被划分成区块,以 页边界 对齐

   4)每个块有自己在内存中的一套属性——是否可读 或 只读。

   5)PE文件不是作为单一内存映射文件被装入内存

   6)Windows加载器(PE加载器)遍历PE文件,决定文件的哪一部分被映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中。

   7)当磁盘文件一旦被装入内存中,磁盘上的数据结构布局和内存中的数据结构布局是一致的。

   8)基地址、相对虚拟地址、文件偏移地址

基地址   —— 在Windows NT上是模块的句柄

虚拟地址 —— 某一虚拟地址相对基地址的偏移

偏移地址 —— 从0开始

    Ps:   分析PE,就是了解结构体的构造,成员,它们是怎么存放,怎么索引,我们就能了解什么是PE感染、PE变位、如何伪装PE、如何在PE文件里加入隐秘的东西,如何加密、解密。

 

二、MS-DOS头部

每个PE文件是以一个DOS程序开始的,为了适应在DOS下执行。

PE文件的第一个字节起始于一个传统的MS-DOS头部,被称作IMAGE_DOS_HEADER(事实上它是一个结构体)

IMAGE_DOS_HEADER有两个重要的结构体。

e_magic      ;//MZ(4Dh 5Ah) DOS可执行文件标记

e_lfanew     ;//32位指针 指向PE文件头,这个成员相对于DOS的偏移永远是3ch

 

三、PE文件头

PE文件头是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称,里面包含着许多PE装载器用到的重要字段。

程序在执行时,PE装载器将从IMAGE_DOS_HEADER结构中的e_lfanew字段里找到 PEHeader的起始偏移量,加上基地址就得到PE文件头的指针。

IMAGE_NT_HEADER结构

Signature   //在一个有效的PE文件里,Signature字段被设置位00004550h,ASCII码字符是“PE00”.标志着PE文件头的开始。

IMAGE_FILE_HEADER    FileHeader  //

     1.WORD    Machine               ;//运行平台    

     2.WORD    NumberOfSections      ;//文件的区块数目

     3.DWORD   TimeDateStamp         ;//文件创建日期和时间(以秒来算,VC的话可以用_ctime函数 或者 gmtime函数)

     4.DWORD   PointerToSymbolTable  ;//指向符号表(主要用于调试)

     5.DWORD   NumberOfSymbols       ;//符号表中符号个数(主要用于调试)

     6.WORD SizeOfOptionalHeader  ;//IMAGE_OPTIONAL_HEADER32结构大小。

     7.WORD    Characteristics       ;//文件属性

IMAGE_OPTIONAL_HEADER32    OptionalHeader

https://www.cnblogs.com/kuangke/p/5393514.html

在这个结构体中需要注意的成员,这些值是文件运行必需的,设置错误将导致文件无法正常运行。

           1.Magic  为IMAGE_OPTIONAL_HEADER32结构体是,Magic码为10B;为IMAGE_OPTIONAL_HEADER64结构体时,Magic码为20B。

            2.AddressOfEntryPoint     持有EP的RVA值。该值指出程序最先执行的代码起始地址。

            3.ImageBase     进程虚拟内存的范围是0~FFFFFFFF(32位系统)。PE文件被加载到如此大的内存中时,ImageBase指出文件的优先装入地址。

 

 

            4.SectionAlignment,FileAlignment     PE文件的Body部分划分若干节区,这些节存储着不同类别的数据。FileAlignment指定了节区在磁盘文件中的最小单位,而SectionAlignment则指定了节区在内存中的最小单位(一个文件中,FileAlignment和SectionAlignment的值可能相同,也可能不同)。磁盘文件或内存的节区大小必定位FileAlignment或SectionAlignment值的整数倍。

IMAGE_OPTIONAL_HEADER32成员1

            Ps:    DataDirectory是由IMAGE_DATA_DIRECTORY结构体组成的数组,最重要的字段之一,由16个相同的IMAGE_DATA_DIRECTORY结构体组成。其定义很简单,只有两个,仅仅指出了某种数据块的位置和,其用途是用来定义多种不同用途的数据块的位置和长度。例如导出表、导入表、资源、重定位表等数据块。

           IMAGE_DATA_DIRECTORY STRUCT

                           VirtualAddress    DWORD    ?    ;数据的起始RVA

                            isize    DWORD    ?    ;数据块的长度

           IMAGE_DATA_DIRECTORY end

图片:数据目录列表

 

 

四、块表

1.PE文件到内存的映射

①系统装载可执行文件的方法又不完全等同于内存映射文件。

②当使用内存映射文件的时候,系统对“原著”相当忠实。如果将磁盘文件和内存影响比较的话,可以发现不管是数据本身还是数据之间的相对位置都是完全相同的。

③Windows装载器在装载DOS部分、PE文件头部分和节表(区块表)部分是不进行任何特殊处理的,而在装载节(区块)的时候则会自动按节(区块)的属性做不同的处理。

一般情况下,它会处理以下几个方面的内容:

        内存页的属性

       节的偏移地址

       节的尺寸

       不进行映射的节

处理内容详解:

https://www.cnblogs.com/mayingkun/p/4200026.html

 

2.区块表(节表)和 区块(节)

https://www.cnblogs.com/kuangke/p/5406047.html

区块是可执行文件真正保存内容的东西

 

3.区块描述、对齐值以及RVA详解

https://www.cnblogs.com/kuangke/p/5410643.html

 

PE类型的病毒是在执行PE文件的时候,先执行病毒代码,再执行PE

 

4.输入表(导入表)详解

https://www.cnblogs.com/kuangke/p/5410650.html (上)

https://www.cnblogs.com/kuangke/p/5411547.html (下)

 

5.输出表(导出表)详解

https://www.cnblogs.com/kuangke/p/5419120.html

INT不可以改,IAT可以改

 

6.基址重定位

https://www.cnblogs.com/kuangke/p/5436807.html

 

7.资源

https://blog.csdn.net/dazhiliudazhi/article/details/24438623

 

当页对齐和文件对齐一样时,不需要转换找地址。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值