当前位置:文档之家› PE文件分析与保护系统

PE文件分析与保护系统

PE文件分析与保护系统
PE文件分析与保护系统

编号:

审定成绩:

重庆邮电大学

毕业设计(论文)

设计(论文)题目:PE可执行文件分析与保护系统

学院名称:计算机科学与技术

学生姓名:王泽军

专业:信息安全

班级:0440801

学号:08130108

指导教师:陈龙

答辩组负责人:

填表时间:年月

重庆邮电大学教务处制

摘要

PE文件是windows平台上的可执行文件格式,目前绝大多数的软件都是面向windows 系统的,软件的知识产权保护越来越受到人们的重视,其中软件加密是保护知识产权的一种有效方式。目前市场上有大量现成的保护方案可供选用,如基于软件的加密壳保护和基于硬件的加密锁保护,但这些优秀的保护方案由于太流行造成大家对其研究的透彻,反而容易被破解,所以自己实现相关的保护方法是很有必要的。

本程序的主要目的在于探究PE文件的奥秘,辅助取证调查等相关安全从业人员对可疑文件进行分析,同时对可执行文件提供一个加壳保护的功能。本程序首先对PE文件的各个区段进行分析,将PE文件中重要的数据以及加载过程形象地展现出来,更深入的理解了操作系统以及可执行文件运行的相关运行机制。随后通过加密输入表、合并区段、去除重定位信息、强制文件对齐等手段对软件加壳保护。加大了破解分析者对软件反汇编的难度,有效的阻止对软件的逆向分析,保护了软件开发者的知识产权,推进了软件产业有序地建立和发展。

【关键词】软件安全 WindowsPE文件结构静态分析加壳

ABSTRACT

Currently, The majority of software are designed for the windows system, and the PE file is an executable file format on the windows platform. With the increasingly concern about the software the protection of intellectual property rights from the public, software encryption has become one of the most effective way to protect the rights. There are a large number of ready-protection programs are available on the market today, involving the software protection with the basis of encryption shell and the hardware protection with the basis of encryption lock. However, these excellent protection programs with excellent functions and good reputation attract the Comprehensive study from all over the world, which has finally lead to the software crack.From this way, it is Necessary to have the implementation methods in the private way.

One of the main purposes of this program is to explore the mysteries of the PE file. Besides, those security practitioners who are engaged in the forensic investigations can analyze suspicious files with the help of this software. The equally important thing is that the program provides a key function, adding a layer of protective shell for these Executable files.

On the one hand, the program will analyze each sections of the PE file and vividly demonstrated the significant data in the PE file at the same time, which will lead users to a better understanding of the operating system and the operation mechanism about running the executable file .On the other hand, this program will add the shell to protect software by the means of Encryption input table, merger section, removing relocations and mandatory file alignment ,which really will make a considerable contribution to getting increasing difficulty of software disassembler by those crack analyzer ,preventing the reverse analysis of software , Protecting the intellectual property rights of software developers and eventually pushing the orderly establishment and development of the software industry.

【Key words】Software securityWindowsPortable ExecutableStatic analysisPackers

目录

前言 (1)

第一章PE文件概述 (2)

第一节PE文件研究的背景和意义 (2)

第二节PE文件系统理论基础 (2)

一、壳的介绍 (2)

二、PE文件格式概览 (3)

三、PE文件加载过程 (4)

四、PE病毒原理 (5)

五、壳的装载过程 (5)

六、逆向分析介绍 (7)

第二章PE文件分析与保护的实现 (8)

第一节系统总体设计 (8)

第二节系统功能设计 (8)

第三节PE文件结构分析实现 (10)

一、文件格式检查 (10)

二、PE文件各字段读取与显示 (10)

三、总流程图 (15)

第四节PE文件加壳保护实现 (15)

一、加壳主程序编写 (15)

二、外壳编写 (23)

三、外壳添加至原程序 (23)

第三章系统实现以及测试 (28)

一、测试环境 (28)

二、测试数据 (28)

三、测试过程及结果分析 (28)

结论 (38)

致谢 (39)

参考文献 (40)

附录 (41)

一、英文原文 (41)

二、英文翻译 (51)

前言

随着计算机技术的不断发展,面向各应用领域或行业需求的软件不断孕育而生。但无论哪种优秀的软件,其内部核心的技术往往是该软件的命脉,一旦被他人窃取或被非法复制,由此受到的经济损失是无法估计的。目前,软件作为智力和知识的结晶也显得越来越重要,打击计算机软件的非法复制和销售,保护和推进软件产业有序地建立和发展,已成为软件业不可忽视的问题。由于软件发布后要面对众多逆向分析人员的研究,给要发布的软件加一层壳几乎成了保护软件的一个必要步骤,以阻碍对其逆向分析。

除了保护软件版权问题的严峻性外,计算机病毒也变得越来越猖獗,互联网的普及,更加剧了计算机病毒的泛滥。计算机安全越来越受到人们的重视。在众多的病毒当中Win32PE病毒是所有病毒中数量极多,破坏性极大,技巧性极强的一类病毒。对当前的计算机安全构成了极大的威胁。

本论文将对PE文件格式进行详细的阐述,揭秘windows加载PE文件的过程。同时还将讨论介绍对可执行文件加壳保护的方法,加大了破解分析者对软件反汇编的难度,保护软件开发者的知识产权。

第一章PE文件概述

第一节PE文件研究的背景和意义

20世纪90年代以来,计算机通信技术的发展和Internet的普及,使数字信息和产品的传播更加方便和广泛,但与此同时,知识产权的保护问题也变得日益突出。对软件产品而言,盗版使用、逆向工程、恶意篡改己构成对软件产业的巨大威胁,因此而造成的经济损失不可忽视。

据CNZZ数据中心统计,在我国Windows系统的使用率已经占到总体的98%以上。目前绝大多数的软件都是面向Windows系统的,软件的知识产权保护越来越受到人们的重视。任何加密软件都是可能被破解,但是软件加密仍是目前保护知识产权的一种有效方式。目前市场上有大量现成的保护方案可供选用,如基于软件的加密壳保护和基于硬件的加密锁保护,但这些优秀的保护方案由于太流行造成大家对其研究的透彻,反而容易被破解,所以自己实现相关的保护方法是很有必要的。

第二节PE文件系统理论基础

一、壳的介绍

壳是最早出现的一种专用加密的第三方软件,使用加壳程序对软件进行最外层的保护也越来越流行,现在市面上的共享软件中没有采用加壳保护的已经很少见了,加壳程序通常的执行流程是:附加在原程序上,在程序加载后先于原程序执行,得到控制权,然后对原始程序进行解密、还原,在这个过程中同时加入大量的反反汇编、反调试、完整性校验等技术,极大的增强了逆向的难度,待还原后再把控制权交还给原始程序,原始程序再开始执行它的代码部分。通常原始程序如果没加壳的话逆向工作者可以用一些静态、动态的分析软件找到程序的关键地方并以此为突破口,原始程序的IAT表就是其中的一个重要突破口,加壳程序通常会对原始程序的IAT实现模拟加载的过程,这样通过逆向分析软件得到的IAT表就是加壳程序的,而不是原始程序的,由于加壳程序对原始程序进行还原后,若不对原始程序的代码进行一些保护,如果逆向工作者

