本文主要是介绍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值的整数倍。
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
当页对齐和文件对齐一样时,不需要转换找地址。
这篇关于PE知识总结(小甲鱼教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!