分享好友 最新动态首页 最新动态分类 切换频道
PE文件结构精讲
2024-12-26 10:39

PE文件详解之01

1.PE文件

​ PE文件是windows平台下的一种可执行的文件格式,包括可执行文件(后缀名exe),动态链接库(后缀名dll),驱动文件(sys文件)。在进程空间,通常由一个exe(主模块)和其他多个dll模块构成。

2.PE文件的大概组成

​ PE文件主要由两个部分组成,头部和主体部分。头部有DOS头,NT头,区段头组成,主体由各个区段组成,还有一些调试信息。主体各个区段主要包含的是要执行的代码和执行代码需要的数据。
PE文件的主要结构如下

内容描述DOS头部为兼容DOS程序而设立NT头部存储PE文件的全部属性,初始化信息等区段头表对于PE文件主体属性的分段描述,个数不定各个区段PE文件的主体,分段存储着可执行的代码,各种数据,资源等一些调试信息存储PE文件的调试信息

3.学习PE文件结构的先前概念
3.1 虚拟地址
​ 每个进程运行在4GB的虚拟空间中,这个空间中的地址叫做虚拟地址(VA)。

​ 3.2 相对虚拟地址
​ 进程运行过程中的虚拟空间中,一般会有一个加载进来的可执行文件(exe),和多个支持这个exe文件的动态链接库文件(dll),这些文件在进程空间中称为模块,每个模块加载到进程空间中的起始地址是随机的,模块的文件头在进程空间中的起始称为实际的加载基址,每个模块中的扩展头中有一个字段ImageBase,这个值时模块加载的默认加载基址,如果这个位置已经加载了其他模块,就会将要加载的模块安排到其他位置,所以模块中其他数据的定位就使用的相对虚拟地址。要定位这些数据需要知道实际的加载基址,用实际的加载基址减去模块中的ImageBase的值,加上模块中数据所在位置的相对虚拟地址(RVA)。RVA就是PE文件中各个部分相对于默认加载基址(ImageBase)的偏移。
公式:虚拟地址(VA) = 默认加载基址(ImageBase)+相对虚拟地址(RVA)

​ 3.3 文件偏移地址
​ 文件偏移地址(File Offset Address,FOA)和内存无关,它是指某个位置距离文件头的偏移。

​ 3.4 对齐粒度
​ 3.4.1 文件对齐
​ PE文件中的区块有对齐的概念,PE未加载到内存中是,即存储在磁盘上的区段间的对齐通常按照磁盘物理扇区的大小作为对齐粒度,即512字节,十六进制200h。
​ 3.4.2 内存对齐
​ windows操作系统内存属性的设置以页为单位,所以一步情况区块在内存中的对齐粒度是一个页的大小4KB,十六进制1000h,64位系统是8KB(2000h)
​ 3.4.3 资源数据的对齐
​ 资源文件中,资源字节码部分一般以双字(4个字节)方式对齐。

​ 3.5 数据目录
​ 数据目录表在PE文件的扩展头中,是一个数组,这个数组有16个元素,其中的15个是有意义的,记录了导入表,导出表,资源表,异常表,属性证书表,重定位表,调试数据,Architecture,Global Ptr,线程局部存储,加载配置表,绑定导入表,IAT,延迟导入表和cLR 运行时头部。数据目录表存储了各种数据的信息,从数据目录表中可以检索到存储在区块中的各种数据。

​ 3.6 PE 文件中的区块(区段),也叫做节
​ 不同的区块存储不同用途的数据,不同的区块的属性不同,比如代码段一般不运行用户修改,数据段则运行在程序运行过程中读和写,常量只能读。windows操作系统在加载PE文件时,会为不同属性的数据分配标记不同属性的页面,确保程序运行的安全。区块是PE文件中存放代码和数据的基本单元,存放不同类型的数据,比如代码,数据,常量,资源等。从操作系统加载的角度来看,节是相同属性数据的组合。

​ 3.7 字段:结构体中的某个成员

​ 3.8 镜像:程序在磁盘上的文件

​ 3.9 映像:将程序的镜像加载到内存,按内存对齐后的内存数据

4.PE文件各个结构的详细解析

4.1 DOS头的详解

 

​ 以上是PE文件中DOS头的结构体及每个字段的含义,大部分字段描述的dos文件(dos系统下的可执行文件)的描述信息,因为现在的PE文件都大部分的运行环境都是windows,所以dos头中的很多字段没有意义了,但是为了与dos系统兼容,保留了dos头,我们只要关注两个字段,第一个字段e_magic和最后一个字段e_lfanew。

字段1:e_magic,魔数,此值如果是0x4D5A,说明这个文件是一个dos文件,这个字段作为dos文件的标志,在系统中有宏定义 #define IMAGE_DOS_SIGNATURE 0X4D5A。
用途:判断一个文件是否是dos,或者PE文件
假设PE文已经读取到内存中,首地址是pFile,pFile是一个void类型的指针

 

