收藏 分享(赏)

软件安全设计逆向工程与反逆向工程.doc

上传人:wo7103235 文档编号:6264688 上传时间:2019-04-03 格式:DOC 页数:60 大小:1.12MB
下载 相关 举报
软件安全设计逆向工程与反逆向工程.doc_第1页
第1页 / 共60页
软件安全设计逆向工程与反逆向工程.doc_第2页
第2页 / 共60页
软件安全设计逆向工程与反逆向工程.doc_第3页
第3页 / 共60页
软件安全设计逆向工程与反逆向工程.doc_第4页
第4页 / 共60页
软件安全设计逆向工程与反逆向工程.doc_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、本 科 毕 业 论 文软件安全设计-逆向工程与反逆向工程Reversing Engineering and Anti-Reversing姓 名:学 号:学 院:软件学院系:软件工程专 业:软件工程年 级: 指导教师: 年 月摘要随着计算机技术的发展,面向应用领域和行业需要求的软件不用断的孕育而生。但无论那种优秀的软件,其内部的核心技术往往往是该软件的命脉,一旦被他人窃取或者非法利用,由此产生的顺势是无法估量的。因特网給我们的生活和方便带来日新月异的变化的同时,也为盗版软件提供了良好的媒介,除了可以通过外在的法律手段来打击盗版行为之外,深入的学习软件保护技术,也是非常有必要的。虽然很多厂商对这个

2、方面的技术有所了解,但很少有人能够像分析软件工程一样去对软件加密进行系统的分析,因而,一些虽然运用了保护技术的程序,仍然能够成功被解密者轻松解密。本研究主要围绕软件保护进行展开的。主要内容有:(1) 分析了 PE 文件的详细结构 可执行文件的格式是操作系统本身执行机制的反映。理解 PE 文件格式,有助于对操作系统的深刻认识。(2) 列举了一些常见的软件保护手段和软件攻击技术加密与解密是矛与盾的关系,深入的了解解密技术,才能做出更好的加密体系结构。(3) 深入探讨汇编和高级语言的关系,实现代码重构(4) 设计一款外壳,用来保护软件程序代码,防止代码被逆向软件的核心技术与核心代码,是企业的生命,是

3、企业之间竞争的关键。通过深入了解汇编语言和高级语言的对应关系,揭示内部的数据结构秘密,并有针对性的对代码进行保护。关键词: 破解;逆向;PE 结构;外壳AbstractWith the development of computer science, there are more and more industry applications. But to any of the excellence software, the main technique is usually the vitals of the software. Once it is stolen or is used l

4、awless, the damage would be out of control。Though We may protect by law, learning the software protection is still necessaryEven the developers know the protection technique, but seldom has one analyze software protection system in software engineering. So some application using lots of protection m

5、ethods are still cracked by crackers。The research is mainly about software attack and protection(1) Parse the PE file format The format of PE file imply how the system works。Learning the PE file format is an effective way of understanding system。(2) List some method ways of software attack and prote

6、ctionThe relation of crypt and decrypt looks like lance and shield,only we learn the attack deeply can we make a solidity protection system 。(3) Investigate the relation between assembler and advanced program language and revaluate the kernel of the code(4) Design a PE-file protector to protect soft

7、ware from reversingThe kernel technique of a software have much to do with the anima of a software company。By research,we will try to get the secret of reversing,and do some protections for the code of our software。Key Word: Crack;Reverse;PE-Structure;Shell目 录第一章 概述 11.1 软件加密的发展历史 .11.2 加密方式的确定因素 .2

8、1.3 软件保护的应用模式 31.4 软件加密的误区 41.5 软件加密的代价 5第二章 PE 格式解析 72.1 PE 的基本概念 72.1.1 区块 72.1.2 相对虚拟地址 .92.2 详细解析 10第三章 破解与反破解 253.1 软件保护手段 .253.2 反破解 .283.3 调试工具 303.4 实例分析 313.5 反调试 .32第四章 逆向与反逆向 384.1 逆向工具 384.2 逆向分析技术 .414.2.1 启动函数 424.2.2 函数 424.2.3 变量 424.2.4 数据结构 424.2.5 控制结构 424.3 外壳简介 424.3.1 外壳的概念 .42

