PE结构4——区段与代码类型

合集下载

PE文件结构详解 超详细 C代码

PE文件结构详解 超详细 C代码

翻译: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四的结构简式范文

P四的结构简式范文P四结构(也称为PEEL结构)是一种常见的论文、演讲或段落组织结构,包含四个关键部分:P(Point),E(Evidence),E (Explanation),L(Link)。

下面是一个用P四结构展开的示例,长度超过1200字。

P:电子媒体对年轻人的影响电子媒体在当今社会中扮演着重要的角色,对年轻人的影响尤为突出。

这篇文章将探讨电子媒体对年轻人的影响,包括社交媒体的依赖性、信息过载的问题以及媒体素养的重要性。

E:社交媒体的依赖性E:信息过载的问题另一个电子媒体对年轻人影响的方面是信息过载。

年轻人在互联网上可以轻松获得各种各样的信息,但这也带来了信息过载的问题。

由于大量信息的涌入,年轻人可能会感到困惑和不知所措,很难筛选出真正有用的信息。

此外,不负责任的媒体和互联网内容也会误导年轻人,影响他们的价值观和决策能力。

因此,培养年轻人良好的媒体素养非常重要,使他们能够辨别和评估信息的可靠性和有效性。

E:媒体素养的重要性媒体素养是提高年轻人对电子媒体的正确使用和理解的关键。

通过教育和培训,年轻人可以学习如何辨别虚假信息,评估媒体的可靠性,以及合理利用媒体资源。

媒体素养还包括对隐私和安全的意识,以及如何避免网络欺凌和其他不良行为。

通过提高媒体素养,年轻人可以更好地应对电子媒体的挑战,获得更多的益处,同时减少负面影响。

L:总结电子媒体对年轻人的影响是一把双刃剑。

社交媒体的依赖性和信息过载带来了负面影响,但通过提高媒体素养,可以最大限度地利用电子媒体带来的益处,同时减少可能的负面影响。

加强对年轻人媒体素养的培养,不仅可以促进他们正确使用电子媒体,还有助于提高他们价值观、决策能力和信息辨析能力。

因此,我们应该重视这个问题,并采取积极的措施来帮助年轻人更好地应对电子媒体的影响。

深入剖析PE文件

深入剖析PE文件

深入剖析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文件结构解析

PE文件结构解析

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文件各区段说明

PE文件各区段说明

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文件格式

pe文件格式
·SizeOfRawData。这个域表示了相对FileAlignment的段实体尺寸。文件中实际的段实体尺寸将少于或等于FileAlignment的整倍数。一旦映像被装载进入了一个进程的地址空间,段实体的尺寸将会变得少于或等于FileAlignment的整倍数。
·PointerToRawData。这是一个文件中段实体位置的偏移量。
ULONG SizeOfData;
ULONG AddressOfRawData;
ULONG PointerToRawData;
} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
这个段被分为单独的部分,每个部分为不同种类的调试信息数据。对于每个部分来说都是一个像上边一样的调试目录。不同的调试信息种类如下:
UCHAR Name[IMAGE_SIZEOF_SHORT_NAME];
union {
ULONG PhysicalAddress;
ULONG VirtualSize;
} Misc;
ULONG VirtualAddress;
ULONG SizeOfRawData;
PE文件规范由目前为止定义的那些头部以及一个名为“段”的一般对象组成。段包含了文件的内容,包括代码、数据、资源以及其它可执行信息,
每个段都有一个头部和一个实体(原始数据)。我将在下面描述段头部的有关信息,但是段实体则缺少一个严格的文件结构。因此,它们几乎可以
被链接器按任何的方法组织,只要它的头部填充了足够能够解释数据的信息。
段头部
PE文件格式中,所有的段头部位于可选头部之后。每个段头部为40个字节长,并且没有任何的填充信息。段头部被定义为以下的结构:

PE文件格式详解(一)

PE文件格式详解(一)

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文件结构解析PPT教学课件

PE文件结构解析PPT教学课件
ULONG PointerToLinenumbers; USHORT NumberOfRelocations; USHORT NumberOfLinenumbers; ULONG Characteristics;
// OBJ文件中表示本节物理地址 // EXE文件中表示节的实际字节数
// 本节的RVA // 本节在文件中的尺寸 // 本节在文件中的偏移地址 // OBJ文件中表示本节重定位信 // 息的偏移,EXE文件中无意义 // 行号偏移 // 重定位项的数目 // 本节在行号表中的行号数目 // 节属性代码
2019年8月7日
第29页

“节(Section)”跟在节表之后,一般PE文件都有 几个“节”。比较常见的有:
代码节 已初始化的数据节 未初始化的数据节 引入函数节 引出函数节 资源节
30
代码节
31
代码节
代码节一般名为.text或CODE,该节含有程序的可执行代码。 每个PE文件应该都有代码节
52引出函数节100hcharacteristics4一般为0204htimedatestamp4文件生成时间308hmajorversion2主版本号40ahminorversion2次版本号50chname4指向dll的名字610hbase4开始的序列号714hnumberoffunctions4addressoffunctions数组的项数818hnumberofnames4addressofnames数组的项数91chaddressoffunctions4指向函数地址数组1020haddressofnames4指向函数名所在地址数组1124haddressofnameordinals4指向函数索引序列号数组53kernel32dll的引出函数节5455寻找exitprocess地址1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

甲壳虫免杀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表示为重定位区段,但是其区段名并不能代表该区段的属性,区段的属性还是由其代码的性质决定的。

相关文档
最新文档