字段2:e_lfanew, PE文件中,NT头相对于整个PE文件的偏移。使用它可以在文件中找到NT头。
用途:在内存中找到NT头
假设PE文已经读取到内存中,首地址是pFile,pFile是一个void类型的指针

 
 

4.2 PE文件中的NT头详解

 

NT头中的关键字段解释
字段1:PE标识 ,判断一个文件是否是PE文件的第二个标志,此值是0x00004550,对应的Ascii码为’PE00’则此文件是一个PE文件。
如何判断一个文件是PE文件
前提:将一个文件读取到内存中,并且在内存中文件的起始地址为pFile,pFile为一个void类型的指针。

 

4.2.1 NT头中的字段2:文件头

文件头,文件头是一个结构体,存储了PE文件的基本信息。

 

关键字段
字段2:NumberOfsections:记录了区段的数量,用于遍历区段
字段6:扩展头的大小,记录了扩展头的大小
其他字段
字段1:Machine:PE文件运行的CPU平台,0x014表示i386,也就是intel32位平台,0x0200代表intel 64位平台。
字段3:TimeDateStamp:PE文件被创建的时间,是一个非常大的32数字,解析这个数据使用如下函数
struct tm* gmtime(const time_t *timer);
将TimeDateStamp的地址强制转换后作为参赛,之后使用一个tm结构体接收就可以得到具体的时间。
字段4,字段5没有用
字段6:SizeOfOptinalHeader:扩展头的大小,32bitPE一般是0x00E0,64bitPE一般是0x00F0。
字段7:PE文件的属性。dll的属性值一般是0x0210,exe的属性值一般是0x010F。其中的属性具体含义可以将数值转换为二进制数据查看。
PE文件头中共有7个字段,但是只有5个有用。

用代码获取文件头中的 TimeDateStamp,然后转换成可读的时间
前提:PE文件已经读取到了内存中,首地址是pFile,void类型的指针。

 

FileTime结构体内容如下

 

4.2.3 NT头中关键字段3:NT头中的扩展头
扩展头

 

注意:扩展头最后一个字段是一个暑假目录表,默认有16项,有宏定义IMAGE_NUMBEROF_DIRECTORY_ENTRIES,值为0x10,十进制16,每一项是一个结构体,结构体如下

结构体中的VirtualAddress记录了各表在文件中的RVA,这些数据都是在PE的区段中。

 
各表在数据目录表中的索引描述IMAGE_DIRECTORY_ENTRY_EXPORT 0x0索引导出表(IMAGE_EXPORT_DIRECTORY)IMAGE_DIRECTORY_ENTRY_IMPORT 0x1索引导入表(IMAGE_IMPORT_DESCRIPTOR结构体数组)IMAGE_DIRECTORY_ENTRY_RESOURCE 0x2索引资源(IAMGE_RESOURCE_DIRECTORY结构)IMAGE_DIRECTORY_ENTRY_EXCEPTION 0x3索引异常处理程序表(IMAGE_RUNTIME_FUNCTION_ENTRY结构数组)IMAGE_DIRECTORY_ENTRY_SECURITY 0x4索引安全结构,它不加载入内存,它的地址成员是文件偏移,而不是RVAMAGE_DIRECTORY_ENTRY_BASERELOC 0x5索引基址重定位信息IMAGE_DIRECTORY_ENTRY_DEBUG 0x6索引调试信息IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 0x7版权IMAGE_DIRECTORY_ENTRY_GLOBALPTR 0x8全局指针目录,用在64位平台IMAGE_DIRECTORY_ENTRY_TLS 0x9指向线程局部存储初始化字节IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 0xA载入配置表IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 0xB绑定输入目录IMAGE_DIRECTORY_ENTRY_IAT 0xC导入地址表IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 0xD延迟载入描述IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 0xECOM信息

4.2.4 数据目录表的遍历

假设:PE文件已经读取到内存中的pFile位置,pFile为一个void类型的指针。

 

5.PE文件中的区块头表
扩展头后就是区块头,通过宏IMAGE_FIRST_SECTION32(NTHeader),这个宏对应一个函数,可以将NT头转换成第一个区块的头。区块头表由多个这样的结构体构成一个数组,以一个全0的结构体结尾。

 

5.2 如何解析区段头表信息:假设PE文件已经读取到了内存中的pbuff位置

 

常见的区段及其描述:区段名和区段属性功能没有必然联系,区段名是约定成俗的一种叫法,可以修改的。

区段名描述.text代码段,存储可执行的代码.data数据段,程序运行中需要的数据.bss为初始化的数据,比如static修饰的静态变量,为初始化的全局变量等.rdata只读数据段,存储常量,比如字符串.textbss和代码有关.idata和.edata存储导入表和导出表的信息.rsrc存储资源的区段.reloc段存储重定位信息的区段