9、4.3.2 外壳的架构 .434.4 外壳主程序 434.4.1 判断文件 PE 文件 .434.4.2 基本数据的读入 444.4.3 额外数据的保留 454.4.4 重定位数据的去除 .454.4.5 文件的压缩 .454.4.6 区块的融合 .464.4.7 输入表的处理 .464.5 外壳部分编写 .474.5.1 外壳的加载过程 474.5.2 自建输入表 .484.5.3 外壳引导段 .48第五章 总结与展望 495.1 工作总结 495.2 未来展望 49参考文献 .50致 谢 .51ContentsChapter1 Introduction.11.1 The History O

10、f Software Cryption.11.2 Method Of Cryption.21.3 Software Protection.31.4 Misunderstand On Cryption.41.5 Cryption Cost 5Chapter2 Analyzing Pe-File Format .72.1 Introduction .72.1.1 Section.72.1.2 Relative Virtual Address .92.2 Detailed Analysis10Chapter3 Crack And Anit-Crack253.1 Methods Of Protecti

11、on 253.2 Anti-Crack283.3 Debugger .303.4 Target Analysis.313.5 Anti-Debug .32Chapter4 Reverse And Anti-Reverse384.1 IDA Pro384.2 Reverse Technique 414.2.1 Start Function424.2.2 Function424.2.3 Variable 424.2.4 Data-Structure.424.2.5 Controls-Structure .424.3 Shell .424.3.1 Introduction .424.3.2 Stru

12、cture .434.4 Basic Option.434.4.1 Check PE-Signature434.4.2 Read Basic Data.444.4.3 Save Extra Data454.4.4 Remove Reloc.454.4.5 Compress Data454.4.6 Crasis Sections464.4.7 Encrypt IAT.464.5 Loader 474.5.1 Course Of Loader 474.5.2 Rebuild Import Table .484.5.3 Shell Loader 48Chapter5 Conclusions And

13、Future Work .495.1 Conclusions.495.2 Shortcoming And Future Work 49References .50Acknowledgements.51第一章 概述1第一章 概述1.1 软件加密的发展历史随着 Windows98 的普及,计算机的发展进入了互联网时代,于是一种销售模式应运而生先用后买:一般软件从网上下载后,用户可以免费使用,但软件的功能、或者使用时间会有所限制,当用户觉得这个软件好用并购买的时候,就可以通过来和软件作者沟通,用户付款,软件作者通过电话、伊妹儿将软件注册码发給用户。这种加密模式对于开发商来说,成本非常低,开发商节省了

14、包装和渠道上的成本,并且很容易实现跨地区,跨国界来进行软件销售。然而这种加密模式,最大的一个问题就是无法阻止注册后的用户扩散其完整的产品,因为用户注册后用户手里的软件就是正版软件了。只要这个用户把序列号之类的注册信息扩散出去,其他人也就能够把自己手里的软件变成正版。于是后来有人在此基础上对软注册机制进行了一种改良,即一机一码,具体的原理就是软件在执行的过程中要搜集当前运行的计算机上的特定信息,当用户需要注册时,软件会搜集用户计算机的信息,然后根据当前计算机的信息,计算出注册码,这样,用户拿到注册码后无法进行扩散,因为特定的计算机的注册码只是针对特定的计算机有效,无法在别人的电脑上使用。但这样也

15、会对正版的用户造成麻烦,因为软件被限定在一台计算机上使用,就算用户在证明自己的有效信息以后,不需要再缴纳额外的费用,但一来一回的注册周期还是很难避免的,就算不换电脑,对自身电脑的升级,也会引来如此的问题WindowsXP 的加密:采用序列号方式的加密,但微软通过系统升级,把主动权牢牢的把握在自己的手里,但这种加密模式,需要大量的注册服务器和相关的服务人员厦门大学本科毕业论文 软件安全设计逆向工程与反逆向工程21.2 加密方式的确定因素1.2.1 开发环境Windows 平台下的加密方案要比 Linux 平台下多很多1.2.2 软件类型对于通用软件,因为用户群是海量的,即使在加密上的一点点小问题