抓取内存中还原以后的镜像文件,还是可以修复得正常运行,现在加壳程序通常对原始程序的代码也做了一些保护,比如代码变形、代码混淆、IAT加密等技术手段,这样更增强了逆向的难度[1]。

现在强度较高的壳主要有向如下几种技术方向发展的趋势:

①多线程用多线程的方式进行原始程序的还原,比如一个线程进行还原,另一个线程进行反跟踪,再一个线程进行内存完整性校验等,同时这些线程间频繁通信以检测异常,由于Windows的调试机制是针对一个进程的,这样,涉及到了多线程的调试给逆向分析增加了不少难度,像Armadillo、Xtrcme Protector这样的壳就采用了多线程机制。

②虚拟机在壳的内部实现一个虚拟机引擎,壳使用的全部是它自己的虚拟机指令,运行时将这些虚拟机指令放到虚拟机引擎中解释执行,在对原始程序进行还原的过程中使用大量的虚拟机指令,要想分析其流程,必须对虚拟机引擎进行细致的研究,通常这种研究需要花费大量的时间和精力,极大的增加了逆向分析的难度。

二、PE文件格式概览

PE的意思就是Portable Executable(可移植的执行体)。它是Win32环境自身所带的执行体文件格式。它的一些特性继承自Unix的Coff(commonobject file format)文件格式。它的主要组成如图1.1所示[2]。

第一部分DOS MZ Header 是一个IMAGE_DOS_HEADER结构。该结构中最重要的两个成员是e_magic和e_lfanew。程序执行时,先通过e_magic识别程序是否是有效执行体。如果是有效执行体,就用e_lfanew定位PE Header在PE 文件中的起始地址。

第二部分DOS Stub是编译器自动生成的一个EXE文件。在不支持PE文件格式的操作系统中,这个EXE文件将代替主程序,简单显示一个类似“This program can not be run in DOS mode”的错误提示。

第三部分PE Header(PE文件头)是一个IMAGE_NT_HEADERS结构。该结构包括Signature、FileHeader和OptionalHeader3个域。其中Signature用来检验PE文件的有效性,FileHeader和OptionalHeader包含了PE文件被载入内存时需要用到的物理、逻辑信息。

第四部分Section Table(节表)是一个IMAGE_SECTION_HEADER的结构数组。Section Table结构数组中的成员数等于第五部分section(节)的个数。节表每个成员包含了对应节的属性、文件偏移量、虚拟偏移量等节性质信息。

第五部分Sections是具体存放节数据的地方,它占了文件的绝大部分大小。软件的内容被划分成块,称之为节。装载器通过节表中对各节位置大小的定义,把节数据装入内存,保证了PE文件的正确执行。常用的节包括:.text(代码节)、.bss(未初始化数据节)、.rdata(只读的数据节)、.data(全局变量节)、.rsrc (资源节)、.edata(引出函数节)、.idata(引入函数节)、.debug(调试信息节)。

图1.1 PE文件结构图

三、PE文件加载过程

①当PE文件被执行,PE装载器检查DOS MZ header里的PE header偏移量。如果找到,则跳转到PE header。

②PE装载器检查PE header的有效性。如果有效,就跳转到PE header 的尾部。

③紧跟PE header的是节表。PE装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,同时附上节表里指定的节属性。

④PE文件映射入内存后,PE装载器将处理PE文件中类似import table(引

入表)逻辑部分。

⑤之后PE装载器会处理PE文件的重定位、TLS回调函数之类的信息。

⑥最后PE装载器会跳到PE文件的OEP(Original Entry Point)处开始执行,至此,PE文件已经装载完毕[15]。

四、PE病毒原理

PE病毒是指所有感染Windows下PE文件格式文件的病毒,其设计原理如下[11]:

①病毒的重定位

②获取API函数地址

③PE文件搜索

④内存映射文件读取所有的可执行文件

⑤病毒感染其他PE文件

⑥病毒返回到Host宿主程序继续执行原程序

Windows PE病毒感染PE文件是通过把自身代码插入PE文件中,而其代码自身并不是一个独立的可执行程序,win32应用程序都必须有导入函数表来调用系统的标准WindowsAPI函数,因此病毒代码插入PE文件后,能否正确执行的前提是必须调用宿主程序的导入函数。

PE病毒都是写入的节中的代码,但是Win32 PE病毒和普通Win32 PE程序一样需要调用API函数,但是普通的Win32 PE程序里面有一个导入函数表,该函数表对应了代码段中所用到的API函数在动态连接库中的真实地址。这样,调用API函数时就可以通过该导入函数表找到相应API函数的真正执行地址。但是,对于Win32 PE病毒来说,只有一个代码段并不存在引入函数段。病毒就无法象普通PE程序那样直接调用相关API函数,而应该先找出这些API函数在相应动态链接库中的地址。

总之,PE病毒首先计算文件的入口位置,接着修改文件的入口地址指向病毒的入口地址,同时保留旧的文件入口地址,这样当病毒感染文件后可重新进入宿主程序继续执行。接着要写入感染标记,然后把病毒程序写入计算好的地址内,最后修改文件的末尾地址,这样就完成了病毒的感染过程。

五、壳的装载过程

①获取壳自己所需要使用的API地址

加壳后的输入表一般所引入的DLL和API函数很少,甚至只有Kernel32.dll 以及GetProcAddress这个API函数。壳实际上还需要其他的API函数来完成它的工作,为了隐藏这些API,它一般只在壳的代码中用显式链接方式动态加载这些API函数。

②解密原程序的各个区块(Section)的数据

壳出于保护原程序代码和数据的目的,一般都会加密原程序文件的各个区块。在程序执行时外壳将会对这些区块数据解密,以让程序能正常运行。壳一般按区块加密,在解密时也按区块解密,并且把解密的区块数据按照区块的定义放在合适的内存位置。如果加壳时用到了压缩技术,那么在解密之前还需要解压缩。

③重定位

文件执行时将被映像到指定内存地址,这个初始内存地址称为基地址(ImageBase)。对于DLL动态链接库文件来说,Windows系统没有办法保证每一次DLL运行时提供相同的基地址。所有壳中也需要提供进行“重定位”的代码,否则原程序中的代码是无法正常运行起来的。

④HOOK-API

程序文件中的输入表的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。在程序的第一行代码执行之前,Windows系统就完成了这个工作。壳一般都修改了原程序文件的输入表,填充输入表中相关的数据。在填充过程中,外壳就可填充HOOK-API的代码的地址,这样就可间接地获得程序的控制权。

