关于逆向工程的一些心得

【什么是软件的逆向工程】

很几个朋友留言说这个是逆向工程么,在我看来什么是逆向工程本身是仁者见仁,智者见智的。我参考了一下wikipedia【4】,摘录如下:

 

Reverse engineering of software

 

The term reverse engineering as applied to software means different things to different people, prompting Chikofsky and Cross to write a paper researching the various uses and defining a taxonomy. From their paper, they state, "Reverse engineering is the process of analyzing a subject system to create representations of the system at a higher level of abstraction."[4] It can also be seen as "going backwards through the development cycle".[5] In this model, the output of the implementation phase (in source code form) is reverse-engineered back to the analysis phase, in an inversion of the traditional waterfall model. Reverse engineering is a process of examination only: the software system under consideration is not modified (which would make it reengineering). Software anti-tamper technology is used to deter both reverse engineering and reengineering of proprietary software and software-powered systems. In practice, two main types of reverse engineering emerge. In the first case, source code is already available for the software, but higher-level aspects of the program, perhaps poorly documented or documented but no longer valid, are discovered. In the second case, there is no source code available for the software, and any efforts towards discovering one possible source code for the software are regarded as reverse engineering. This second usage of the term is the one most people are familiar with. Reverse engineering of software can make use of the clean room design technique to avoid copyright infringement.

On a related note, black box testing in software engineering has a lot in common with reverse engineering. The tester usually has the API, but their goals are to find bugs and undocumented features by bashing the product from outside.

Other purposes of reverse engineering include security auditing, removal of copy protection ("cracking"), circumvention of access restrictions often present in consumer electronics, customization of embedded systems (such as engine management systems), in-house repairs or retrofits, enabling of additional features on low-cost "crippled" hardware (such as some graphics card chipsets), or even mere satisfaction of curiosity.


因为使用的是java,对其它语言只能供参考了,但是基本方法应该是类似的。

美国这里有着很好的开源代码环境,最著名的是老牌的sourceforge,但是现在Google也提供了类似的服;还有很多大学都将自己研究的代码公布出来。很多时候利用或者学习别人的东西在进行开发,“站在巨人的肩膀上,逆向工程便是通向巨人肩膀的一条捷径。”【1】

首先是下载源代码,一般都是直接下载zip的压缩包,也用使用SVN直接下载最新的开发包的。取决于你的要求了,是否要更上最新的开发进度。网站一般都会提供用户手册开发手册 ,这些文档尤其的重要,应当认真的阅读。有些时候网站还会提供一些FAQ,Wiki以及一些example或者Demo。

在阅读代码前,一定要认真的阅读FAQ和get start,可以避免很多不必要的错误!

阅读源代码需要一些基本知识,比如设计模式,XML,UML,JUnit等。现在的代码大部分都是社区模式,都应用了很多软件工程的模式。接下来导入代码到开发工具,我使用Eclipse为主,也会用NetBeans。很多时候导入都是很顺利的,如果源代码需要调用其它的类库,就需要设置jar路径,甚至自己去下载那些类库;如果涉及J2EE的,还要配置运行环境,这是题外话了。

我基本上将源代码分为两种,带图形界面(GUI)的或者不带的。带GUI有一些特殊之处,后面单独再说。

一般首先是看package,分析类之间的关系,这个时候UML很有用了。可以参考我之前的一篇文章【2】。接下来就是分析类里面的具体函数了,这个时候很需要分析以下函数调用关系,也叫做call hierarchy,这个一般是树形结构;如果采用图来表示,也叫做call graph。这里就具体说一些Eclipse里面如何进行函数调用关系的分析。

这里有几个快捷键可以记住【3】:

1. Ctrl+左键
这个是大多数人经常用到的,用来查看变量、方法、类的定义
2. Ctrl+O
查看一个类的纲要,列出其方法和成员变量。提示 :再多按一次Ctrl+O ,可以列出该类继承的方法和变量。
助记 :"O"--->"Outline"--->"纲要"
3. Ctrl+T
查看一个类的继承关系树,是自顶向下的,再多按一次Ctrl+T, 会换成自底向上的显示结构。
提示 :选中一个方法名,按Ctrl+T,可以查看到有这个同名方法的父类、子类、接口。
助记 :"T"------->"Tree"----->"层次树"
4.Alt+左右方向键
我们经常会遇到看代码时Ctrl+左键,层层跟踪,然后迷失在代码中的情况,这时只需要按“Alt+左方向键”就可以退回到上次阅读的位置,同理,按“Alt+右方向键”会前进到刚才退回的阅读位置,就像浏览器的前进和后退按钮一样。
5.Ctrl+Alt+H
如果你想知道一个类的方法到底被那些其他的类调用,那么请选中这个方法名,然后按“Ctrl+Alt+H”,Eclipse就会显示出这个方法被哪些方法调用,最终产生一个调用关系树。

5.Alt+Shift+Q, T

这是用来显示,你可以将上面call hierarchy里面的任何一个函数或者拖到这个面板,它会分析类的调用关系,生成一个class hierarchy。

有了宏观的UML再加上微观的函数调用关系,一般就能比较好的理解源代码了。

还有一些其他软件(大部分我也没有用过),列在这里,或许有用:gprof, Ariadne,Slickedit,codeviz,DTrace。

 

参考:

【1】http://hi.baidu.com/ghd_214/blog/item/87a72dadb6df2f034b36d6ea.html