16、,也会带来海量的维护性工作,这种类型的软件的加密,可靠性是第一的。1.2.3 加密强度加密强度是一个相对性的概念,软件保护并非越强越好,软件加密强度是以开发时间和运行效率为代价的。对于那些深受盗版危害的软件,可以采用更好的加密技术来保护自己的软件。那些未经时常检验的新软件来说,在提高加密强度上投入太多的经历,会让人感觉本末倒置.1.2.4 生命周期 软件保护是否合适的评价标准应该是以软件的生命周期来衡量。一味的追求强度,不可破解的保护是得不偿失的。如果一个软件能够在其所期望的生命周期内不被破解,那么这个加密就是成功的。1.2.5 用户群一般来说,越常用的软件受到的攻击性可能越大,并且,解密者的

17、水平以业余者居多。对于那些售价比较高昂的行业软件,收到的攻击会比较少,但这些软件也往往是那些专业解密者所青睐的,并且,这些解密者的水平也比较高第一章 概述31.2.6 产品售价软件的价格往往也决定软件加密的成本,通常加密的成本应该控制在 10%以内1.2.7 升级模式软件在销售以后,不可避免的要对软件进行升级和维护,而升级和维护也并非都是无偿的。通过软件保护来管理升级和维护,以降低软件维护的成本。1.3 软件保护的应用模式1.3.1 无法运行在不满足加密条件的情况下,直接退出运行状态,但就加密而言,这个并不是一个好的加密方式,这种加密模式一般都在程序运行的开始的地方,比较容易被找到。1.3.2

18、 次数和时间一般的共享软件都有天的使用限制,过了这个期限就无法使用了,但这并不是最好的保护模式,因为软件里面已经包含了所需要的所有代码1.3.3 功能限制大部分演示版的软件是按照这个思路来保护的,譬如有些软件无法保存结果,无法打印输出。如果希望某个功能无法使用,那么就根本不要添加相应的代码,这样做的缺点是,当用户决定购买时候,还需要在此提供給用户一个新的完整版本的软件1.3.4 NAG 窗口很多软件在开始执行的时候或者执行的过程中弹出提醒你还没有注册。厦门大学本科毕业论文 软件安全设计逆向工程与反逆向工程4NAG 窗口的频繁出现,会让你感觉到头痛,如果想不头痛,就只好花钱来购买正版1.3.5

19、试用水印很多以输出结果为最终目的的软件采用这种加密方式,比如,印刷类的,图像处理类的。让使用着能看到输出结果,但无法把结果发表出去。虽然理论上可以破解,但实际难度要大得多1.3.6 服务升级WindowsXP 升级另外一种升级模式就是数据库服务,比如股票软件和病毒查杀软件。这种类型的软件需要定期更新数据库,在用户升级数据的时候核对身份,能有效的防止大部分盗版1.4 软件加密的误区1.4.1 加密产品这是一种对软件加密的片面理解。所有从事加密行业工作的公司所提供的产品基本上属于二次开发类型。加密公司只能保证它所完成部分的安全性,而开发商如何有效的使用加密公司所提供的功能来完成加密要求,很大一部分

20、程度取决于开发商自己1.4.2 集中加密很多软件开发商在项目测试基本完成以后,只抽出一个人专门給软件搞几天加密工作,而编程人员本身没有太多的加密经验,而且实践安排的又非常紧凑,往往凑合一下就发布出去,这样的加密效果可想而知了。现在的解密者,大多是身经百战的高手,即使殚精竭虑设计出来的加密也不见得能挡得住,何第一章 概述5况这种匆匆忙忙设计出来的加密1.4.3 保密加密一些软件公司认为软件的加密应该属于公司的核心机密领域,整个加密贬值和处理了解的人越少越安全,事实并非如此,加密属于百密一疏的问题,也许加密者对于很多地方都考虑的很周全,但若有一个地方没有考虑周到,就有可能被作为突破点,把整个软件破