⑤跳转到程序原入口点(OEP)功能模块

从这个时候起壳就把控制权交还给原程序了,一般的壳在这里会有明显的一个“分界线”。

壳的装载过程如图1.2所示。

图1.2 壳的装载过程

六、逆向分析介绍

逆向分析是指将可执行文件反汇编,通过分析反汇编代码来理解其代码功能、体系结构和程序设计信息,如各接口的数据结构等。然后用高级语言重新描述这段代码,逆向分析原软件的思路。逆向分析的方法分为静态分析和动态分析法两大类[4]。

静态分析方法就是在不运行软件的情况下,利用分析工具对该软件的静态特征和功能模块进行分析的方法。常用的静态分析工具包括OllyDump、W32DASM、IDA Pro等。利用静态分析方法,可以分析出软件的大致结构,可以确定软件的功能模块和各个功能模块的流程图等。静态分析方法是目前最主要的代码分析方法,被广泛应用于恶意代码分析和软件安全测评工作中。

动态分析方法通过在可控环境中运行程序,全程监控代码的所有操作,观察其状态和执行流程的变化,获得执行过程中的各种数据。动态分析方法在软件执行过程中对代码进行分析工作,克服了静态分析方法的分析对象可能和实际执行的二进制代码不一致的缺陷,因此可以对使用了自修改代码保护机制和指令混淆等软件保护技术的软件进行分析。

第二章PE文件分析与保护的实现

第一节系统总体设计

本系统适用于对所有PE文件的分析与保护,当用户发现可疑文件时,可用此软件对该可疑文件进行分析,通过分析它的程序入口点、区段表、输入输出表、熵值等信息可初步对其做出判断。同时在文件保护部分,首先判断是否已被加密,资源是否被压缩,然后根据用户的选择(重算文件头、创建备份、清空段名、输入表加密、合并区段、去除重定位数据、强制文件对齐、压缩资源、忽略区块共享、保留附加数据、SMC加密)执行相应操作并显示是否操作成功。系统总的流程图如图2.1所示。

图2.1 系统程序流程图

第二节系统功能设计

本系统的功能包括如下对PE文件的分析和保护两大部分。详见图2.2。

①对PE文件进行静态分析。

②直观的显示PE文件各个字段。

③计算各区块表及整个程序的熵值,辅助判断程序是否加壳。

④通过加密输入表、重算文件头、压缩资源等手段提供加壳保护功能。

图2.2 系统功能流程图

第三节PE文件结构分析实现

一、文件格式检查

检测一个文件是不是PE文件,要根据PE Header中的标志位来决定。PE Header 是一个IMAGE_NT_HEADERS 结构体,它在文件中的起始偏移由DOS MZ Header中的e_lfanew决定。IMAGE_NT_HEADERS结构体包括了Signature、FileHeader 和OptionalHeader三个部分。

第一个属性Signature是检验PE 文件有效性的。当文件的Signature值等于字符串“PE\0\0”的ASCII码值,即0x00004550时,Windows装载器就判断这个文件是有效的可执行文件。实现检测流程图如图2.3所示。

图2.3文件格式检查流程图

二、PE文件各字段读取与显示

这部分主要分为对DOS头、FileHeader、OptionalHeader、Data Directory、Section Table 5部分的显示。其中在对Data Directory的分析中引入了输入表输出表的分析,对Section Table的分析中引入了对区块表计算熵值并判断是否加壳的功能。

FileHeader是一个IMAGE_FILE_HEADER结构,该结构包含了关于PE

文件物理分布的基本属性。IMAGE_FILE_HEADER结构体的定义如下:typedef struct _IMAGE_FILE_HEADER

{

WORD Machine; //该文件运行所需要的CPU,对于Intel 平台是14Ch

WORD NumberOfSections; //文件的节数目

DWORD TimeDateStamp; //文件创建日期和时间

DWORD PointerToSymbolTable;

DWORD NumberOfSymbols;

WORD SizeOfOptionalHeader; //OptionalHeader 结构大小

WORD Characteristics; //文件信息标记,区分文件是exe还是dll等

}IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

其中比较重要的是NumberOfSections和Characteristics两个成员,NumberOfSections指定PE文件中节的数目,即Section Table 结构数组元素的个数,如果在文件中增加或删除1个节就需修改NumberOfSections的值。Characteristics是文件信息标记,exe文件对应值为0x010E

OptionalHeader是一个IMAGE_OPTIONAL_HEADER结构,共有31个成员,包含了PE文件被载入内存时需要的逻辑信息,是PE Header中最大也是最重要的结构。表2.1列出了OptionalHeader的主要成员。

DataDirectory是OptionalHeader的最后128个字节,也是IMAGE_NT_HEADERS的最后一部分数据,它由16个IMAGE_DATA_DIRECTORY结构组成的数组构成。每一个IMAGE_DATA_DIRECTORY都是对应一个PE文件重要的数据结构,如输入表、输出表等。IMAGE_DATA_DIRECTORY的定义如下:

typedef struct _IMAGE_DATA_DIRECTORY

{

DWORD VirtualAddress;// 对应数据结构的RV A地址

DWORD Size;// 对应数据结构的大小(字节单位)

}IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

表2.2列出了DataDirectory的主要成员。

表2.1 OptionalHeader 的主要成员

