文件分析

Windows操作系统的PE文件(Portable Executable)和Linux操作系统下的ELF文件都是可执行文件的一种,均以UNIX平台的COFF(Common Object File Format,通用对象文件格式)制作而来.

PE文件是32位的可执行文件,也称为PE32,后来的64位可执行文件称为PE+或PE32+,是PE的扩展.

PE文件有如下几种格式:

严格来说,除了OBJ文件,其他的格式都是可执行的(部分可以以调试,服务等特殊方式运行)

我们首先使用010 Editor进行分析,分析样例使用Windows XP SP3操作系统下的notepad记事本程序(32位).

需要明确的一点是,PE文件是可执行文件,这意味着其需要载入到内存中,PE文件在磁盘和内存中的结构是不同的.

下图展示了二者的差异:

从DOS头到节区头是PE头部分,下面的合称为PE体.

为了定位PE中的数据,在文件中使用偏移(offset),在内存中使用VA(虚拟地址)进行定位.从图中可以看出,PE加载到内存中后,节区的大小和位置会发生变化,而不是原封不动地载入内存.

计算机中,为了提高处理文件、内存,网络包的效率,使用"最小基本单位"这一概念,PE文件中也类似.各节区的起始位置都在文件/内存最小单位的倍数位置处,空白的部分使用NULL进行填充.

VA指的是进程虚拟内存的绝对地址,RVA(Relative Virtual Address)则为相对地址,即相对基址的偏移.

PE头内部的信息大多为RVA,由于在载入内存时,该处可能已经加载有其他数据,所以需要重定向到其他位置,因此,只要能够保证RVA不变,根据不同的VA基地址,都可以正确找到各个数据.

换算公式如下:

RVA+ImageBase=VA

32位操作系统中,各进程有4GB的虚拟内存,所以VA范围从00000000~FFFFFFFF.

PE头包含各种结构体,保存着PE文件的各种信息.

PE头创建之时,DOS文件正在被广泛使用,理所当然地PE文件对DOS文件进行了兼容,方法就是在PE头最前面加上一个DOS头.

该结构体占用40字节,捡关键的说:

e_magic成员:DOS签名(4D5A即为ASCII"MZ")

e_lfanew成员:该成员的值指向后续的NT头所在位置

(注意小端序存储)

该部分可选,有无均可,不影响程序运行,大小不固定.

其中40到4D区域为16位的汇编指令,这里用于输出一个错误提示,即告诉用户该程序不能够在DOS模式下运行.

合理运用DOS存根可以产生一个既可以在DOS下运行,还可以在win32下运行的程序.

该结构体大小为F8,非常大.

Signature:值为50450000的ASCII"PE"00的签名

FileHeader:文件头

OptionalHeader:可选头

该结构体存储了文件的大致属性.其中的几个十分重要,错误设置将导致文件无法正常运行.

Machine:CPU的Machine码,兼容Intel x86芯片的Machine码为14C,其余还有:

NumberOfSections:指出节区数,如果与实际不符,则会运行错误.

SizeOfOptionalHeader:尽管NT头的最后一个成员(IMAGE_OPTIONAL_HEADER32结构体)的大小已经定义,但是windows的PE装载器需要查看SizeOfOptionalHeader的值,以确定IMAGE_OPTIONAL_HEADER32结构体的大小.

Characteristics:根据该成员来识别文件的属性-是否可运行,是否为DLL文件等.使用bit OR形式组合起来.

值如下:(记住0002h和2000h这两个值)

该头是PE头中最大的一个.

重要的成员:

Magic:为IMAGE_OPTIONAL_HEADER32时,值为10B;为IMAGE_OPTIONAL_HEADER64时,值为20B.

AddressOfEntryPoint:存有EP(代码入口点)的RVA值.十分重要.

ImageBase:指出最先被装载的地址.

EXE,DLL文件被装载到07FFFFFFF;SYS文件被装载到80000000FFFFFFFF.

SectionAlignment,FileAlignment:指定最小单位.

SizeOfImage:指出PE Image在虚拟内存中所占空间的大小.一般和文件中不同.

SizeOfHeader:指出整个PE头的大小.

Subsystem:用来区分系统驱动文件和普通的可执行文件.