21、解掉对于一个公司来说,完全可以让多个人来搞加密,如果担心安全性出问题的话,可以让每个人只搞一个加密点,再由专门的人来汇总,这样完整的加密还是掌握在少数人的手里1.4.4 外壳加密用这种方式保护,使用起来非常容易,并且一般外壳都有专门的反跟踪反调试的功能看起来似乎完美,但外壳有利有弊,就像外壳有通用的加密方法,进而也有通用的解密方法由此可见,最好不要把外壳作为软件保护的唯一手段1.4.5 加密算法不少人会认为,好的加密算法就会带来好的软件保护效果,实际上这完全是两个不同的概念。标准加密算法的对象是数据,对于纯数据保护来说,好的加密算法代表一切,对于软件则不然。所有的加密解密都必须在软件中完成,即

22、使解密者不懂开发商所使用的加密算法。但若把比较过程直接强制改写为成功,一定可以达到破解效果。厦门大学本科毕业论文 软件安全设计逆向工程与反逆向工程61.5 软件加密的代价1.5.1 在兼容性上的代价应该尽量避免与系统相关性太强的反调试,反跟踪技巧1.5.2 执行效率上的代价加密锁是一种低速的设备,频繁的访问会使整个程序的执行速度直线降低。对于开发商来说,要慎重的考虑软件的加密点,加密要深埋,并且尽量不要放在那些会被频繁调用的子程序中.1.5.3 程序维护上的代价很多软件公司把软件加密视为公司的核心机密,代码如果只掌握在一两个人手中,如果这个人离开了这家公司,原来的加密就得全部作为,这样不但不好

23、,而且程序维护的成本也比较高可以考虑由一个人来做加密总体设计,具体的每个加密交给编程人员来做,这样对软件整体的安全性不会带来太大的影响。每个编程人员的思路不尽相同,因而能够产生效果各异的加密点微软的可执行文件,也就是 PE 格式,是官方文档的一部分。PE 文件衍生于早期建立的 COFF 文件格式, 。由于许多 WindowsNT 的创始者来自数字设备公司,因此他们很自然的使用已有的代码来开发新的 WindowsNT 平台。EXE 和 Dll 文件之间的区别完全是语意上的差别,他们使用完全相同的 PE格式。唯一的区别就是用一个字段来标识这个文件是 EXE 还是 DLL 格式。Dll格式还有许多扩

24、展,如 ocx 控件,控制面板控件.第二章 PE 格式解析7第二章 PE 格式解析2.1 PE 的基本概念纵览 PE 文件格式的特点是磁盘中的数据结构布局和内存中的数据结构布局是一致的。载入可执行文件的首要任务就是把磁盘中的文件映射到进程的地址空间。这样像 IMAGE_NT_HEADERS 这样的数据结构在磁盘和内存中是一样的,关键之处在于如何在 PE 文件中寻找这些内容。认识到 PE 文件不是作为单一的内存镜像文件被载入内存是很重要的。Windows 加载器遍历 PE 文件并决定文件的那一部分被映射,这种映射方式是将文件较高的偏移未知映射到较高的内存地址中。磁盘文件一旦被载入内存中,其某项的

25、偏移地址可能区别于原始的偏移位置,不管怎样,所有表现出来的信息都允许从磁盘文件到内存偏移的转换当 PE 文件通过 Windows 加载器被载入内存以后,内存中的版本成为Module。映射文件的起始地址成为模块的句柄 hModule,可以通过模块句柄来访问内存中的其他数据结构。这个初始的内存地址也成为基地址(ImageBase).内存中的模块代表着进程从这个可执行文件中所需要的代码,资源,和数据。PE 文件的其他部分可以被读入,但是可能不被映射,例如重定位,还有一部分根本就不被映射,比如当调试信息放到文件尾部的时候,PE 文件的一个字段告诉系统把文件映射到内存需要多少内存,不能被映射的数据将被放

26、置在文件的尾部。描述 PE 文件以及 OFF 文件的主要地方在 winnt.h 中。在这个头文件中,几乎能找到关于 PE 文件的每一个结构定义、枚举类型、常量定义、或同意义的内存中的结构。可以肯定在别的地方能找到相关文档,例如 MSDN,但是winnt.h 是 PE 文件定义的最终决定者。2.1.1 区块PE 文件使用的是平面地址空间,所有的代码和数据都被并在一起,组成一厦门大学本科毕业论文 软件安全设计逆向工程与反逆向工程8个很大的结构。文件的内容被分割成不同的 section.,区块中包含代码或者数据。畜类可读写的程序数据, ,区段中其他类型的数据包括输入表,输出表、资源、重定位表。每个区

