逆向工程核心原理第1章 关于逆向工程_逆向工程核心原理第1章 关于逆向工程试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 逆向工程核心原理 > 第1章 关于逆向工程

逆向工程核心原理——第1章 关于逆向工程

1.1 逆向工程 逆向工程(Reverse Engineering,简称RE)一般指,通过分析物体、机械设备或系统,了解其结构、功能、行为等,掌握其中原理并改善不足之处、添加新创意的一系列过程。 1.2 代码逆向工程 代码逆向工程(Reverse Code Engineering,简称RCE)是逆向工程在软件领域中的应用,目前还没有准确而统一的术语,实际交流中经常出现混用的情况,常用术语有RCE、RE、逆向工程等,使用起来较为随意。 本书中将统一使用RCE、RE,或为了方便起见,直接使用逆向工程、逆向分析等表达。从个人的喜好来说,我更喜欢使用“分析”或“深入分析”这样的词语,后续内容中将大量出现,因为对软件的逆向工程实质就是对软件进行深入细致的分析。 1.2.1 逆向分析法 分析可执行文件时使用的方法大致分为两种:静态分析法和动态分析法。 1. 静态分析法 静态分析法是在不执行代码文件的情形下,对代码进行静态分析的一种方法。静态分析时并不执行代码,而是观察代码文件的外部特征,获取文件的类型(EXE、DLI、DOC、ZIP等)、大小、PE头信息、Import/Export API、内部字符串、是否运行时解压缩、注册信息、调试信息、数字证书等多种信息,如图1-1所示。此外,使用反汇编工具(Disassembler)查看内部代码、分析代码结构也属于静态分析的范畴。 我们通过静态分析方法会获得多种信息,这些信息是进行动态分析的重要参考资料,对代码的动态分析非常有帮助。 2. 动态分析法 动态分析法是在程序文件的执行过程中对代码进行动态分析的一种方法,它通过调试来分析代码流,获得内存的状态等。通过动态分析法,我们可以在观察文件、注册表(Registry)、网络等的同时分析软件程序的行为,如图1-2所示。此外,动态分析中还常常使用调试器(Debugger)分析程序的内部结构与动作原理。 我在逆向分析代码时,通常先采用静态分析法收集代码相关信息,然后通过收集到的信息推测程序的结构与行为机制。这些推测对动态分析具有非常高的参考价值,能为动态分析提供很多创意。对程序代码进行逆向分析的过程中,灵活使用静态与动态两种分析方法,动静结合,可以极大地提高代码的分析效率,增加分析的准确性,缩短代码分析时间。 图1-1 静态分析工具 图1-2 动态分析工具 提示 有人会误认为代码逆向分析就是调试代码。虽然代码调试在代码逆向分析过程中占据很大比重,也十分有意思,但它只是代码逆向分析的一个从属概念。请记住,代码逆向分析的方法多种多样,实际的代码逆向分析过程中通常会同时使用多种分析方法。 1.2.2 源代码、十六进制代码、汇编代码 代码逆向分析的主要对象是可执行文件,没有源代码的情况下分析可执行文件的二进制代码。因此,掌握程序源代码与二进制代码之间的关系将有助于理解代码的逆向分析过程。 下面构建一段C++代码来学习源代码、十六进制代码、汇编代码之间是如何转换的。 源代码(Source Code) 如图1-3所示,在Visual C++集成开发环境中编写helloworld.cpp源代码后,执行菜单栏中的“生成”(Build)命令,将程序代码编译成helloworld.exe可执行文件。 图1-3 Visual C++ 十六进制代码(Hex Code) 把程序源代码编译为0和1组成的二进制(Binary)可执行文件后,计算机就能够很好地识别它,但即便是逆向工程专家也很难理解它们的含义。把二进制代码文件转换为十六进制(Hex)代码文件后,数字位数随之减少,我们查看代码时要相对容易些。如图1-4所示,Hex Editor是一个简单易用的工具,使用它可以轻松地把二进制文件转换为十六进制文件。 图1-3的方框中是一个名为_tmain的函数源码,它在编译后转换为十六进制代码的形式,如图1-4所示(方框内的部分)。比较转换前后可以发现,变化是非常大的。 图1-4 Hex Editor 汇编代码(Assembly Code) 对我们而言,十六进制代码仍然不够直观。与十六进制代码相比,汇编代码更利于理解。下面仍以helloworld.exe程序为例,查看一下它对应的汇编代码,首先用调试器打开它。 图1-5是程序的调试界面,图1-4中的十六进制代码经过反汇编后转换为汇编代码,方框中的汇编代码对应图1-3中的_tmain()函数。 图1-5 调试器 在代码的逆向分析中,我们经常会像这样把待分析的代码转换为汇编代码后再分析。 1.2.3 “打补丁”与“破解” 对应用程序文件或进程内存内容的更改被称为“打补丁”(Patch),“破解”(Crack)与其含义类似,但后者的意图是非法的、不道德的,故有所区分。微软的Windows更新就是一个“打补丁”的例子。显然,打补丁的主要目的在于修复程序漏洞;反之,破解是对著作权的一种侵害(非法复制、使用等)。 学习软件逆向工程技术的人首先要明白,它是一柄双刃剑,像其他技术(大部分科学技术)一样,如果被恶意使用,它就会损害其他人的合法权益,所以学习逆向技术必须先培养伦理道德意识,提高个人的道德修养水平。 提示 本书不涉及正版软件的破解方法,主要讲解逆向技术原理、OS内部体系结构等内容。 1.3 代码逆向准备 进行代码逆向分析前,需要准备好目标(Goal)、激情(Passion)、谷歌(Google)。 1.3.1 目标 首先要回答自己为什么学习代码逆向分析技术。这并不需要多么华丽、宏大的理由,不管何种原因,只要理由充分就可以了。最重要的是,你的理由一定要明确。在学习这条艰辛的道路上,明确的目标会不断鼓励你前行,为你指引方向。确定目标后,把它写在书的封面上,字体要大一些、醒目一些,这样每次拿出书准备学习的时候,就会把目标深深地印在心中。同时在书的封底写上“我的目标达成了吗?”读完全书的时候看到这句话,我们就会自觉检查目标完成率。显然,带有明确目的比盲目学习效果要好很多。 1.3.2 激情 在达成目标的道路上推动我们不断前行的力量(能量)就是激情。学习代码逆向分析技术的过程中,有时候会遇到挫折,让人感到厌倦,这可能会让我们暂停学习。不过,只要保持对逆向分析技术的激情,我们就不会放弃,而会再次挑战。通过一次又一次的尝试,我们最终会成为代码逆向分析专家。 1.3.3 谷歌 毫无疑问,谷歌是这个世界上最棒的搜索引擎。谷歌搜索引擎如图1-6所示。 图1-6 谷歌搜索引擎 使用搜索引擎前,请先相信这样一句话:“我想找的任何东西都能在谷歌上找到!”事实上,某个人已经在几年前学习过我们要学习的内容了,并且这几年间又有很多人搜索过。所以,只是暂时查不到,而不是不存在。 1.4 学习逆向分析技术的禁忌 下面了解一下代码逆向分析学习过程中的几点禁忌。 1.4.1 贪心 与其他IT技术相比,代码逆向技术对我们来说还是个比较陌生的领域。开始会遇到大量陌生的概念,这些都不可能一下子掌握。要习得一种知识,往往需要大量的基础知识做铺垫,而学习这些基础知识又需要大量的背景知识。如果是初学者就想掌握所有内容,那么会在学习时陷入痛苦的泥潭。刚开始要循序渐进,“嗯,先学这些概念吧,其他慢慢学。”这才是学习逆向技术的正确态度。 1.4.2 急躁 逆向分析技术涵盖的内容很多,学习过程中有时会出现这样的想法:“我学习逆向分析技术都几天了,怎么到现在连这种问题都解决不了!”有些问题还解决不了是正常的。用吃的打个比方,逆向分析技术不是快餐(Fast food),而是有益于健康的慢餐(Slow food)。做起来要花费相当长的时间,需要足够的耐心。只要熬过了这段等待的时间,谁都可以成为优秀的逆向分析专家。 1.5 逆向分析技术的乐趣 代码逆向分析过程中,由高级语言(如:C++、VB、Delphi等)编写的程序会先被转换为低级语言(Assembly)的形式,然后再加以分析研究。这样,即使程序的开发者未公开程序源码,只提供了程序的可执行文件,有实力的逆向分析人员也能掌握程序的内部组成结构。换言之,对极少数人来说,程序的源码是一览无余的,这也正是学习逆向分析技术的乐趣所在吧! 不懂的东西总是看上去很难,而了解其运行原理与内部结构后,又发现原来如此简单,世间万物皆通此理。当然,“了解”这个词包含了许多内容,所以只是刚开始比较辛苦而已。后面章节会结合示例讲解,希望大家亲自尝试,体验逆向分析技术的魅力(本书用到的示例文件与源代码可在http://www.reversecore.com或 http://blog.insightbook.co.kr下载)。

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《逆向工程核心原理》其他试读目录

• 前  言
• 推 荐 语
• 第1章 关于逆向工程 [当前]