输入表结构是以IMAGE_IMPORT_DESCRIPTOR(IID)数组开始,一个程序要调用几个DLL就会有几个IID项,每个IID对应于一个DLL。IID结构如下:typedef struct _IMAGE_IMPORT_DESCRIPTOR {

union

{

DWORD Characteristics;

DWORD OriginalFirstThunk;// IMAGE_THUNK_DATA数组的RV A

};

DWORD TimeDateStamp;//时间标志,可以忽略

DWORD ForwarderChain;// 正向链接索引,一般为0

DWORD Name;

DWORD FirstThunk; //指向IMAGE_THUNK_DATA数组的RV A地址} IMAGE_IMPORT_DESCRIPTOR;

typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;

输入表的工作流程如图2.4所示。

图2.4输入表工作流程

输出表一般存在于DLL文件中,很少出现在exe文件中。主要为可执行文件修正其IAT提供信息和依据;输出表的位置在:pe头的可选映像头中的数据目录表的第一个字段,PE+78h处;输出表指向一个IMAGE_EXPORT_DIRECTORY(IED);IED结构定义如下:

typedef struct IMAGE_EXPORT_DIRECTORY {

DWORD Charateristics ;未使用,总为0

DWORDTimeDateStamp ;文件生成时间

WORDMajorVersion ;主版本号,一般为0

WORD MinorVersion ;次版本号,一般为0

DWORD Name ;模块中的真实名称

DWORDBase ;基数,加上序数就是函数地址数组的索引值

DWORDNumberOfFunctions ;AddressOfFunction序列中的元素个数

DWORDNumberOfNames ;AddressOfNames序列中的元素个数

DWORDAddressOfFunctions ;指向函数地址数组

DWORDAddressOfNames ;函数名字的指针地址

DWORDAddressOfNameOndinals;指向输出序号数组

}IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY IED结构中NumberOfFunctions和NumberOfNames一般相等,NumberOfNames一般表示以名称输出的函数个数,通常与输出函数总数相等。若为0,表示模块仅仅通过序号引出。输出表的工作流程如图2.5所示。

图2.5输出表工作流程

Section Table是IMAGE_SECTION_HEADER 的结构数组,结构数组中的成员数等于节的个数。数组的每一个IMAGE_SECTION_HEADER 结构成员对应一个节,包含了该节的性质定义信息。在这部分,我们利用上下文分段法对各个区块表的熵值和总熵值进行了计算,熵是信息论中用于度量信息量的一个概念,一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。也就是说PE文件区块熵值越大,该区块就越混乱,被压缩的可能性就越大。所以我们根据熵值对文件是否加壳进行了简单的分析。该结构的主要成员如表2.3所示。

表2.3 IMAGE_SECTION_HEADER结构的主要成员

三、总流程图

各个字段读取显示的流程图如图2.6所示。

图2.6 PE文件字段显示流程图

第四节PE文件加壳保护实现

一、加壳主程序编写

1、文件基本数据读入

因为在PE文件中,所有的数据都是根据RV A或V A来定位的,如果要使

用一个根据RV A来定位的数据,那就先得把它的RV A转换为Offset,然后才能找到并使用它。如果要处理的数据比较多且分布在不同区块中的话,这种转换会显得非常麻烦,而且容易引起错误。所以我们读入文件的方式采用依据PE文件的结构,仿照Windows装载器载入PE的方式,根据各个区块的RV A 分别读入。流程图如图2.7所示。

图2.7文件基本数据读入流程图

2、附加数据读取

某些特殊的PE文件在各个区块的正式数据之后还有一些额外数据。这些额外数据不属于任何区段,所以当程序被Windows装载器载入时不会被直接读入内存,而是事后由程序在需要使用时自行读取。额外数据的起点可以认为是最后一个区块的末尾,终点是文件末尾,所以额外数据的大小就是文件大小减去文件头到最后一个区块的末尾的大小。附加数据读取流程图如图2.8所示。

pe文件格式

PE文件格式详解(一)――基础知识 什么是PE文件格式: 我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32位Wind ow系统中的可执行文件EXE以及动态连接库文件DLL的组织形式。为什么我们双击一个EXE文件之后它就会被Window运行,而我们双击一个DOC文件就会被Word打开并显示其中的内容;这说明文件中肯定除了存在那些文件的主体内容(比如EXE文件中的代码,数据等,DOC文件中的文件内容等)之外还存在其他一些重要的信息。这些信息是给文件的使用者看的,比如说EXE文件的使用者就是Window,而DOC文件的使用者就是Word。Window可以根据这些信息知道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令中的地址等等。那么PE文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,针对不同的编译器和连接器通常会提供不同的选项让我们在编译和 联结生成PE文件的时候对其中的那些Window需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window中默认的信息。例如:WindowNT默认的程序加载基址是0x40000;你可以在用VC连接生成EXE文件的时候使用选项更改这个地址值。在不同的操作系统中可执行文件的格式是不同的,比如在Linux上就有一种流行的ELF格式;当然它是由在Linux上的编译器和连接器生成的,

所以编译器、连接器是针对不同的CPU架构和不同的操作系统而涉及出来的。在嵌入式领域中我们经常提到交叉编译器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交叉编译器在跑Linux的X86机器上编译出能在Arm上运行的程序。 程序是如何运行起来的: 一个程序从编写出来到运行一共需要那些工具,他们都对程序作了些什么呢?里面都涉及哪些知识需要学习呢?先说工具:编辑器-》编译器-》连接器-》加载器;首先我们使用编辑器编辑源文件;然后使用编译器编译程目标文件OBJ,这里面涉及到编译原理的知识;连接器把OBJ文件和其他一些库文件和资源文件连接起来生成EXE文件,这里面涉及到不同的连接器的知识,连接器根据OS的需要生成EXE文件保存着磁盘上;当我们运行EXE文件的时候有W indow的加载器负责把EXE文件加载到线性地址空间,加载的时候便是根据上一节中说到的PE文件格式中的哪些重要信息。然后生成一个进程,如果进程中涉及到多个线程还要生成一个主线程;此后进程便开始运行;这里面涉及的东西很多,包括:PE文件格式的内容;内存管理(CPU内存管理的硬件环境以及在此基础上的OS内存管理方式);模块,进程,线程的知识;只有把这些都弄清楚之后才能比较清楚的了解这整个过程。下面就让我们先来学习PE文件格式吧。

PE格式基础及程序的装入

DOS MZ header部分是DOS时代遗留的产物,是PE文件的一个遗传基因,一个Win32程序如果在DOS下也是可以执行,只是提示:“This program cannot be run in DOS mode.”然后就结束执行,提示执行者,这个程序要在Win32系统下执行。 DOS stub 部分是DOS插桩代码,是DOS下的16位程序代码,只是为了显示上面的提示数据。这段代码是编译器在程序编译过程中自动添加的。 PE header 是真正的Win32程序的格式头部,其中包括了PE格式的各种信息,指导系统如何装载和执行此程序代码。 Section table部分是PE代码和数据的结构数据,指示装载系统代码段在哪里,数据段在哪里等。对于不同的PE文件,设计者可能要求该文件包括不同的数据的Section。所以有一个Section Table 作为索引。Section多少可以根据实际情况而不同。但至少要有一个Section。如果一个程序连代码都没有,那么他也不能称为可执行代码。在Section Table后,Section数目的多少是不定的。 二、程序的装入 当我们在explorer.exe(资源管理器)中双击某文件,执行一个可执行程序,系统会根据文件扩展名启动一个程序装载器,称之为Loader。Loader会首先检查DOS MZ Header,如果存在,就继续寻找PE header,如果这两项都不存在,就认为是DOS 16位代码,如果只存在DOS MZ Header,而其中又指示了而其中又指示了PE Header 的位置,那么Loader 就判定此文件不一个有效的PE文件,拒绝执行。 如果DOS Header 和PE Header都正常有效,那么Loader就会根据PE Header 及Section Table的指示,将相应的代码和数据映射到内存中,然后根据不同的Section进行数据的初始化,最后开始执行程序段代码。 三、PE格式高级分析 下面我们以一个真实的程序为例详细分析PE格式,分析PE格式最好有PE分析器,常用的软件是Lord PE,也有其它的分析工具和软件如PE Editor 、Stud PE等。 先分析一下磁盘文件的内容,这里我们使用UltraEdit32(UE)工具,这是一个实用的文件编辑器,可以编辑文本和二进制文件。

PE文件头解析大全

PE可选头部 PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针: PEFILE.H #define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \ ((PIMAGE_DOS_HEADER)a)->e_lfanew + \ SIZE_OF_NT_SIGNATURE + \ sizeof(IMAGE_FILE_HEADER))) 可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下: WINNT.H typedef struct _IMAGE_OPTIONAL_HEADER { // // 标准域 // USHORT Magic; UCHAR MajorLinkerVersion; UCHAR MinorLinkerVersion; ULONG SizeOfCode; ULONG SizeOfInitializedData; ULONG SizeOfUninitializedData; ULONG AddressOfEntryPoint; ULONG BaseOfCode; ULONG BaseOfData; // // NT附加域 // ULONG ImageBase; ULONG SectionAlignment;

ULONG FileAlignment; USHORT MajorOperatingSystemVersion; USHORT MinorOperatingSystemVersion; USHORT MajorImageVersion; USHORT MinorImageVersion; USHORT MajorSubsystemVersion; USHORT MinorSubsystemVersion; ULONG Reserved1; ULONG SizeOfImage; ULONG SizeOfHeaders; ULONG CheckSum; USHORT Subsystem; USHORT DllCharacteristics; ULONG SizeOfStackReserve; ULONG SizeOfStackCommit; ULONG SizeOfHeapReserve; ULONG SizeOfHeapCommit; ULONG LoaderFlags; ULONG NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; 如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。 标准域 首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF 格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。 ·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B

PE文件结构

检验PE文件的有效性 <1>首先检验文件头部第一个字的值是否等于IMAGE_DOS_SIGNATURE,是则表示DOS MZ header有效 <2>一旦证明文件的Dos header 有效后,就可用e_lfanew来定位PE header <3>比较PE header 的第一个字的值是否等于IMAGE_NT_HEADER,如果前后两个值都匹配. PS.WinHex使用方法 1.Alt+G跳到指定位置 2.Ctrl+Shift+N放入新文件 3.大文件扩容,新建一个扩容大小+1的文件,把这个文件的数据复制后写入整个文件的尾地址. 4.文本搜索ctrl+F 5.十六进制搜索ctrl+alt+x 6.文本显示F7 7.打开内存alt+F9 8.进制转换器F8 9.分析选块F2 10.计算HASH ctrl+F2 11.收集文本信息ctrl+F10 12.编辑模式F6 一.IMAGE_DOS_HEADER <1>位置00H,WORD(2个字节)的e_magic为4D5A,即MZ <2>位置3CH,60,LONG(4个节节)的e_lfanew为64+112=176即B0H, 二.IMAGE_NT_HEADERS <1>位置B0H,DWORD(4个字节),PE开始标记,写入50450000,即PE <2>位置B4H,WORD,PE所要求的CPU,对于Intel平台,为4C01 <2>位置B6,WORD,PE中段总数,计划有3个段,.text代码段,.rdata只读数据段,.data全局变量数据段,所以值为0300, <3>位置C4,WORD,表示后面的PE文件可选头的占空间大小,即224字节(E0),值为E000 <4>位置C6,WORD,表示文件是EXE还是DLL,如果是可执行文件写0200,如果是dll,写0020, <5>位置C8,WORD,表示文件格式,如果是0B01表示.exe,如果是0701表示ROM映像

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文件可选头:虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。(长度 224byte )。 各段头部:又称节头部,一个Windows NT的应用程序典型地拥有9个预定义段(节),它们是“.text”、“.bss”、“.rdata”、“.data”、“.rsrc”、“.edata”、“.idata”、“.pdata”和“.debug”。一些应用程序不需要所有的这些段,同样还有些应用程序为了自己特殊的需要而定义了更多的段。(每个段头部占40byte,我们这里也不需要所有的段,仅需3个段。) 通常我们是将PE整个结构分成四个部分,把MS-DOS MZ 头部和MS-DOS 实模式残余程序作为第一部分,可以称他为DOS部分,而PE文件标志、PE文件头、PE文件可选头三个部分作为第二部分,称之为PE头部分,因为这部分才是Windows下真正需要的部分,所以从PE文件标志开始才是真正的PE部分。各段头部是第三部分,称之为节表。它详细描述了PE文件中各个节的详细信息。最后就是各个节的实体部分了,称为节数据。 以上仅仅是对PE结构各部分的大体讲解。接下来再手写这个Hello World!程序过程中,我将详细介绍每个部分的含义。 首先准备一下工具,一个十六进制编辑器足以。我们这里使用VC++ 6.0所携带的十六进制编辑器,您也可以使用如WinHex等十六进制编辑工具。 打开VC,选择文件,新建菜单项,然后选择一个二进制文件,单击确定。一切就绪了,下面就开始手写可执行程序,如图2所示:

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

甲壳虫免杀VIP教程 https://www.doczj.com/doc/0f14124772.html, 专业的免杀技术培训基地 我们的口号:绝对不一样的免杀教程!绝对不一样的实战体验!清晰的思路!细致全面的讲解!让你感到免杀原来可以这么简单! 动画教程只是起到技术交流作用.请大家不用利用此方法对国内的网络做破坏. 国人应该团结起来一致对外才是我们的责任.由此动画造成的任何后果和本站 无关. -------------------------------------------------------------------- 【免杀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文件格式

pe文件格式:PE文件格式(1) 疯狂代码 https://www.doczj.com/doc/0f14124772.html,/ ?:http:/https://www.doczj.com/doc/0f14124772.html,/Waigua/Article60255.html 介绍说明:希望本文能够对初级入门CRACKER有定帮助翻译存在疏漏或者不准确希望来信指出感谢您指导!感谢看雪为我们提供这个交流平台让我们技术和时俱进!! 前言: PE("portableexecutable")文件格式是针对MSwindowsNT,windows95and win32s可执行 2进制代码(DLLsandprograms)在windowsNT内,驱动也是这个格式也可以用于对象文件和库 这个格式是Microsoft设计并在1993经过TIS(toolerfacestandard)委员会 (Microsoft,Intel,Borland,Watcom,IBM等)标准化了它基于在UNIX和VMS上运行对象文件和可执行文件COFF"commonobjectfileformat"格式 win32SDK包括个头文件包括对PE格式定义我将提及成员名和定义你也可能发现DLL文件"imagehelp.dll"非常有用它是NT部分但文档很少它些在"DeveloperNetwork"被描述 总览: 在PE文件开始我们可以发现MSDOS执行部分("stub");这使得任何个PE文件是有效DOS执行文件在DOS-stub的后是32位魔数0x00004550(IMAGE_NT_SIGNATURE).然后是个COFF格式文件头指明在何种机器上运行多少个节在里面连接时间是否是可执行文件或者DLL等DLL和可执行文件区别:DLL不能够启动只可以被其他可执行文件使用个可执行文件不能够连接到另个可执行文件 接着我们看到个可选文件头optionalheader(虽然叫“可选”它实际上直存在) COFF把可选文件头用于库不用于目标文件这里告诉我们文件如何被调入:起始地址预留堆栈数数据段尺寸 个有趣部分是尾巴上数据目录datadirectories这些目录包含指向节内数据指针例如如果文件有输出目录可以在成员IMAGE_DIRECTORY_ENTRY_EXPORT内发现个指针指向那个目录(目录描述结构->THUNKDATA结构->BYNAME结构)他将指向个节 在头后面是节头实际上节内容就是真正需要运行个所需要东西所有头和目录成员就是帮你找到它每个节有几个标志:对齐包含数据类型(化数据等)是否可以共享等及数据自身多数节含有个或多个通过“可选头”内数据目录项引用目录没有目录类型内容是化数据或者可执行代码(节是物理意义上内容组织目录是逻辑意义上内容

【翻译】“PE文件格式”1.9版 完整译文(附注释)

标题:【翻译】“PE文件格式”1.9版完整译文(附注释) 作者:ah007 时间: 2006-02-28,13:32:12 链接: https://www.doczj.com/doc/0f14124772.html,/showthread.php?t=21932 $Id: pe.txt,v 1.9 1999/03/20 23:55:09 LUEVELSMEYER Exp $ PE文件格式系列译文之一---- 【翻译】“PE文件格式”1.9版完整译文(附注释) ========================================================= 原著:Bernd. Luevelsmeyer 翻译:ah007 [注意:本译文的所有大小标题序号都是译者添加,以方便大家阅读。圆圈内的数字是注释的编号,其中注释②译自微软的《PECOFF规范》,其它译自网络。----译者] 一、前言(Preface) ------------------ PE(“portable executable”,可移植的可执行文件)文件格式,是微软WindwosNT,Windows95和Win32子集①中的可执行的二进制文件的格式;在WindowsNT中,驱动程序也是这种格式。它还能被应用于各种目标文件②和库文件中。 这种文件格式是由微软设计的,并于1993年被TIS(tool interface standard,工具接口标准)委员会(由Microsoft,Intel,Borland,Watcom,IBM,等等组成)所批准,它明显的基于COFF文件格式的许多知识。COFF (“common object file fromat”,通用目标文件格式)是应用于好几种UNIX系统③和VMS④系统中的目标文件和可执行文件的格式。 Win32 SDK⑤中包含一个名叫的头文件,其中含有很多用于PE格式的#define和typedef定义。我将逐步地提到其中的很多结构成员名字和#define定义。 你也可能发现DLL文件“imagehelp.dll”很有用途,它是WindowNT的一部分,但其书面文件却很缺乏。它的一些功用在“Developer Network”(开发者网络)中有所描述。 二、总览(General Layout) ------------------------- 在一个PE文件的开始处,我们会看到一个MS-DOS可执行体(英语叫“stub”,意为“根,存根”);它使任何PE文件都是一个有效的MS-DOS可执行文件。 在DOS-根之后是一个32位的签名以及魔数0x00004550 (IMAGE_NT_SIGNATURE)(意为“NT签名”,也

PE文件加密方法

对于一个软件开发商来说,要想了解PE文件加密处理的技术,第一步必须要研究PE文件格式,研究PE文件格式不但可以给我们洞悉Windows结构的良机,而且对于如何去保护自己开发的软件,有非常好的帮助,那么PE文件能否加密呢?下面我们就给大家介绍一下如何给PE文件加密。 一、什么是PE文件 PE文件的意思就是Portable Executable(可移植的执行体)。它是Win32环境自身所带的执行体文件格式,它的一些特性继承自Unix的Coff(common object fileformat)文件格式。“portable executable”(可移植的执行体)意味着此文件格式是跨win32平台的,即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。当然,移植到不同的CPU上PE执行体必然得有一些改变。所有win32执行体都使用PE文件格式,包括动态库NT的内核模式驱动程序(kernel?mode drivers)。EXE 与DLL的差别完全是语义上的,它们使用格式,其实都是PE文件格式。唯一的区别就是其中有一个字段标识出是EXE还是DLL,还有很多DLL的扩展比如OCX,CPL等都是PE文件格式。 二、PE文件加密 对被保护软件的可执行文件加密是软件保护产品的重要组成部分,一般的加密思路是对可执行文件进行加一层保护壳,即对原始文件的代码段、数据段、引入表和原始入口点等进行加密,只有在运行完加壳的代码,才对以上内容进行解密。对PE文件加密是软件开发商保护自己合法软件的一个重要步骤,它可以极大的提高被保护软件的安全性。下面介绍一下加过密的可执行文件的装载过程。

4各种文件格式的不同分析

JPEG/BMP/TIF/PNG四种图像格式有什么不同? 一、BMP格式 BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。所以,目前BMP在单机上比较流行。 二、GIF格式 GIF是英文Graphics Interchange Format(图形交换格式)的缩写。顾名思义,这种格式是用来交换图片的。事实上也是如此,上世纪80年代,美国一家著名的在线信息服务机构CompuServe针对当时网络传输带宽的限制,开发出了这种GIF图像格式。GIF格式的特点是压缩比高,磁盘空间占用较少,所以这种图像格式迅速得到了广泛的应用。最初的GIF 只是简单地用来存储单幅静止图像(称为GIF87a),后来随着技术发展,可以同时存储若干幅静止图象进而形成连续的动画,使之成为当时支持2D动画为数不多的格式之一(称为GIF89a),而在GIF89a图像中可指定透明区域,使图像具有非同一般的显示效果,这更使GIF风光十足。目前Internet上大量采用的彩色动画文件多为这种格式的文件,也称为GIF89a格式文件。此外,考虑到网络传输中的实际情况,GIF图像格式还增加了渐显方式,也就是说,在图像传输过程中,用户可以先看到图像的大致轮廓,然后随着传输过程的继续而逐步看清图像中的细节部分,从而适应了用户的"从朦胧到清楚"的观赏心理。目前Internet 上大量采用的彩色动画文件多为这种格式的文件。但GIF有个小小的缺点,即不能存储超过256色的图像。尽管如此,这种格式仍在网络上大行其道应用,这和GIF图像文件短小、下载速度快、可用许多具有同样大小的图像文件组成动画等优势是分不开的。 三、JPEG格式 JPEG也是常见的一种图像格式,它由联合照片专家组(Joint Photographic Experts Group)开发并以命名为"ISO10918-1",JPEG仅仅是一种俗称而已。JPEG文件的扩展名为.jpg 或.jpeg,其压缩技术十分先进,它用有损压缩方式去除冗余的图像和彩色数据,获取得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像质量。同时JPEG还是一种很灵活的格式,具有调节图像质量的功能,允许你用不同的压缩比例对这种文件压缩,比如我们最高可以把1.37MB的BMP位图文件压缩至20.3KB。当然我们完全可以在图像质量和文件尺寸之间找到平衡点。由于JPEG优异的品质和杰出的表现,它的应用也非常广泛,特别是在网络和光盘读物上,肯定都能找到它的影子。目前各类浏览器均支持JPEG这种图像格式,因为JPEG格式的文件尺寸较小,下载速度快,使得Web页有可能以较短的下载时间提供大量美观的图像,JPEG同时也就顺理成章地成为网络上最受欢迎的图像格式。 四、JPEG2000格式 JPEG2000同样是由JPEG组织负责制定的,它有一个正式名称叫做"ISO15444",与JPEG相比,它具备更高压缩率以及更多新功能的新一代静态影像压缩技术。JPEG2000作为JPEG的升级版,其压缩率比JPEG高约30%左右。与JPEG不同的是,JPEG2000同时支持有损和无损压缩,而JPEG只能支持有损压缩。无损压缩对保存一些重要图片是十分有用的。JPEG2000的一个极其重要的特征在于它能实现渐进传输,这一点与GIF的"渐显"有异曲同工之妙,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图象由朦胧到清晰显示,而不必是像现在的JPEG一样,由上到下慢慢显示。此外,JPEG2000还支持所谓的"感兴趣区域"特性,你可以任意指定影像上你感兴趣区域的压缩质

PE文件格式分析及修改

PE文件格式分析及修改(图) PE 的意思是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行文件格式。它的一些特性继承自Unix的Coff(common object file format)文件格式。“Portable Executable”(可移植的执行体)意味着此文件格式是跨Win32平台的;即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。 PE文件在文件系统中,与存贮在磁盘上的其它文件一样,都是二进制数据,对于操作系统来讲,可以认为是特定信息的一个载体,如果要让计算机系统执行某程序,则程序文件的载体必须符合某种特定的格式。要分析特定信息载体的格式,要求分析人员有数据分析、编码分析的能力。在Win32系统中,PE 文件可以认为.exe、.dll、.sys 、.scr类型的文件,这些文件在磁盘上存贮的格式都是有一定规律的。 一、PE格式基础 下表列出了PE的总体结构 一个完整的PE文件,前五项是必定要有的,如果缺少或者数据出错,系统会拒绝执行该文件如下图

DOS MZ header部分是DOS时代遗留的产物,是PE文件的一个遗传基因,一个Win32程序如果在DOS 下也是可以执行,只是提示:“This program cannot be run in DOS mode.”然后就结束执行,提示执行者,这个程序要在Win32系统下执行。 DOS stub 部分是DOS插桩代码,是DOS下的16位程序代码,只是为了显示上面的提示数据。这段代码是编译器在程序编译过程中自动添加的。 PE header 是真正的Win32程序的格式头部,其中包括了PE格式的各种信息,指导系统如何装载和执行此程序代码。 Section table部分是PE代码和数据的结构数据,指示装载系统代码段在哪里,数据段在哪里等。对于不同的PE文件,设计者可能要求该文件包括不同的数据的Section。所以有一个Section Table 作为索引。Section多少可以根据实际情况而不同。但至少要有一个Section。如果一个程序连代码都没有,那么他也不能称为可执行代码。在Section Table后,Section数目的多少是不定的。 二、程序的装入 当我们在explorer.exe(资源管理器)中双击某文件,执行一个可执行程序,系统会根据文件扩展名启动一个程序装载器,称之为Loader。Loader会首先检查DOS MZ Header,如果存在,就继续寻找PE header,如果这两项都不存在,就认为是DOS 16位代码,如果只存在DOS MZ Header,而其中又指示

PE文件格式对定位病毒特征码的作用

摘要:电脑病毒时刻在网络中传播,影响人们的生活和工作。本文根据杀毒软件查杀电脑病毒的过程和原理,分析pe文件格式在查杀病毒过程中所起的作用。 关键词:pe文件格式;杀毒软件;病毒 中图分类号:tp309.5 文献标识码:a 文章编号:1007-9599(2013)01-0067-02 1 引言 互联网时代,病毒在网络上到处传播,窃取用户信息,破坏用户数据。杀毒软件起着“伸张正义”的角色,对病毒的破坏行为进行拦截和对病毒进行查杀。杀毒软件和病毒之间的关系是矛与盾的较量关系。虽然杀毒软件处于强者地位,一直在追杀着病毒,然而杀毒软件却是一个被动的强者。杀毒软件永远都是在病毒出现后才知道去追杀(杀毒软件预知病毒能力目前还不是很强),而病毒发现自己被追杀后,也会通过伪装、隐藏、变种等方式来躲过杀毒软件的查杀。 面对病毒的伪装、隐藏、变种,杀毒软件如何能准确而快速的对病毒进行查杀呢?本文从杀毒软件查杀病毒的原理出发,分析pe文件格式在杀毒软件定位病毒特征码中的作用。杀毒软件通过快速准确定位病毒特征码,对伪装、隐藏、变种病毒进行查杀。 2 杀毒软件查杀病毒的原理概述 2.1 电脑病毒 对于操作系统来说,电脑病毒和其他应用程序是没有差别的,都是一个exe程序。只是功能上有所区别,通常病毒程序的功能是窃取用户信息、破坏电脑中的数据等,而一般的应用程序不会这么做。 2.2 杀毒软件查杀病毒的原理及特征码的作用 由于电脑病毒也是一个exe程序,杀毒软件怎样判断一个exe程序是一个病毒程序呢? 通常是先经过杀毒软件公司的技术人员来分析,验证某程序是否具有窃取用户信息,破坏电脑数据的行为。如果有,则认为是病毒程序。在确定为病毒程序后,则需要提取该病毒文件的特征码并把特征码录入病毒库。如果杀毒软件遇上某程序文件的特征码存在于病毒库中,那么杀毒软件则判断该程序文件是一个病毒文件。从这里可以看出来,杀毒软件对病毒文件的判断主要就是通过特征码比较来判断的。 世界上有无数的exe应用程序,如果某一个非病毒程序文件与一个病毒程序文件有相同的特征码,那么杀毒软件就是“杀错好人”了。“杀错好人”的情况就是“误杀”。 一个病毒程序也可能有无数个变种,如果某一个病毒,杀毒软件只杀了第一次出现时病毒版本,而不杀它的变种版本,那么杀毒软件就是“放走坏人”了。“放走坏人”的情况就是“漏杀”。 为了减少误杀和漏杀,特征码可能不止一个,而是一组。一组特征码按照一定的排列组合来确定某程序文件是否为病毒,这样会大大减少误杀的情况。然而增加特征码的个数会增加特征码的对比次数,从而增加查杀时间。 从杀毒软件查杀病毒的原理可以知道,杀毒软件杀毒的过程中有如下矛盾: 减少“查杀时间”,那就需要减少特征码的个数,但是这样子会提高“误杀率”和“漏杀率”。 为了降低“误杀率”和“漏杀率”,需要增加特征码的个数,但是这样子会增多“查杀时间”。 也就是说“查杀时间”与“误杀率”是一对矛盾。而其中解决这对矛盾的关键因素就是特征码的个数了。 针对这对矛盾,杀毒软件需要做的事情就是要定位出精准和稳定的特征码。定位出精准和稳定的特征码就是要找到最少的特征码来标识一个病毒,而且要这些特征码在病毒的变种

PE结构详解(64位和32位的差别)

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头。NT头分成3个部分,因为第2部分在32与64位系统里有区别,第3部分虽然也是头,但实际很不像“头”。 第1部分(20个字节) 第2部分(96或112个字节)

PE文件格式实验

PE文件格式分析实验 使用工具LordPE/PEview、winhex 选择一个exe或者DLL文件 阶段一:(本次实验) 1.DOS头部查看、对应DOS头结构进行数据逐项分析 2.PE头部查看、对应PE头结构进行数据逐项分析 3.Exe文件和DLL文件均是PE格式,他们的区别在哪里? 4.Section表结构的查看(是否可以增加一个新的section表?对齐边界是多少?) 5.PE文件section查看、对应section 块表结构进行数据分析 6.VA、RVA、RA计算 7.问题:你查看的PE文件DOS、PE头部的空隙是多大? 8.问题:你查看的PE文件在那个section的空隙最大/最小? 9.问题:如果手工增加一个section,要修改哪些字段,请手工试验。(提高:你的新块表 增加是否引起原文件的对齐位置的改变?) 10.问题(提高):一个section的属性字节如何设置,请在上一个问题基础上实验。 本次实验要求对照以上要求,自行选择文件进行分析,撰写报告。 阶段二:(后一阶段的工作) 1.资源查看、修改 2.编写PE文件分析程序 3.编写PE病毒程序 附录1PE格式详细讲解(一) 前几天发了一个PE信息查看器的小工具,本来想用那个获取邀请码的,可是觉得几率不是太大,于是再献上一篇教程,既是为了自己能获得邀请码,也是帮助那些想学习PE格式的人,让知识来源于网络再回归网络。 N年没写文章了,不知道句子还能不能写通顺,最近正在看《软件加密技术内幕》,刚看完PE结构那部分内容,所以想起来写篇教程作为读书笔记,既可加强记忆又可帮助别人,何乐而不为呢。 好了,废话少说好戏正式上场,PE是英文Portable Executable(可移植的执行体)的缩写,从缩写可以看出它是跨平台的,即使在非intel的CPU上也能正常运行的。它是 Win32环境自身所带的执行体文件格式。其实不光是EXE文件是PE格式,其它的一些重要文件,例如动态链接库文件(DLL),驱动文件(SYS)等也是PE格式的,所以学好PE格式是非常重要的,以下我把这类文件统称为PE文件。学习PE文件结构不仅可以使我们知道可执行文件是怎样运行的,也可以使我们了解一下windows操作系统的一些工作机制,精通PE是成为计算机高手的必经之路。 其实说白了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 之中,根本就 没有程序代码需要修补。这和 NE 档有极明显的差异。NE 档的每一个节区内含一串待修 正记录(fixup records ),如果某一节区呼叫同一个 DLL 函数 20 次,加载器就必须忙 碌 20 次,将函数地址拷贝到待修正记录之中。PE 档这种处理方式也有缺点:你不能够 以 DLL 函数的真正地址初始化一个变量。例如: FARPROC pfnGetMessage = GetMessage; 是把 GetMessage 函数地址放到 pfnGetMessage 变量中。在 Win16 这没问题,在 Win32 ,变量中放的其实将是稍早我说过的JMP DWORD PTR [XXXXXXXX]指令的地址。如 果你根据这个函数指针来呼叫函数,事情会如你所预期。但如果你要以此指针读取 GetMessage 的前数个字节,幸运之神不会站在你那边。稍后我将在「PE 文件的输出 (exports )」一节中再继续讨论这个主题。 在我写完本章的第一个版本之后,Visual C++ 2.0 推出了。它介绍另一种新的呼叫方式。 如果你看过 Visual C++ 2.0 的系统表头文件(例如 WINBASE.H ),你将看到和过去不同 的东西。在 Visual C++ 2.0 中,API 函数原型都有一个 __declspec(dllimport )作为原型 的一部份。当你呼叫一个这样的函数,编译器不会在模块的另一个地方产生JMP DWORD PTR [XXXXXXXX]指令,而是产生一个CALL DWORD PTR [XXXXXXXX]函数呼叫。XXXXXXXX 位 址位于 .idata 内,作用与原先在JMP DWORD PTR [XXXXXXXX]指令中的地址相同。就我 所知,Borland C++ 4.5 编译器并没有这样的性质。 Borland CODE 以及 .icode sections

PE文件结构详解

PE文件结构详解 1 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式。PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩。 然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂PE格式。本文旨在解决这一问题,它会对整个的PE文件格式作一个十分彻底的解释,另外,本文中还带有对所有必需结构的描述以及示范如何使用这些信息的源码示例。 为了获得PE文件中所包含的重要信息,我编写了一个名为PEFILE.DLL的动态链接库,本文中所有出现的源码示例亦均摘自于此。这个DLL和它的源代码都作为PEFile示例程序的一部分包含在了CD中(译注:示例程序请在MSDN中寻找,本站恕不提供),你可以在你自己的应用程序中使用这个DLL;同样,你亦可以依你所愿地使用并构建它的源码。在本文末尾,你会找到PEFILE.DLL的函数导出列表和一个如何使用它们的说明。我觉得你会发现这些函数会让你从容应付PE文件格式的。 2 介绍 Windows操作系统家族最近增加的Windows NT为开发环境和应用程序本身带来了很大的改变,这之中一个最为重大的当属PE文件格式了。新的PE文件格式主要来自于UNIX操作系统所通用的COFF规范,同时为了保证与旧版本MS-DOS及Windows操作系统的兼容,PE文件格式也保留了MS-DOS中那熟悉的MZ头部。 在本文之中,PE文件格式是以自顶而下的顺序解释的。在你从头开始研究文件内容的过程之中,本文会详细讨论PE文件的每一个组成部分。 很多解决PE文件格式的工作和直接观看数据有关。例如,要弄懂导入地址名称表是如何构成的,我就得同时查看.idata段头部、导入映像数据目录、可选头部以及当前的.idata段实体,而EXEVIEW.EXE就是查看这些信息的最佳示例。 在针对PE文件的有关编程中,你可能用到以下一些数据结构: IMAGE_DOS_HEADER IMAGE_IMPORT_DESCRIPTOR IMAGE_NT_HEADERS IMAGE_SECTION_HEADER IMAGE_OPTIONAL_HEADER IMAGE_DA TA_DIRECTORY IMAGE_FILE_HEADER 3 PE文件结构图

相关主题
文本预览
相关文档 最新文档