27、块都有它自己在内存中的属性,包括这个区块是否包含代码,是否制度或者可读写。通常,区块的数据逻辑上是关联的。PE 文件一般至少有两个区块:一个是代码块,一个是数据块。每个区块都有一个截然不同的名字,这个名字用来传达区块的用途。例如,一个区块教 r.data,表明他是一个只读区块,使用区块名字只是人们为了方便,对于操作系统来说是无关紧要的,一个区块名为 Foobar 和命名为.text 是一样有效的。微软給这些区块取了有特色的名字,但这不是必须的。虽然编译器自动产生的一系列标准的区块,但这没有什么不可思议。程序员也可以创建和命名自己的区块。在 VC 中,用 #param 来声明,告诉编译器将数据插

28、入一个区块内#param data_seg(“MY_DATA”)这样所有被 VC+处理的数据都将放到一个 MY_DATA 的区块中。而不是默认的.data 区块内。大部分程序都只使用编译器产生的默认区块区块并不是全部在链接时形成的,他们一般是从 OBJ 文件开始,被编译器放置的,连接器的工作就是合并所有的 OBJ 和库中所需要的块,使其最终成为一个核实的区块。例如,在工程中的每一个 OBJ 至少都有一个包含代码和.text区块,链接器把这些区块合并成单一的.text 区块。链接遵循一套相当完整的规则,判断那些区块被合并以及如何合并。OBJ文件中的一个区块可能是为链接器而准备的,不会访日最后的可

29、执行文件中。区块有两种对齐值,一种用于磁盘的文件内,另一种用于内存中。PE 文件头指出这两个值,他们可以不同。每一个区块从对齐值的倍数的偏移地址开始。例如一个典型的对齐值是 0x2000,这样取夸从 0x200 的倍数的文件偏移位置开始一旦被映射到内存中,区块总是至少从一个页的边界处开始,也就是说,当一个 PE 文件被映射到内存的时候,每个区块的第一个字节对应于某内存页。在 x86 系列 CPU 中,页是按照 4KB 来排列的。第二章 PE 格式解析9.text 区块在磁盘文件中的偏移位置是 0x400,在 kernel32 的装入地址之上的0x1000 字节处。同样,.data 区块在磁盘

30、文件偏移的 0x74C00 处,在内存中将kernel32 的装入地址之上的 0x76000 字节处。建立一个区块在文件中的偏移和在内存中的偏移的 PE 文件是有可能的。这样会使可执行文件变大链接器的一个有趣的特征就是能够合并区块。如果两个区块有相似、一致的属性,那么他们在连接时就能合并成一个单一的区块。这取决于 merger 开暗管。/MERGER:rdata=.text 将.rdata 与.text 区块合并成为一个.text 的区块。合并区块的有点是可以节省磁盘和内存的空间。每个区块至少占用一个内存页。如果能将可执行文件内的区块数目从 4 个减少到 3 个,就很可能少用一个内存页。当然,

31、这取决于两个合并区块的结尾未用空间加起来是否能达到一页2.1.2 相对虚拟地址在可执行文件中,有许多地方需要指定内存中的地址。例如引用全局变量时,需要指定它的地址,PE 文件尽管有一个首选的载入地址(基地址),但他们可以载入到进程空间的任何地方,所以不能依赖于 PE 的载入点。由于这个原因,必须有一个方法指定地址而不依赖于 PE 载入点的地址为了在 PE 文件中避免有确定的内存地址,出现了相对虚拟地址(Relative Virtual Address,RVA).RVA 只是内存中的一个简单的相对于 PE 文件载入地址的偏移位置。加入,假设一个 EXE 文件从地址 0x400000 处载入,并且