【2】http://blog.csdn.net/autofei/archive/2009/11/04/4765289.aspx

【3】http://doggou.javaeye.com/blog/211741

【4】http://en.wikipedia.org/wiki/Reverse_engineering#Reverse_engineering_of_software

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
逆向工程实验报告全文共9页,当前为第1页。逆向工程实验报告全文共9页,当前为第1页。 逆向工程实验报告全文共9页,当前为第1页。 逆向工程实验报告全文共9页,当前为第1页。 课程题目:利用OllyDbg逆向工具学习高级语言的输入输出与底层的对应关系 逆向工程实验报告全文共9页,当前为第2页。逆向工程实验报告全文共9页,当前为第2页。实验背景 逆向工程实验报告全文共9页,当前为第2页。 逆向工程实验报告全文共9页,当前为第2页。 软件逆向工程是在1990年发展起来的,现在已经有一些会议和计算机用户组的专题会议主题。软件逆向工程是分析目标系统,认定系统的组件及其交互关系,并且通过高层抽象或其他的形式来展现目标系统的过程。逆向工程 是了解软件"所作所为"的一套最重要的技术和工具。正式地讲,逆向工程是"通过分析目标系统以识别系统的组件以及这些组件之间的相互关系并创建该系统另一种形式的表或更高级的抽象过程"。从工程实际的角度来看,大体上可以将软件逆向工程分为两大类:(1)从已知软件系统的完整代码出发,生成对应系统的 结构以及相关设计原理和算法思想的文档。(2)从没有源代码的程序出发,生成对应的源程序、系统结构以及相关设计原理和算法思想的文档等。逆向工程在软件分析中的作用主要分为以下六个部分:(1)查找恶意代码,许多病毒和恶意代码 的 探测技术使用逆向工程来理解那些令人憎恶的代码是怎样构成和运作的。通过逆向找出可用作特征码 的可识别模式用于驱动商业探测器和代码扫描器。(2)发现意想不到的缺陷和错误,即使是设计最完美的系统也可能存在漏洞,这是由于我们使用的"前向工程"开发技术所固有的特点导致的。逆向工程可以帮助我们在发生致命的软件失效前识别缺陷和错误。(3)查找是否使用了其他人所写的代码,搞清楚在应用程序的哪里使用了受保护的代码和技术,这对于保护知识产权不被滥用是很重要的。逆向工程技术可用于检测应用程序是否包含所关心的软件单元。(4)寻找对共享软件和开放源码的使用(在不该使用的地方),与侵犯代码版权相反的是,如果一个产品以 安全 和 专用 为目的,是否有可公开获取的代码可能是大家关心的问题。逆向工程能够用于检测代码复制问题。(5)从其他(不同领域或用途)产品中学习,逆向工程技术使我们能够学习先进的软件方法,还允许新学员研究大师的作品。这对于学习和积累不断发展的代码知识来说是非常有用的。许多网站是通过参考其他网站的做法来建立的。许多网页开发人员是通过阅读其他网站的源代码学习HTML和网页编程技术的。(6)发现原开发人员以前没有意思到的特性或机遇,(6)发现原开发人员以前没有意思到的特性或机遇 逆向工程实验报告全文共9页,当前为第3页。逆向工程实验报告全文共9页,当前为第3页。 逆向工程实验报告全文共9页,当前为第3页。 逆向工程实验报告全文共9页,当前为第3页。 实验环境介绍 Windows平台、OLLYDBG逆向软件、测试程序、c-free5.0。 实验工具介绍 在现代操作系统中,可以将调试器粗略地分为两种不同的风格:用户模式调试器 和 内核模式调试器。用户模式调试器是一种普通的应用程序,它将自己加在另一个进程(即被调试程序)之上,并可以完全控制该进程。本实验使用的用户模式调试器是OLLYDBG,对于逆向工作人员而言,由Oleh Yuschuk编写的OLLYDBG可能是最佳的用户模式调试器(尽管选择的余地非常小)。OLLYDBG的诱人之处在于:它一开始就是作为逆向工具而设计的,因此它具有强大的内置的反汇编器。OLLYDBG的代码分析器可以识别出循环、switch控制块以及其它主要的代码结构。它能显示所有已知函数和API的参数名,支持在代码和数据之间查找交叉引用——代码到数据或数据到代码。OLLYDBG是调试器中(除了IDA Pro调试器)反汇编能力最强的一款,连内核模式都比不上。除了具有强大的反汇编能力外,OLLYDBG还提供了大量不同的视图,包括列出模块中的导入和导出、显示被调试者拥有的窗口和其它对象的列表、显示当前的异常句柄链以及对那些在库中正确命名的函数使用导入库(.lib文件)等等。OLLYDBG的典型界面如图3.1。 逆向工程实验报告全文共9页,当前为第4页。逆向工程实验报告全文共9页,当前为第4页。 逆向工程实验报告全文共9页,当前为第4页。 逆向工程实验报告全文共9页,当前为第4页。 图3.1 OLLYDBG的典型界面 相应知识点介绍 通过测试键盘中的输入,屏幕的屏幕输出学习VC/VS 中的各种常用的输入与输出函数在底层是如何实现的;然后破解"lianxi.exe"这个小程序。输入方式很多并且高级语言也有很多种。C语言 输入函数有很多,常用的输入函数有:Scanf,getchar,getch 和 getche。如语法:sca

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值