注意:有些区段出现的时机是不同的,.bss段在磁盘上不存在(里边的为初始化的数据在内存中分配空间进行初始化),加载到内存中才存在,而.reloc在磁盘上存在,在内存中不存在。

5.3 RVA to FOA
PE中很多字段值是RVA,RVA是相对虚拟地址,要在文件中修改PE文件,需要使用FOA。

将一个RVA值转换为FOA, 我们需要将RVA在内存映像中比较此值落在那个区段中,然后使用RVA减去此区块头的RVA,得到了一个偏移,再加上文件中,此区块头的FOA,就计算出了此区块中某个位置的FOA。

公式:Offect(转) = RVA(转) -RVA(所在区段起始) + Offect(文件中所在区段起始)

假设:一个PE文件已经读取到内存中,且在内存中的地址为pFile,pFile为一个void类型的指针。


最新文章
client mac addr不能开机进不去系统_浅谈智能手机遭遇意外不能正常开机,如何提取机身的用户数据。...
    不论是我们日常生活中,还是办案需要,往往都会遇到一些意外情况,导致手机不能够正常开机,一部分可以通过维修达成目的,而另外一部分相对来说就比较困难了,小编借此和大家聊聊,不能
# 扫普通链接二维码打开小程序
为了方便小程序开发者更便捷地推广小程序,兼容线下已有的二维码,微信公众平台开放扫描普通链接二维码跳转小程序能力。普通链接二维码,是指开发者使用工具对网页链接进行编码后生成的二维码。 线下商户可不需更换线下二维码,在小程序后
360搜索seo1(360搜索seo现在还好做吗)
大家好,今天小编关注到一个比较有意思的话题,就是关于360搜索seo1的问题,于是小编就整理了2个相关介绍360搜索seo1的解答,让我们一起看看吧。seo是什么职业?一个小白,能自学会SEO吗?说实话比起那些考上公务员、事业单位的同学们,从
AI绘画出的克苏鲁是什么
AI绘画出的克苏鲁是什么?AI绘画出的克苏鲁是一个基于H.P. Lovecraft的小说中充满恐怖和神秘的虚构角色。这个角色被描绘为巨大、愤怒的神祇,拥有类似章鱼和人类混合体的外貌,身躯庞大且充满力量。克苏鲁被描述为在水中居住并对人类充满敌
Cloudflare发布免费工具来制止AI爬虫
AI模型的出现改变了网络爬虫的生态,为了让网站能够管理AI网络爬虫的数据抓取,Cloudflare本周发布了一系列工具,包括可用来查看AI爬虫具体活动的AI Audit,可一键封锁所有AI爬虫的Block AI Scrapers and Crawlers,也准备推出新组件,以让
2024年死磕这4款AI编程工具,助你代码起飞
2024年,AI编程工具的发展已经非常成熟了,它们可以极大地提高开发效率,帮助程序员解决复杂问题,并优化代码质量。以下是V哥在使用多款AI编程工具后,觉得非常优秀的四款,它们在2024年可能会成为开
HitPaw Photo Enhancer For Mac v2.7.0 模糊图片老照片Ai一键修复软件中文版
对于M1/M2/M3/M4芯片的电脑,如果软件官方未兼容 M1/M2/M3/M4,可以使用 Rosetta2 转译运行。在Apple Silicon ARM Mac电脑上安装Rosetta 2 运行intel应用苹果自家的M1和M2/M3/M4芯片都是ARM架构,所以M1和M2/M3/M4是完全通用的,未来就算有
kafka 可视化工具_关于StreamSets ETL工具的简单部署和使用
概述官网:https://streamsets.com/Streamsets是一款大数据实时采集和ETL工具,可以实现不写一行代码完成数据的采集和流转。通过拖拽式的可视化界面,实现数据管道(Pipelines)的设计和定时任务调度。最大的特点有:- 可视
k30 pro 值得买吗(k30pro值得入手吗)
摘要:会是你心目中的性价比旗舰么?K30 Pro深度体验2020年上半年各大厂商你方唱罢我登场相继推出了自家旗舰级手机,旗舰级手机不一定是市场销量最好的手机,但是却是各家厂商秀肌肉、展示实力的机型。Redmi作为从小米独立出来2020年上半年
AI设计理念与创作全解析:深入探讨人工智能创作背后的方法、流程与思维模式
随着人工智能技术的飞速发展设计已成为当今设计领域的一大热点。本文将围绕设计的创作说明理念深入探讨人工智能创作背后的方法、流程与思维模式,以期为广大设计工作者提供新的思路和启示。设计的创作说明理念是指在人工智能参与设计进展中
相关文章
推荐文章
发表评论
0评