32、他的代码区块开始于 0x00401000 代码区块的 RVA 将是目标地址 0x00401000 载入地址 0x00400000 = 0x1000将一个 RVA 转换成真实的地址,只是简单的反转这个过程:将实际的载入地址加上 RVA 几科得到实际的内存地址。PE 术语中,实际的地址成为虚拟地址 (Virtual Address.lingwai )。载入地址等于模块句柄,用 GetModuleHandl 函数返回可执行文件或者厦门大学本科毕业论文 软件安全设计逆向工程与反逆向工程10DLL 文件加载到进程的地址空间所用的句柄/装入地址。当调用该函数时候,传递一个可执行文件或者 DLL 文件名字字

33、符串,如果系统找到文件,则返回该可执行文件或者 DLL 文件镜像加载到的基地址。也可以调用 GetModuleHandl 传递 NULL 参数,返回调用可执行文件的基地址1.1.3 数据目录表2.2 详细解析2.2.1 DOS 头部每个 PE 文件是以一个 DOS 程序开始的,有了它,一旦程序在 DOS 下执行,DOS 就能识别出这是个有效的执行体,然后运行紧随 MZ Header 之后的DOS stub,Dos stub 实际上是一个有效的 EXE,在不支持 PE 文件格式的操作系统中,他将简单的现实一个错误提示,类似于字符串“This progtam cannot be run in MS

34、DOS mode”,程序员也可以根据自己的意图来实现完整的 DOS 代码,用户通常对 Dos-stub 不太感兴趣,因为大多数的情况下,它由汇编起和编译器自动生成,平常把 Dos 头和 Dos stub 合称为 DOS 文件头PE 文件的第一个字节起始于一个传统的 MS-DOS 头部,被称作IMAGE_DOS_HEADER,其中 IMAGE_DOS_HEADER 结构如下所示第二章 PE 格式解析11其中有两个字段比较重要,分别是 e_magic 和 e_lfanew。E_magic 字段需要被设置为 5D4Ah,这个值有个#define,名为 IMAGE_DOS_SIGNATURE.e_lf

35、new字段是真正的 PE 文件头的相对偏移地址,其指出真正的 PE 头的文件偏移位置,它占用四个字节,位于文件开始的偏移 3Ch 字节中。2.2.2 PE 文件头紧跟着 Dos stub 的是 PE 文件头。PE header 是 PE 相关结构 NT 镜像头IMAGE_NT_HEADER 的简称,其中包含许多 PE 装载器用的重要字段,执行体在支持 PE 文件结构的操作系统中执行时,PE 装载器将从IMAGE_DOS_HEADER 结构中的 e_lfnew 字段中找到 PE header 的起始偏移量,加上机制得到 PE 文件头的指针。pNTHeader = ImageBase + pDos

36、Header-e_lfnew实际上,有两个版本的 IMAGE_NT_HEADER,一个是为 32 位可执行文件准备的,另一个是为 64 位版本IMAGE_NT_HEADER 是由三个字段组成Signature 字段在一个有效的 PE 文件里,Signature 字段被设置为 0x00004550,ASII 码的字符是 PE00, #define MAGE_NT_SIGNATURE 定义了这个值PE00 字符串是文件头的开始,DOS 头部的 e_lfnew 字段正是指向PE00IMAGE_FILE_HEADER 结构IMAGE_FILE_HEADER 结构包含了 PE 文件爱你的一些基本信息,最

37、重要的是其中的一个域指出了 IMAGE_OPTIONA:_HEADER 的大小。下面介绍IMAGE_FILE_HEADER 结构的各个字段以及对这些字段的额外说明厦门大学本科毕业论文 软件安全设计逆向工程与反逆向工程12Machine:可执行文件的目标 CPU 类型。PE 文件可以在多种机器上使用不同平台指令的机器码是不同的。NumberOfSection:区块的数目:TimeDateStamp:表明文件被创建的时间,这个值是从 1070 年 1 月 1 日以来用格林威治时间计算的秒数。这个值比文件系统的日期时间更精确PointerToSymbolTable:COFF 符号表的文件偏移位置Nu

