排行榜 统计
  • 文章总数:179 篇
  • 评论总数:1 条
  • 分类总数:7 个
  • 最后更新:5天前

逆向工程介绍

本文阅读 9 分钟
首页 软件安全 正文

“可执行程序 → 反编译器或人工反编译 → 源代码”的过程就是逆向工程。

作者:周文雄

文章的开始,先有必要辨别一个单词“crack”。对于(网络)黑客来说,“hack”是褒义词,“crack”则是贬义词,后者指那些寻找网络漏洞并进行恶意攻击的行为。但对(软件)黑客来说,“crack”只是个中性词,泛指对程序修改的行为。有时候他们更喜欢称自己为“逆向工程”学者――一个褒义词,而不是“破解者cracker”;当然,在软件作者眼里,“破解”肯定属于贬义。

逆向工程(Reverse Engineering)定义为:"the process of analyzing a subject system to identify the system's components and their interrelationships and create representations of the system in another form or at a higher level of abstraction." (Source: Chikofsky and Cross)
 
如果认为:
“源代码 → 编译器 → 可执行程序”的过程是“顺向工程”的话;
“可执行程序 → 反编译器或人工反编译 → 源代码”的过程就是逆向工程。

逆向工程的起源自然是在编译器技术的发展以后。据说在最早期,程序员之间互相交流、传阅源代码是极其普通的事情。后来,随着商业利益的驱使,源代码交流开始减少,源代码作为公司或个人的产权,被加以严密保护。于是崇尚自由的Hacker精神,导致部分的程序员转去研究如何“将编译后的二进制代码反编译为源代码”。这个活动一直延续了下来。期间,“自由精神”的驱使,也使部分人产生了“人人都能自由使用每个软件”的想法,逐渐的,“软件破解”浮上了水面。更随着盗版商的加入,“软件破解”也被商业软件公司描述的越来越邪恶。

将逆向工程包括的内容可以分为3类:

1.软件使用限制的去除,或软件功能的添加
(1) 按照计算机类别,可以分为个人微型计算机、小型机、中型机、大型机等;
(2) 按照操作平台或处理器类型,可以分为windows、MAC、UNIX,x86,risc等
(3) 按照限制类型,可以分为软件使用时间限制,软件功能模块限制、软件运行条件限制(软件狗等)、软件注册限制等
(4) 可以是软件功能限制的去除,也可以是软件功能的添加。

2.软件源代码的再获得或二进制代码水平的Debug
(1) 按照计算机类别,可以分为个人微型计算机、小型机、中型机、大型机等;
(2) 按照操作平台,可以分为windows、MAC、UNIX等
(3) 按照软件层次,可以分为普通应用层软件与操作系统源等。

3.硬件的复制、模拟
由此观之,一般所谓的“软件破解”只是逆向工程中非常初级的一小部分。
坦白地讲,现在的逆向工程,真实目的就是为了再利用。据此,个人可以学习别人的编程技术及技巧,公司可以窥探别人的商业软件秘密,或开发与之兼容的软件;(二进制代码层面的)Debug自然也是其中重要的目的之一。
据说,著名的杀毒软件AVP代码写的实在太有条理,因此很容易被分析后“再利用”。有心人不仅可以将其病毒特征库改头换面后再推出,也可以利用逆向工程得到AVP某些模块的源代码,加入自己开发的产品中。
在《看雪论坛精华5》(www.pediy.com)中,收录了一篇文章,讲述如何利用逆向工程知识为一个多媒体播放软件去除“静音”bug的过程。
《Windows图形编程》(Feng Yuan著,机械工业出版社)一书中,作者花费了2个章节,约100多页的文字来介绍如何探索windows系统的GDI/DirectDraw内部数据结构,以及如何自制一个apispy来帮助研究。利用类似的方法,你可以自行探索操作系统的奥秘,而不需要别人的讲解。不过,由此产生的副作用是系统上的很多bug被发现和利用,最有名的就是“堆栈溢出攻击”。

利用逆向工程技术还可以使我们对一些软件进行改造。《程序员杂志》2003.07有文章《编程扩展“记事本”功能》,介绍的就是一例。作者是采用CreateRemoteThread函数远程钩入目标程序进程内,达到其目的。而另一些人可能更喜欢直接修改目标程序的一些二进制代码,从而利用附加的Dll(动态运行库)。后面一种方法叫做SMC(Self Modifying Code)。我看到有人这样为Netscape添加按钮执行“密码保护”功能;有人为filemon添加了“打开最近文档”功能……但最著名的,还是改造W32Dasm――一个著名的反汇编工具活动。通过协作,目前的W32Dasm已经能支持中文字符串,能识别VB程序的引入表,能直接对反汇编程序patch,能添加注释等等,而这一切都是在没有源代码情况下,直接在二进制代码层面完成。

笔者无意卷入“逆向工程”是否合法的无聊讨论中去。只是每次想到这个问题就不由想起庄子的一句话――“窃钩者诛,窃国者侯”。
著名的反编译器提供商datarescue出品的IDA Pro,提供对30多个家族、几十种处理器的支持,它支持windows平台上几乎所有的编译器。Datarescue的客户绝大部分是公司。看情况,datarescue活的蛮好,显然她的客户不会少。那么,那么多公司买IDA Pro作什么?

成为一个“逆向工程”大师,应该具有如下特征:
1.永远保存好奇心,崇尚自由。这能促使探索;也能抵抗商业利欲的侵袭;有了它,枯燥的代码世界才有了生气。
2.勤奋与毅力:“让我们搞清楚作为一名Cracker最需要具备的基本条件,其实那并不是扎实的汇编功底和编程基础。你可以完全不懂这些,CRACKING的秘诀就是勤奋+执着!记住并能做到这两点,你一样可以变得优秀。”
3.精通至少一门编程语言,不仅仅是Coding,更重要的是编程思想。RAD工具也许是容易学的,但你要明白隐藏在它背后的机制。
4.扎实的汇编功底和系统编程的知识。
5.能发现“美丽”。是的,你能在枯燥的二进制代码中见到美,那是数学和对称的美丽。卓越的编译器优化能力,简洁而又高效的代码,都能使你领略到她的存在。

逆向工程的终极网站woodmann上列出那些大师的名字:Matt Pietrek,Jeffrey Richter,John Robbins ……他们的专著是每个程序员都应该阅读的:《Windows95系统程式设计打奥秘》、《Windows核心编程》、《应用程序调试技术》……

总之,逆向工程应是一门优雅的艺术,而不是低层次者手中粗陋的工具;逆向工程的目的是学习与再利用;它的精神是“自由”。

ss (1).png

转自:https://www.kanxue.com/book-4-5.htm

本文来自投稿,不代表本站立场,如若转载,请注明出处:https://www.firsource.cn/soft/33.html
动态分析介绍
« 上一篇 11-17
如何撰写原创文章
下一篇 » 11-17