NumberOfRvaAndSizes:用来指定DataDirection数组的个数(?).

DataDirectory:各种表项,例如导入表和导出表等.每个元素都对应一种表项.

节区头定义了各个节区的属性.PE文件将各种数据存储在不同的节区.而且不同的节区会有不同的权限:

节区头是由IMAGE_SECTION_HEADER结构体组成的数组,每个结构体对应一个节区:

结构体如下:

重要的属性有如下几个:

这些属性定位了后续PE体中对应的一个节区,例如.text节区.

这是一个最基本的转换,由于PE磁盘文件与其载入到内存的镜像文件并不完全一致,所以需要将进行RAW与RVA之间的转换.

首先查找RVA所在的节区,然后找到该节区的起始地址Virtual Address,注意这里的Virtual Address仍然是RVA(?).

然后找到PointerToRawData,就可以做差了.公式如下:

含义即为:文件中该位置(RAW)到节区起点的偏移(两者之差) 与 内存映像中位置(RVA)到本节区起点的偏移(两者之差) 是相等的.

Windows过去并没有DLL,只有库(Library)这一概念,这导致每一个程序要调用某一个库代码,都要进行包含,这就导致大量的空间浪费(每个使用该库的程序都有其一本副本).

现在,引入了DLL这一概念,可执行文件直接加载该DLL即可.在内存中只有一个DLL的代码.

加载DLL的方式有两种,一种是"显式链接",即使用时进行加载,使用后释放内存;另一种是"隐式链接",程序开始即加载,运行结束后释放,这种方式就与IAT有关.

PE文件提供了IAT内存区域,这里是编译器指定的一些内存,文件执行时,PE装载器将DLL中某些函数的实际地址(运行时确认)写入到这个位置,在程序代码中,访问一个库函数并不会将其硬编码到代码中,而是以IAT内存区域中某个内存中存储的地址值去进行call,这个地址值即为PE装载器在启动程序时确认的地址.这样实现由2个原因:

之所以这样间接调用,是因为由于操作系统版本的不同,软件版本的不同,各个DLL中函数的实际地址并不相同,为了保证准确,将获取库函数实际地址的任务交给了PE装载器,在运行时确认当前DLL中库函数的地址.

这就是所谓的DLL重定向,我们无法在编写应用程序的时候就绝对确定一个DLL在内存中的位置.

因此,实际上编译器需要指定程序中的一个内存空间,供PE装载器在执行时将正确的地址写入这个内存空间,在需要调用某个函数时,就从这个内存空间中读取载入的地址,然后进行call调用.

该结构体中记录着PE文件要导入哪些库文件.

每一个导入的库都会对应这样的一个结构体,组成结构体数组,最终以一个NULL填充的结构体结束:

有时候,INT数组与IAT数组指向同一个位置(如下图),但是很多情况下并不是这样的.

PE装载器将导入函数写入IAT的顺序如下:

以notepad为例.

该数组并不在PE头中,而是在PE体中,不过,查找其位置的信息存储在PE头中.

在PE头的IMAGE_OPTIONAL_HEADER32中,DataDirectory[1].VirtualAddress的值即为IMAGE_IMPORT_DESCRIPTOR结构体数组的起始地址.

另外,IMAGE_IMPORT_DESCRIPTOR结构体数组也称为IMPORT Directory Table.

查看notepad的DataDirectory数组如下:

找到对应的RVA(7604),根据公式转换为RAW(6A04),从文件中找到该位置:

上图就是找到的数组,当前定位到其第一个元素,也就是第一个导入的dll库.

OriginalFirstThunk - INT:INT为一个包含导入函数信息的结构体指针数组.根据这个数组的信息才能够找到对应函数的地址(参考后面EAT的内容).

跟踪该地址(同样计算RAW),得到:

这里的每一个地址都指向一个IMAGE_IMPORT_BY_NAME结构体(如下所示).

根据每一个元素,例如第一个0x00007A7A(注意小端序),转为RAW为6E7A,继续跟踪可找到第一个函数名:

这里的前2个字节(000F)为Ordinary,为库中函数的固有编号.

FirstThunk - IAT:IAT即为Import Address Table

IAT的RVA:12C4-->RAW:6C4,跟踪过去得:

