PE结构4——区段与代码类型
- 格式:doc
- 大小:40.00 KB
- 文档页数:3
翻译:Jason Sun(木水鱼).2004年5月10日[译注:仅供大家学习使用,您在复制或使用此文档时请保留这个文件头]Peering Inside the PE: A Tour of the Win32 Portable Executable File FormatMatt Pietrek1994 年3月Matt Pietrek 是Windows Internals (Addison-Wesley, 1993)的作者。
他就职于Nu-Mega 技术有限公司,可通过CompuServe: 71774,362联系到他。
这篇文章出自1994年3月发行的Microsoft系统期刊。
版权所有﹫1994 Miller Freeman, Inc.保留所有权利。
未经Miller Freeman同意,这篇文章的任何部分不得以任何形式被复制(除了在评论文章里以摘要引用)。
一个操作系统的可执行文件的格式在很多方面是这个操作系统的一面镜子。
虽然学习一个可执行文件格式不是大多数程序员的首要任务,但是从中你可学到大量的知识。
这篇文章中,我将给出Microsoft为他们的基于Win32的系统所设计的PE文件格式的详细说明。
可以预知在未来,PE文件格式在Microsoft的所有操作系统包括Windows 2000中都将扮演着很重要的角色。
如果你在使用Win32s或WinNT,那么你已经在使用PE文件了。
甚至你只是在Windows3.1下用Visual C++编程,你也已在使用PE文件了(Visual C++的32位DOS扩展组件使用此格式)。
简而言之,PE格式已得到普遍应用并且在不短的将来也不会取消。
现在是时间找出这种新的可执行文件格式为操作系统所带来的影响了。
我不会让你盯住无穷无尽的16进制Dumps和详细讨论页面中每个单独位的重要性。
代替的,我将介绍PE文件格式中内含的概念并且把它们和你每天都会遇到的东西联系起来。
例如,线程局部变量的概念,比如declspec(thread) int i;它使我快要发疯了,直到我明白它是怎样在可执行文件里优雅而简单的实现的。
P四的结构简式范文P四结构(也称为PEEL结构)是一种常见的论文、演讲或段落组织结构,包含四个关键部分:P(Point),E(Evidence),E (Explanation),L(Link)。
下面是一个用P四结构展开的示例,长度超过1200字。
P:电子媒体对年轻人的影响电子媒体在当今社会中扮演着重要的角色,对年轻人的影响尤为突出。
这篇文章将探讨电子媒体对年轻人的影响,包括社交媒体的依赖性、信息过载的问题以及媒体素养的重要性。
E:社交媒体的依赖性E:信息过载的问题另一个电子媒体对年轻人影响的方面是信息过载。
年轻人在互联网上可以轻松获得各种各样的信息,但这也带来了信息过载的问题。
由于大量信息的涌入,年轻人可能会感到困惑和不知所措,很难筛选出真正有用的信息。
此外,不负责任的媒体和互联网内容也会误导年轻人,影响他们的价值观和决策能力。
因此,培养年轻人良好的媒体素养非常重要,使他们能够辨别和评估信息的可靠性和有效性。
E:媒体素养的重要性媒体素养是提高年轻人对电子媒体的正确使用和理解的关键。
通过教育和培训,年轻人可以学习如何辨别虚假信息,评估媒体的可靠性,以及合理利用媒体资源。
媒体素养还包括对隐私和安全的意识,以及如何避免网络欺凌和其他不良行为。
通过提高媒体素养,年轻人可以更好地应对电子媒体的挑战,获得更多的益处,同时减少负面影响。
L:总结电子媒体对年轻人的影响是一把双刃剑。
社交媒体的依赖性和信息过载带来了负面影响,但通过提高媒体素养,可以最大限度地利用电子媒体带来的益处,同时减少可能的负面影响。
加强对年轻人媒体素养的培养,不仅可以促进他们正确使用电子媒体,还有助于提高他们价值观、决策能力和信息辨析能力。
因此,我们应该重视这个问题,并采取积极的措施来帮助年轻人更好地应对电子媒体的影响。
深入剖析PE文件PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解.一、基本结构。
上图便是PE文件的基本结构。
(注意:DOS MZ Header和部分PE header的大小是不变的;DOS stub部分的大小是可变的。
)一个PE文件至少需要两个Section,一个是存放代码,一个存放数据。
NT上的PE文件基本上有9个预定义的Section。
分别是:.text, .bss, .rdata, .data, .rsrc, .edata, .idata, .pdata, 和.debug。
一些PE文件中只需要其中的一部分Section.以下是通常的分类:l 执行代码Section , 通常命名为:.text (MS) or CODE (Borland)l 数据Section, 通常命名为:.data, .rdata, 或.bss(MS) 或DATA(Borland).资源Section, 通常命名为:.edatal 输入数据Section, 通常命名为:.idatal 调试信息Section,通常命名为:.debug这些只是命名方式,便于识别。
通常与系统并无直接关系。
通常,一个PE文件在磁盘上的映像跟内存中的基本一致。
但并不是完全的拷贝。
Windows加载器会决定加载哪些部分,哪些部分不需要加载。
而且由于磁盘对齐与内存对齐的不一致,加载到内存的PE文件与磁盘上的PE文件各个部分的分布都会有差异。
当一个PE文件被加载到内存后,便是我们常说的模块(Module),其起始地址就是所谓的HModule.二、DOS头结构。
所有的PE文件都是以一个64字节的DOS头开始。
这个DOS头只是为了兼容早期的DOS操作系统。
这里不做详细讲解。
只需要了解一下其中几个有用的数据。
1. e_magic:DOS头的标识,为4Dh和5Ah。
分别为字母MZ。
PE⽂件结构解析说明:本⽂件中各种⽂件头格式截图基本都来⾃看雪的《加密与解密》;本⽂相当《加密与解密》的阅读笔记。
1.PE⽂件总体结构PE⽂件框架结构,就是exe⽂件的排版结构。
也就是说我们以⼗六进制打开⼀个.exe⽂件,开头的那些内容就是DOS头内容,下来是PE头内容,依次类推。
如果能认识到这样的内含,那么“exe开头的内容是不是就直接是我们编写的代码”(不是,开头是DOS头内容)以及“我们编写的代码被编排到了exe⽂件的哪⾥”(在.text段,.text具体地址由其相应的IMAGE_SECTION_HRADER指出)此类的问题答案就显⽽易见了。
exe⽂件从磁盘加载到内存,各部份的先后顺序是保持不变的,但由于磁盘(⼀般200H)和内存(⼀般1000H)区块的对齐⼤⼩不⼀样,所以同⼀内容在磁盘和在内存中的地址是不⼀样的。
换⾔之你在磁盘上看到⼀段内容⼀内容要到在内存中找到它--假设它是能映射到内容的部份--那么要做相应的地址转换。
(⽐如你在Ultraedit 中看到某⼏个字节⽽想在OllyDbg中找到这⼏个字节那么需要进⾏地址转换)另外要注意,PE⽂件中存放的地址值都是内存中的地址,这些地址在OllyDbg中不需要转换到其指定的位置就能找到其指向的内容;这要根据这个地址找到内容在Ultraedit的地址,需要将此RVA址转换成⽂件偏移地址。
还要注意DOS头/PE头/块表,映射到内存时属同⼀区块⽽且是第⼀区块,所以此三者上的RVA和⽂件偏移地址是相等的。
2.DOS头部2.1MS-DOS头部(IMAGE_DOS_HEADER)最后的e_lfanew即是PE⽂件的RVA地址我们在前边已经提过,对于DOS头/PE头/区块表三部分RVA和⽂件偏移地址是相等的,所以上边在⼗六进制⽂本编缉器中,直接转向e_lfanew指向的000000B0可以正好找到PE头。
2.2DOS stubDOS stub是当操作系统不⽀持PE⽂件时执⾏的部分,⼀般由编译器⾃⼰⽣成内容是输出“This program cannot be run in MS-DOS mode”等提⽰。
PE文件各节所包含的内容2008-11-13 13:34关于 sections 的意义以及它如何定位,相信你已有个概念。
现在我们要看看在EXE 和OBJ 档中的一些常见的 sections 。
虽然我所列的并不是全部,但已经涵盖了你每天会接触到(但也许你自己并不知道)的 sections 。
排列次序是根据其重要性以及遭遇它们的频繁度。
.text section.text 内含所有一般性的程序代码。
由于 PE 文件在 32 位模式下跑,并且不受约束于 16 位元节区,所以没有理由把程序代码分开放到不同的 sections 中。
联结器把所有来自 .OBJ的 .text 集合到一个大的 .text 中。
如果你使用Borland C++,其编译器制作出来的 code section 名为 CODE 而不是 .text 。
请看稍后「Borland CODE 以及 .icode sections 」一节。
我很惊讶地发现,在 .text 中除了编译器制作出来的码,以及runtime library 的码之外,还有一些其它东西。
在 PE 文件中,当你呼叫另一模块中的函数(例如USER32.DLL 中的 GetMessage ),编译器制造出来的 CALL 指令并不会把控制权直接传给 DLL 中的函数,而是传给一个JMP DWORD PTR [XXXXXXXX]指令,后者也位于 .text 中。
JMP 指令跳到一个地址去,此地址储存在 .idata 的一个 DWORD 之中。
这个DWORD 内含该函数的真正地址(函数进入点),如图8-4 所示。
图8-4 一个 PE 档呼叫 imported function 。
沉思良久,我终于了解为什么 DLL 的呼叫需要以这种方式实现。
把对同一个DLL 函数的所有呼叫都集中到一处,加载器就不再需要修补每一个呼叫 DLL 的指令。
PE 加载器需要做的,就只是把 DLL 函数的真实地址放到 .idata 的那个 DWORD 之中,根本就没有程序代码需要修补。
PE文件格式详解(一)0x00 前言PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件。
了解PE文件格式有助于加深对操作系统的理解,掌握可执行文件的数据结构机器运行机制,对于逆向破解,加壳等安全方面方面的同学极其重要。
接下来我将通过接下来几篇详细介绍PE文件的格式。
0x01 基本概念PE文件使用的是一个平面地址空间,所有代码和数据都被合并在一起,组成一个很大的组织结构。
文件的内容分割为不同的区块(Setion,又称区段,节等),区段中包含代码数据,各个区块按照页边界来对齐,区块没有限制大小,是一个连续的结构。
每块都有他自己在内存中的属性,比如:这个块是否可读可写,或者只读等等。
认识PE文件不是作为单一内存映射文件被装入内存是很重要的,windows加载器(PE加载器)便利PE文件并决定文件的哪个部分被映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中。
当磁盘的数据结构中寻找一些内容,那么几乎能在被装入到内存映射文件中找到相同的信息。
但是数据之间的位置可能改变,其某项的偏移地址可能区别于原始的偏移位置,不管怎么样,所表现出来的信息都允许从磁盘文件到内存偏移的转换,如下图:PS:PE文件头以下的地址无论在内存映射中还是在磁盘映射中都是一样的,当内存分页和磁盘分页一致时无需进行地址转换,只有当磁盘分页和内存分页不一样时才要进行地址转化,这点很重要,拿到PE文件是首先查看分页是否一致。
前两天一直没碰到内存和磁盘分页不一样的,所以这个点一直没发现,今天特来补上。
下面要介绍几个重要概念,分别是基地址(ImageBase),相对虚拟地址(Relative Virtual Address),文件偏移地址(File Offset)。
1)基地址定义:当PE文件通过Windows加载器被装入内存后,内存中的版本被称作模块(Module)。
映射文件的起始地址被称作模块句柄(hMoudule),可以通过模块句柄访问其他的数据结构。
PE结构解析的代码0x00 32位程序的PE结构DOS头typedef struct _IMAGE_DOS_HEADER { // DOS .EXE headerWORD e_magic; // Magic numberWORD e_cblp; // Bytes on last page of fileWORD e_cp; // Pages in fileWORD e_crlc; // RelocationsWORD e_cparhdr; // Size of header in paragraphsWORD e_minalloc; // Minimum extra paragraphs neededWORD e_maxalloc; // Maximum extra paragraphs neededWORD e_ss; // Initial (relative) SS valueWORD e_sp; // Initial SP valueWORD e_csum; // ChecksumWORD e_ip; // Initial IP valueWORD e_cs; // Initial (relative) CS valueWORD e_lfarlc; // File address of relocation tableWORD e_ovno; // Overlay numberWORD e_res[4]; // Reserved wordsWORD e_oemid; // OEM identifier (for e_oeminfo)WORD e_oeminfo; // OEM information; e_oemid specificWORD e_res2[10]; // Reserved wordsLONG e_lfanew; // File address of new exe header} IMAGE_DOS_HEADER;nt头 = PE标识 + ⽂件头+扩展头typedef struct _IMAGE_NT_HEADERS {DWORD Signature;IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER32 OptionalHeader;} IMAGE_NT_HEADERS32,⽂件头typedef struct _IMAGE_FILE_HEADER {WORD Machine;WORD NumberOfSections;DWORD TimeDateStamp;DWORD PointerToSymbolTable;DWORD NumberOfSymbols;WORD SizeOfOptionalHeader;WORD Characteristics;} IMAGE_FILE_HEADER;扩展头,⽂件头中的SizeOfOptionalHeader指定了扩展头的⼤⼩。
pe文件框架结构PE文件是指Windows操作系统平台下的可执行文件,它是一种二进制程序文件,在Windows操作系统中扮演着非常重要的角色。
因此,了解PE文件的框架结构对于了解Windows操作系统的关键机制和安全性方面有很大的帮助。
本文将分步骤阐述PE文件框架结构。
一、DOS头DOS头是PE文件结构的开始部分,用于在早期版本的Windows操作系统上运行应用程序。
DOS头包含了一些用于MS-DOS的信息和可执行程序的信息,比如可执行程序的起始地址和执行入口点。
二、PE文件头PE文件头是指非常关键的PE文件头部区域,包含了PE文件的组织结构信息和代码在内存中的布局信息。
PE文件头由四部分组成,分别是文件标识头(Signature),文件头部(File Header),可选头部(Optional Header),数据目录(Data Directory)。
三、节表在PE文件头部区域中,还有一块重要的信息是节表。
节表用于存储PE 文件中的区段信息,包括代码段、数据段、资源段和导出等信息。
在代码段、数据段和资源段中,存储着PE文件的程序和数据,节表为了对各个节进行可控制的访问,便于程序的控制和调试。
四、数据目录PE文件头部区域中还包含了一个数据目录,在32位PE中,数据目录通常有16个数据目录,用于存储PE文件中的各种信息,如导入表、导出表、资源表、重定位表等等。
五、代码段代码段是PE文件的主要部分,它包含了PE文件的执行代码和程序逻辑,是PE文件的核心内容。
代码段的格式主要是二进制代码,对程序的执行有很大的影响。
六、数据段数据段主要用来存放程序中要用到的各种数据,包括全局变量、局部变量和常量等。
数据段会经常开辟空间以存储函数中的局部变量和运行时生成的各种实例对象。
综上,PE文件是Windows操作系统平台下的可执行文件,其框架结构主要由DOS头、PE文件头、节表、数据目录、代码段和数据段组成。
了解PE文件的结构以及各个部分之间的关联是非常重要的,既有助于我们更好的理解操作系统机制,又有助于我们在软件开发和安全领域中进行有效的分析和优化。
甲壳虫免杀VIP教程
专业的免杀技术培训基地
我们的口号:绝对不一样的免杀教程!绝对不一样的实战体验!清晰的思路!细致全面的讲解!让你感到免杀原来可以这么简单!
动画教程只是起到技术交流作用.请大家不用利用此方法对国内的网络做破坏. 国人应该团结起来一致对外才是我们的责任.由此动画造成的任何后果和本站
无关.
-------------------------------------------------------------------- 【免杀PE结构班】制作:Just41(carrieyz)
第四节【PE文件常见区段及其代码类型】
一、区段表的结构
PE文件格式中,所有的区段信息位于可选PE头之后。
每个区段信息为40个字节长,并且没有任何填充信息。
区段信息被定义为以下的结构:
学名:免杀技术说明大小LOADPE Name:区段名称,如".text" [8h]
SizeOfRawData:RV A偏移大小[4h] VSize VirtualAddress:区段RV A起始地址[4h] VOffset PointerToRawData:区段物理偏移大小(偏移量)[4h] RSize PhysicalAddress:区段物理起始地址[4h] ROffset VirtualSize:真实长度[4h] PointerToRelocations:重定位的偏移[4h] PointerToLinenumbers:行号表的偏移[4h] NumberOfRelocations:重定位项数目[2h] NumberOfLinenumbers:行号表的数目[2h]
Characteristics:区段属性[4h] 标志
计算方式:
区段表的文件偏移地址=PE头的文件偏移地址+14h+可选PE头大小+1
首先从0X3Ch处得到PE头的文件偏移地址,然后由PE头的文件偏移地址+14h得到可选PE头大小,再将上面三个数据相加再+1就得到区段表的文件偏移地址了。
VSize的大小只是效验下是否跨越下一个节了,或者是否超出了SizeOfImage,如果出现越界问题,提示非法32位应用程序,否则的话,它的值没有意义,节的大小不是由它决定的......对非最后一个节,按节间VOffset之差,最后一节用SizeOfImage-VOffset。
二、PE文件常见区段及其代码类型
一个Windows NT的应用程序典型地拥有9个预定义段,它们是:常用区段名区段类型区段说明
.text 代码区段汇编语言
.bss 未初始化区段附加数据(某些配置信息).rdata 只读数据区段输入、输出表
.data 全局变量数据区段字符串
.rsrc 资源区段资源信息
.edata 只读数据区段输出表
.idata 只读数据区段输入表
.pdata 只读数据区段
.debug 调试区段
-----------------------------------------------------------------
.code
.reloc 重定位表区段重定位表
其他加壳加密软件例子
.upx UPX加壳
.vmp VMP加密
其中资源区段.rsrc(资源工具:Resource Hacker,FreeRes和eXeScope只识别其区段名)是判断某些木马是否需要导出资源再进行免杀的关键。
今后课程安排如下:免杀之PE结构
《认识输入表并手动修改》
《认识输出表并手动修改》
《认识重定位表并手动修改》
《认识资源表并学会导入导出》
免杀之免杀方法
《免杀前的特征码归类》
《汇编下修改特征码方法(N种) 》
《字符串特征码修改方法》
《输入表特征码免杀方法》
作业:
1)假如一个PE文件的0x3C处为40 00 00 00,0x54处为E8 00 8E 81,那么其区段表起始偏移地址为多少?
2)以下区段名不符合要求的是:
1、.code
2、data_image
3、加花区段
4、.134217
5、.PE输入表
6、[][][][]
7、JKS不错
8、.data[][][][] 3)某个PE文件的区段有2个,区段名分别是.rsrc和.reloc。
请问,该区段有重定位表和可导出资源吗?为什么?
参考答案请翻页
参考答案:
1)0x13C。
2)2、5、8
3)不确定是否有重定位表和可导出资源,因为尽管一般情况下.rsrc表示为资源区段,.reloc表示为重定位区段,但是其区段名并不能代表该区段的属性,区段的属性还是由其代码的性质决定的。