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就得到区段表的文件偏移地址了。
1 基本概念下表描述了贯穿于本文中的一些概念:图1 解释了Microsoft PE可执行文件格式:PE文件总体上分为“头”和“节”。
“头”是“节”的描述、简化、说明,“节”是“头”的具体化。
3 文件头PE文件的头分为DOS头、NT头、节头。
注意,这是本人的分法,在此之前并没有这种分法。
这样分法会更加合理,更易理解。
因为这三个部分正好构成SizeOfHeaders所指的范围,所以将它们合为“头”。
这里的3个头与别的文章的头的定义会有所区别。
节头紧跟在NT头后面。
3.1 DOS头(PE文件签名的偏移地址就是大小)用记事本打开任何一个镜像文件,其头2个字节必为字符串“MZ”,这是Mark Zbikowski的姓名缩写,他是最初的MS-DOS设计者之一。
然后是一些在MS-DOS下的一些参数,这些参数是在MS-DOS下运行该程序时要用到的。
在这些参数的末尾也就是文件的偏移0x3C(第60字节)处是是一个4字节的PE文件签名的偏移地址。
该地址有一个专用名称叫做“E_lfanew”。
这个签名是“PE00”(字母“P”和“E”后跟着两个空字节)。
紧跟着E_lfanew 的是一个MS-DOS程序。
那是一个运行于MS-DOS下的合法应用程序。
当可执行文件(一般指exe、com文件)运行于MS-DOS下时,这个程序显示“This program cannot be run in DOS mode(此程序不能在DOS模式下运行)”这条消息。
用户也可以自己更改该程序,有些还原软件就是这么干的。
同时,有些程序既能运行于DOS又能运行于Windows下就是这个原因。
Notepad.exe整个DOS头大小为224个字节,大部分不能在DOS下运行的Win32文件都是这个值。
MS-DOS程序是可有可无的,如果你想使文件大小尽可能的小可以省掉MS-DOS程序,同时把前面的参数都清0。
3.2 NT头(244或260个字节)紧跟着PE文件签名之后,是NT头。
#include <windows.h>void main(){MessageBoxA(0,"Hello World ",0,0);}用VC6编译运行上面的代码,你会发现简单显示下面这一个提示,背景是MS-DOS,点击确定后退出。
你可能说嘿!太简单了,谁都会写。
你用WinHex工具打开编译后的EXE看看,全是数字,可能会让你晕,为什么会 变成这样呢,因为上面的C代码仅是数字与字母的组合,计算机不可能运行的,我们都知道它运行的是机器码。
那怎么办?这就是VC6要做的事,它帮我们把容易 理解的C代码转换成相应的机器码,并用一定的格式放存在磁盘里。
双击附件里的helloworld.exe,你会发现显示一样的界面,但这个不是由上面C 代码编译生成的哦,是我一个一个机器码写成的。
要写这么多数字,你一定怕了,别担心,经过下面我的解析,你也可以做得到。
先 看看什么是PE?我们用C\\C++或ASM编译连接后能运行的程序就是PE,如后缀为exe,dll,sys等有相以结构的都称为PE。
编写程序我们可 以像下面的机器码一样直接写,但为什么还要编译器,还有编程语言?大家可以看看下面的图,可以发现全是机器码,我们很难理解是做什么用的,如果我们直接 写,那么一但错了一个数字都会出问题,并且很难发现,有了编译器就可以帮我做一些检查,帮我们生成标准的PE结构。
用VC6或WinHex打开helloworld.exe看到的像下面的图Offset 0123 4 567 89 A B C D E F00000000 4D 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 MZ..............00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000030 00 00 00 00 00 00 00 00 00 00 00 00 B0 00 00 00 ............?...00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000B050 45 00 004C 01 03 00 00 0000 00 00 00 00 00PE..L........... 000000C000 00 00 00 E0 00 02 000B 01 00 00 00 00 00 00 ....?........... 000000D0 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 ................ 000000E0 00 00 00 00 00 00 40 00 00 10 00 00 00 02 00 00 ......@......... 000000F0 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 ................ 00000100 00 40 00 00 00 04 00 00 00 00 00 00 02 00 00 00 .@.............. 00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000120 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 ................ 00000130 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . .............. 00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001A0 00 00 00 00 00 00 00 002E 74 65 78 74 00 00 00 ........ .text... 000001B000 00 00 00 00 10 00 00 00 02 00 00 00 04 00 00 ................000001D0 2E 69 64 61 74 61 00 00 00 00 00 00 00 20 00 00 .idata....... .. 000001E0 00 02 00 00 00 06 00 00 00 00 00 00 00 00 00 00 ................ 000001F0 00 00 00 00 40 00 00 40 2E 64 61 74 61 00 00 00 ....@..@.data... 00000200 00 00 00 00 00 30 00 00 00 02 00 00 00 08 00 00 .....0.......... 0000021000 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0 ............@..? 00000220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000002A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000002B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000002C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000002D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000002E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000002F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000370 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000003A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000003B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000003C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000003D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000003E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000003F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000040055 8B EC 6A 00 6A 00 68 00 30 40 00 6A 00 FF 15 U嬱j.j.h.0@.j .. 00000410 40 20 40 00 8B E5 5D C300 00 00 00 00 00 00 00 @ @.嬪]?....... 00000420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000440 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000460 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000470 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000490 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000004A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000004B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000004C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000004D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000004E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000004F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000510 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000520 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000530 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000540 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000550 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000560 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000570 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000590 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000005A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000005B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000005C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000005D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................000005F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000060030 20 00 00 00 00 00 00 00 00 00 00 70 20 00 00 0 ..........p .. 00000610 40 20 00 0000 00 00 00 00 00 00 00 00 00 00 00@.............. 00000620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000063060 20 00 0000 00 00 00 00 00 00 00 00 00 00 00 ` .............. 0000064060 20 00 0000 00 00 00 00 00 00 00 00 00 00 00 ` .............. 00000650 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000066000 004D 65 73 73 61 67 65 42 6F 78 41 00 00 00 ..MessageBoxA... 00000670 75 73 65 72 33 32 2E 64 6C 6C00 00 00 00 00 00 user32.dll...... 00000680 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000690 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000006A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000006B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000006C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000006D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000006E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000006F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000700 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000710 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000720 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000730 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000750 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000760 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000770 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000780 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000790 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000007A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000007B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000007C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000007D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000007E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000007F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000080048 65 6C 6C 6F 20 57 6F 72 6C 64 00 00 00 00 00 Hello World..... 00000810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000820 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000830 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000840 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000850 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000860 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000870 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000880 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000890 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................000008B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000008C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000008D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000008E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000008F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000900 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000910 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000920 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000930 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000940 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000950 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000960 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000970 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000980 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000990 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000009A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000009B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000009C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000009D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000009E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000009F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................上面的PE图用了不同的色彩表示不同的结构,基本PE结构像这样的IMAGE_DOS_HEADER 40h字节DOS STUB 70h字节NT Signature 4字节IMAGE_FILE_HEADER 14h字节IMAGE_OPTIONAL_HEADER E0h字节IMAGE_SECTION_HEADER(.text段结构属性) 28h字节IMAGE_SECTION_HEADER(.idata段结构属性) 28h字节IMAGE_SECTION_HEADER(.data段结构属性) 28h字节.text段的代码开始 200h字节.idata段的导入表开始 200h字节.data段的数据开始 200h字节00000000,00000010,000009F0 等这些并不是PE里的内容,只是软件标识文件的编移(FileOffset ), 指示我们好找到位置,0-F里的才是真正PE内容。
我们这里将不依赖任何编译器,仅仅使用一个十六进制编辑器逐个字节的手工编写一个可执行程序。
以这种方式讲解PE结构,通过这个过程读者可以学习PE结构中的PE头、节表以及导入表相关方面的知识。
为了简单而又令所有学习程序开发的人感到亲切,我们将完成一个Hello World! 程序。
功能仅仅是运行后弹出一个消息框,消息框的内容是Hello World!。
首先了解一下Win32可执行程序的大体结构,就是通常所说的PE结构。
如图1所示PE结构示意图:图1 标准PE结构图由图中可以看出PE结构分为几个部分:MS-DOS MZ 头部:所有PE文件必须以一个简单的DOS MZ 头开始。
有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ header 之后的DOS程序。
以此达到对Dos系统的兼容。
(通常情况DOS MZ header总共占用64byte)。
MS-DOS 实模式残余程序:实际上是个有效的EXE,在不支持PE文件格式的操作系统中,它将简单显示一个错误提示,大多数情况下它是由汇编编译器自动生成。
通常,它简单调用中断21h,服务9来显示字符串"This program cannot run in DOS mode"。
(在我们写的程序中,他不是必须的,可以不予以实现,但是要保留其大小,大小为112byte,为了简洁,可以使用00来填充。
)PE文件标志:是PE文件结构的起始标志。
(长度4byte, Windows程序此值必须为0x50450000)PE文件头:是PE相关结构 IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。
执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS MZ header中找到PE header的起始偏移量,跳过了MS-DOS 实模式残余程序,直接定位到真正的文件头PE header,长度20byte。
PE文件结构剖析大家都很清楚,了解可执行文件的结构有多么的重要,DOS下如此,Windows下也同样如此。
如果你想加密程序,编写病毒等,了解PE文件结构必是不可缺少的。
大家也可能见到很多这方面的资料,但都是从理论上解说一下,很少见到拿一个具体文件开刀的。
这里,我就用前面“系列4”中的文件4.EXE为例来剖析一下PE文件格式,因时间关系,不可能一下子就写的很完善,如可行,以后再慢慢补来。
===============================================================对于本文件,红色外框将文件分成4个部分,各部分的内容是:Ⅰ - 文件头;Ⅱ - 代码段;.text sectionⅢ - 引入表;.rdata sectionⅣ - 数据段;.data section可以看出,每部分都有大量的垃圾数据,用绿色的叉号进行标注。
我们先从整体看一下文件的结构:(要结合PE剖析图来看)----------------------------------------------------------1、IMAGE_DOS_HEADER虽然你这是Windows下的程序,但保不准别人会拿它到DOS下执行,当然肯定不是想象的结果啦。
该文件头和DOS下可执行文件的文件头基本上是一样的,所以你也可以认为它是一个标准的DOS下的EXE文件,只不过程序执行的结果是显示一个错误信息:This program ca nnot be run in DOS mode.,意思是这是Windows下的程序,到Windows下用吧!该结构的最后一个元素e_lfanew指示PE文件头的位置,是个重要的数据。
对本例,该元素位于文件偏移量是3C的位置,其值是000000B0。
2、dos下执行时的程序部分3、dos执行时显示的错误信息4、垃圾数据-----------------------------------------------------------就是PE文件头啦,它是一个IMAGE_NT_HEADERS STRUCT结构5、PE文件标记,db 'PE',0,06、是一个IMAGE_FILE_HEADER结构7、是一个IMAGE_OPTIONAL_HEADER结构8、是一个IMAGE_DATA_DIRECTORY结构数组,共16项9、是一个IMAGE_SECTION_HEADER结构数据,项数由结构6中 NumberOfSections 确定。
甲壳虫免杀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表示为重定位区段,但是其区段名并不能代表该区段的属性,区段的属性还是由其代码的性质决定的。