这里的第一个元素被硬编码为76344906,但无实际意义,运行时会被准确的地址值覆盖.

为了获取库文件中的函数信息,库必须使用EAT机制,用来求得库中各函数的地址.PE文件中,仅有一个IMAGE_EXPORT_DIRECTORY结构体来说明库EAT,而不是向IAT那样的数组,因为IAT可以导入多个库,而一个库只能导出自己.

重要成员如下:

总结来说就是,从函数名称数组中找到该函数名称的字符串,根据该字符串的下标name_index去查找ordinal数组,对应位置的元素值为ordinal,最后,在函数地址数组中以ordinal为下标找到函数的起始地址.

和IAT同样,在NT头的DataDirectory数组中找到EAT的位置:

跳转到0x1A2C即可找到EAT:

接下来就可以根据前面说的步骤去查找某个具体的函数了.

PE文件是Windows系统的可执行文件格式,了解PE文件结构才能够进一步学习更深的逆向技术.

后续还会看到各种PE文件的变体,例如被特殊的压缩程序进行压缩,用于非正常行为的程序(例如病毒等).

THE END
0.PE文件格式详细解析(一)pe格式本文深入解析Windows下的PE文件格式,包括PE文件的种类、位置标识、整体结构等内容,并通过WinHex和PEtools等工具进行实例演示。 PE文件格式详细解析 本篇文章将会详解Windows操作平台下PE文件格式,同时以具体的示例辅佐大家更好理解PE文件格式。本文章主要使用到以下两个工具:WinHex:用于将PE文件以16进制和ASCII码显示;PEjvzquC41dnuh0lxfp0tfv8|gkzooa=<976>:68ftvkimg8igvcomu864336:;>5
1.PE文件结构详解本文深入解析PE文件结构,包括DOS头部、PE头部、节表、节数据等内容,阐述PE文件在磁盘与内存中的状态差异,以及如何利用PE文件进行代码修改、节的扩展与合并等高级操作。 PE 视频学习 1.认识PE 首先,先介绍什么是可执行文件(executable file):可以由操作系统进行加载执行的文件 jvzquC41dnuh0lxfp0tfv8vsa7764:7421gsvrhng1jfvjnnu1734997:9>
2.PE文件结构详解针对在硬盘上存储文件中的地址,称为原始存储地址或物理地址,表示距离文件头的偏移。 针对加载到内存以后映象中的地址,称为相对虚拟地址(RVA),表示相对内存映象头的偏移。 RVA 是当PE 文件被装到内存中后,某个数据位置相对于文件头的偏移量。 举个例子:如果 Windows 装载器将一个PE 文件装入到 00400000h 处的内jvzquC41z|4bnr~wp0ipo8sgyu524;;9
3.PE文件整体结构介绍吾爱破解1、本文章使用的将PE文件编译为十六进制字节码格式用的是C32Asm,但大家实际操作还是推荐使用WinHex,工具均取自于爱盘。2、这篇文章主要是讲PE文件的整体结构,还有数据目录表没有具体讲解,数据目录之后会以单独的形式一个个讲解。PE文件是可移植的可执行的文件,什么是可执行文件?可执行文件是为进程创建所服务的,jvzquC41yy}/7;uqlkk/ew4vjtkbf6698796966/30nuou
4.PE文件详解(C制作PE格式解析器)pe文件解析器本文介绍了PE文件的基本结构,包括DOS头部、PE文件头、节表等,并深入探讨了导入表和导出表的工作原理。此外,还提供了一个使用C语言编写的简易PE文件解析器示例。 0x00:前言 PE文件可以说是在逆向的各个领域都有涉及,特别是病毒领域,如果你是一名病毒制造者,那你肯定是对PE文件有详细的了解,那么这里我就详细介绍一jvzquC41dnuh0lxfp0tfv8HjctrfuPtfZ1gsvrhng1jfvjnnu1>97B<625
5.PE文件格式分析pe文件格式详解本文详细解析了PE文件的基本概念、结构分析、区块对齐、文件偏移与RVA转换、输入表与输出表、基址重定位等核心内容,提供了深入理解PE文件的全面指南。 一、PE的基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何jvzquC41dnuh0lxfp0tfv8xjkvjci8ftvkimg8igvcomu89;95:5;>
6.PE文件格式详细解析(二)pe头的大小本文深入解析PE文件结构,包括NT头、可选头、节区表等关键组件,揭示PE文件如何组织代码与数据。 3.PE文件的结构 3.2 NT头 由一个IMAGE_NT_HEADERS结构组成,该结构中包含了PE文件被载入内存时需要用到的重要域。通过DOSheader中的e_lfanew,可以直接定位到真正的PE Header部分。该结构体的大小为0xf8字节。 jvzquC41dnuh0lxfp0tfv8|gkzooa=<976>:68ftvkimg8igvcomu86433715@:
7.PE文件结构解析DOS Stub(存根)实际上是个有效的 MS-DOS .EXE 或者.COM 程序(如果文件格式不对会报错),在不支持 PE文件格式的操作系统中,它将通过简单调用中断21h服务9来显示字符串"This program cannot run in DOS mode"或者根据程序员自己的意图实现完整的 DOS 代码。它的大小一般不能确定。利用链接器(linker)的 /STUB:fijvzquC41dnuh0lxfp0tfv8~i{cthi~fpi1gsvrhng1jfvjnnu1;33?;:4
8.PE文件结构详解快速的计算方法是从文件的偏移0x3C(第59字节)处获得一个4字节的PE文件签名的偏移地址,这个偏移地址就是本文所定义的DOS头的大小。NT头在32位系统是244字节,在64位系统是260字节。节头的大小由NT头的第1部分的NumberOfSections(节的数量)*40字节(每个节头是40字节)得出。如此,DOS头、NT头、节头3个头的大小jvzquC41dnuh0lxfp0tfv8vkokthaƒmcpi5bt}neng5eg}fknu5859>;2;
9.C++PE文件格式解析类(轻松制作自己的PE文件解析器)pe文件绑定(c++本文介绍了一个用C++封装的高效PE文件格式解析类,提供了丰富的接口函数,便于理解和使用。适用于学习PE文件结构及开发PE文件解析软件。 PE是Portable ExecutableFileFormat(可移植的执行体)简写,它是目前Windows平台上的主流可执行文件格式。 PE文件中包含的内容很多,具体我就不在这解释了,有兴趣的可以参看之后列出的参考jvzquC41dnuh0lxfp0tfv8ucuenfp8ftvkimg8igvcomu8:286654:
10.Windows基础知识PE结构之初始PE当执行体在支持PE文件结构的操作系统中执行时,PE装载器将从IMAGE_DOS_HEADER结构的e_lfanew字段里找到NT头的起始偏移量,用其加上基址,得到PE文件头的指针。 在C++中Signature会被预处理为IMAGE_NT_SIGNATURE #define IMAGE_NT_SIGNATURE 0x00004550// PE00 FileHeader 文件头,表现jvzquC41z|4bnr~wp0ipo8sgyu526=98
11.有效利用PE文件内部空间植入用户程序windowspe广告应用植入本文介绍了一种利用PE文件内部空间植入用户程序的方法。通过在PE文件的节间空隙存储额外代码,实现代码的隐蔽植入。该技术适用于寄生型病毒程序,能够有效避免因文件体积增大而被轻易检测。 【文章标题】: 有效利用PE文件内部空间植入用户程序 【文章作者】: 空手剑客 jvzquC41dnuh0lxfp0tfv8hpalkwqwx1ctzjeuj1fgzbkux143624A<
12.PE文件查看器(PeViewer)电脑版下载2025最新文件分割口碑排行榜 PDF猫分割合并软件 小说分割器(TXT文本) peview.exe Ultra Video Splitter 下载服务协议见页面底部 基本简介 PE文件查看器(PeViewer)是一款强大的PE文件查看器,PeViewer作为国人研制开发十分的强大并便捷,下载使用这款PeViewer文件,可以任意的dll等文件,马上下载PeViewer吧。 jvzq<84yyy4ppunpgfuxp7sgv1yph}4;997777mvo
13.LordPE下载LordPE(PE文件编辑器)v1.4绿色汉化版下载LordPE v1.4绿色汉化版是一款非常好用PE文件编辑工具,winwin7小编听闻该软件在网上享有“最好的PE文件修改工具”的称号!LordPE是一款相当专业功能强大的pe文件修改器工具,支持用户快速方便的修改pe文件,并且软件是完全汉化的,我们使用起来也完全不会因为不懂英文而烦恼,如有需要的用户快来下载这款反编译预处理的利器jvzq<84yyy4xkw|kp94dqv4uqhz06<950jznn
14.逆向基础PE文件结构windowspe结构本文详细介绍了PE文件的结构,包括DOS头、NT头、文件头、可选PE头、区段头等关键部分,并通过代码示例展示了如何解析这些头信息。同时,解释了PE文件在Windows平台上的执行过程,如DOS头的兼容性、PE头的标志、可选PE头中的入口点和内存基址等。此外,还涵盖了导出表、导入表、重定位表和TLS(线程局部存储)的概念及其jvzquC41dnuh0lxfp0tfv8FrrYnjvndUvcx0c{ykenk0fnyckny03;;295:18
15.pe文件结构PE文件的全称是Portable Executable,意为可移植的可执行文件,是微软Windows操作系统上广泛使用的程序文件格式(包括间接被执行的文件,如DLL)。PE文件被称为“可移植的”是因为在所有平台(如x86、Alpha、MIPS等)上实现的Windows NT及其后续版本(如Windows 95、Windows 2000、Windows XP、Windows Vista、Windows 7、WindowsjvzquC41dnuh0lxfp0tfv87525e93:;757>0c{ykenk0fnyckny03=5992>56
16.深入解析WindowsPE文件结构及其关键组成部分本文详细介绍了WindowsPE文件的基本概念,包括PE文件头、DOS头部、区块数据、虚拟地址和RVA等关键部分,展示了PE文件的内存映射和地址转换机制,以及如何通过API获取模块信息。 部分PE文件结构 一.PE文件基本概念 ​ PE文件是windows系统中遵循PE结构的文件,比如以.exe .dll .ocx .sys .com为后缀名的文件以及系统驱动jvzquC41dnuh0lxfp0tfv8r2a9;36<8841gsvrhng1jfvjnnu1748@76;6;
17.PE文件(一)PE结构概述PE文件(一)PE结构概述 本文详细介绍了Windows操作系统下的PE结构文件,包括.exe文件的内存分配、虚拟内存、PE文件的节和节表、DOS头与NT头的作用,以及编译器对文件对齐的影响。展示了不同操作系统文件结构的区别,以及如何手动解析PE文件的DOS头和NT头。 PE结构简述jvzquC41dnuh0lxfp0tfv87523e8:A8:86=0c{ykenk0fnyckny03<<;5;827
18.详解PE文件(一):PE文件基础概念详解PE文件(一):PE文件基础概念 PE(Portable Executable)文件格式是Windows操作系统中用于可执行文件(.exe)、动态链接库(.dll)和系统驱动程序(.sys)的标准文件格式。它是Windows平台上软件执行的基础,理解PE文件格式对于系统编程、逆向工程、恶意软件分析和软件安全等领域都很重要。jvzquC41dnuh0lxfp0tfv8lggukiq€ftf461294ctvodnn4fgvgjn|4376=53@55
19.PE文件格式详解:深入理解Windows可执行文件结构// 执行PE文件时,PE装载器先创建进程,再将文件载入内存,// 然后把EIP寄存器的值设置为ImageBase+AddressOfEntryPoint''// PE文件的Body部分被划分成若干节段,这些节段储存着不同类别的数据。'DWORD SectionAlignment;'// SectionAlignment指定了节段在内存中的最小单位, -> 00 00 10 00'DWORD FileAlignment;'//jvzquC41dnuh0lxfp0tfv8|gkzooa?75;3=478ftvkimg8igvcomu86676;82B7
20.PE文件结构剖析基本结构pe结构主模块基址PE文件衍生于早期建立的COFF文件格式,EXE和DLL文件实际上用的是同一种文件格式,唯一的区别就是用一个字段标识出这个文件是EXE还是DLL。64位Windows格式为PE32+。只是简单的将以前的32位字段扩展到64位。 重要要点 要认识到PE文件不是作为单一内存映射文件被装入内存的。 jvzquC41dnuh0lxfp0tfv8vsa669;9<781gsvrhng1jfvjnnu1>3:>>9;;