38、mberOfSymbols:如果有 COFF 符号表,则它代表其中的符号数目SizeOfOptionalHeader:紧跟在 IMAGE_FILE_HEADER 后面的数据大小。在 PE 文件中这个数据结构叫 IMAGE_OPTIONAL_HEADER,其大小依赖于 32位还是 64 位,对于 32 位来说,这个域通常是 00E0h,;对于 64 位这个域通常为00F0h.不管怎样,这些都是要求的最小值,较大的值也可能出现Characteristics: 文件属性,有选择地通过几个运算得到,这些标志的有效值定义于 winnt.h 内的 IMAGE_FILE_XXX 中。普通的 EXE 文件这个

39、字段的值一般是 010h,DLL 文件这个字段的值一般是 0210hIMAGE_OPTIONAL_HEADER 结构第二章 PE 格式解析13(01).Magic:是一个标记字,说明文件是 ROM 镜像 (0107h)还是普通镜像(010Bh)(02).MajorLinkerVersion:链接程序的主版本号(03).MinorLinkerVersion:链接程序的次版本号(04).SizeOfCode:所有带有 IMAGE_SCN_CNT_CODE 属性的区块的总共大小,这个值是向对弈某一个值的整数倍(05).SizeOfInitializedData:已经初始化数据块的大小,即在编译时所构

40、成的块的大小(不包括代码段)(06).SizeOfUninitializedData:未初始化数据块的大小,装载程序要在虚拟地址空间中为这些数据约定空间。这些块在磁盘文件中不占空间。正如UnniitializedData 所暗示的一样,这些块在程序开始运行时没有指定值,未初始化数据通常保存在.bss 块中。(07).AddressOfEntryPoint:程序执行的入口 RVA,对于 DLL,这个入口点是在进程初始化和关闭时候以及线程创建和毁灭时候调用。在大多数可执行文件厦门大学本科毕业论文 软件安全设计逆向工程与反逆向工程14中,这个地址并不直接指向 Main,WinMain,DllMain

41、,而是指向运行时库代码并由它来调用上述的函数。在 DLL 中这个域能被设置为 0,前面提到的同志消息都不能收到。链接器/Noentry 开关可以设置这个域为。(08).BaseOfCode:代码段的起始 RVA,在内存中,代码段通常在 PE 文件头之后,数据块之前。在 Mircosoft 链接器生成的执行文件中,RVA 通常是1000h.Borland 的 Tlink 是将 ImageBase 加上第一个 CodeSection 的 RVA,并将该结果存入该字段(09).BaseOfData:数据段的起始 RVA。数据段通常是在内存的尾部,即 PE文件头和 Code Section 之后。可是

42、,这个域的值对于不同版本的微软链接器是不一致的,在 64 位可执行文件中是不出现的。(10).ImageBase:文件在内存中的首选载入地址。目前如果没有其他占据这块地址,它是正确对齐的并且是一个合法的地址。加载器试图在这个地址载入PE 文件,如果可执行文件是在这个地址装入的,那么加载器将跳过应用基址重定位的步骤(11).SectionALingnment:当被载入的内存时的区块对齐大小。每个区块被载入的地址必定是 本字段指定熟知的整数倍。默认的对齐尺寸是 CPU 页的尺寸。(12).FileAlignment:磁盘上的 PE 文件内的区块的对齐大小,组成快的原始数据必须保证从本字段的倍数地址

43、开始。对于 X86 可执行文件,这个值通常是200h 或 1000h,这是为了保证块总是从磁盘的山区开始,这个字段的功能等价于 NE 格式文件中的断/资源对齐因子,为了保证段总是从磁盘的扇区开始,这个必须是 2 的幂,其最小值是 200h(13).MajorOperationgSystemVersion:要求操作系统的最低版本号的主版本号(14).MinorOperatingSystemVersion:要求的操作系统的最低版本号的次版本号(15).MajorImageVersion:该可执行文件的主版本号,由程序员定义(16).MinorImageVersion:该可执行文件的次版本号,由程序

44、员定义(17).MajorSubsystemVersion:要求最低子系统版本的主版本号第二章 PE 格式解析15(18).MinorSubsystemVersion:要求最低子系统版本的次版本号(19).Win32VersionValue:一个从来不用的字段(20).SizeOfImage:镜像载入内存后的总尺寸,它指载入文件从 ImageBase到最后一个块的大小,最后一块根据其大小往上取整(21).SizeOfHeader:DOS 头部、PE 头部、区块表的总尺寸。所有这些项目都出现在 PE 文件中,任何代码或数据之前。域值四舍五入到文件对齐的整数倍(22).CheckSum:镜像的校验

45、和。IMAGEHELPDLL 中的CheckSumMappedFile 函数可以计算这个值。一般 EXE 文件爱你可以是,但一些内核模式的驱动程序和系统 DLL 必须有一个校验和。当链接器的?RELEASE 开关被使用时,校验和被置于文件中(23)Subsystem:一个标明可执行文件所期望的子系统的枚举值。这个值对于 EXE 文件爱你是很重要的。(24).DllCharacteristics:DllMain()函数核实被调用,默认为(25).SizeOfStackReserve:在 EXE 文件里,为线程保留的堆栈的大小,它一开始只提交其中的一部分,只是在必要的时候才提交剩下的部分(26).

46、SizeOfStackCommit:在 EXE 文件里,一开始被委派給堆栈的内存数量,默认是 4kb(27).SizeOfHeapReserve:在 EXE 文件里,为进程的默认堆保留的内存。默认是 1MB。但是在当前的版本的 Windows 里,堆值在用户不干预的情况下就能增长超过这个值(28).SizeOfHeapCommit:在 EXE 文件里,委派給堆的内存大小。默认是4KB(29).LoaderFlags:与调试有关,默认为(30).NumberOfRvaAndSize:数据目录的项数。这个字段从最早的WindowNT 发布以来一直是 16(31).DataDirectory16:由

47、数个相同的 IMAGE_DATA_DIRECTORY 结构组成,指向输入表、输出表,资源块等数据。厦门大学本科毕业论文 软件安全设计逆向工程与反逆向工程16PE 文件中定位输出表、输入表和资源等重要数据的时候,就是从IMAGE_DATA_DIRECTORY 结构开始的。区块在 PE 文件头和原始数据之间存在一个区块表(Section Table),区块表包含每个块在镜像中的信息,分别指向布偶那个的区块实体。2.2.3 区块表紧跟着 IMAGE_NT_HEADER 后的是区块表,它是一个IMAGE_SECTION_HEADER 结构数组。每个 IMAGE_SECTION_HEADER 结构包含了

48、他所关联的区块的信息,如位置,长度,属性,该数组的数目由IMAGE_NT_HEADER.FileHeader.NumberOfSection 指出(01).Name:块名。这个是一个位的 ASCII 码名(02).VirtualSize:指出实际被使用的区块的大小,是区块在没对齐处理前的实际大小。如果 VirtualSize 大于 SizeOfRawData,那么 SizeOfRawData 是来自可执行文件初始化数据的大小,与 VirtualSize 相差的字节用填充。这个字段在 OBJ 文件爱你中是被设置为(03).VirtualAddress:该块装载到内存中的 RVA。这个地址是按照内

49、存页对齐的,它的数值总是 SecitonAlignment 的整数倍。在 Mircrosoft 工具中,第一个块的默认 RVA 为 1000h(04).SizeOfRawData:该快在磁盘文件中所占的大小。可执行文件中,该字段包含经过 FileALignment 调整后的块的长度。(05).pointerToRawData:该快在磁盘文件中的偏移。程序经编译或者汇编后第二章 PE 格式解析17生成的原始数据,这个字段用于给出原始数据在文件中的偏移。如果程序自装载 PE 或者 COFF 文件,这一字段比 VirtualAddress 还重要。在这种情况下,必须完全使用线性映射方法装入文件,所以须与奥在该偏移处找到块数据,而不是 VirtualAddress 字段的 VA 地址(06).PointerToRelocations:这段在 EXE 文件中无意义。在 OBJ 文件中,表示本块重定位信息的偏移值。在 OBJ 文件中如果不是,它会指向一个IMAGE_RELOCATION 结构数组(07).PointerToLinenumbers:行号表在文件中的偏移值。这是文件的调试信息(08).NumberOfRelocations:这部分在 EXE 文件中无意义。在 OBJ 文件

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报