软件逆向工程分析技术的实践与探索
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
178
研究与探索Research and Exploration ·探讨与创新
中国设备工程 2018.03 (上)
软件逆向工程是软件开发技术与方法的一大子课题,这一课题所强调的是通过密切结合可运行的程序,来归纳出集成化、系统化的开发模型及软件支撑媒介的内部集成模式,从而在更高层次上来有效解决软件面向的实际应用问题。
1 逆向工程及软件逆向工程的内涵分析
1.1 逆向工程的内涵分析
逆向工程涉及以下两大操作步骤。第一步是对目标系统、标识系统的对象以及标识系统对象之间的关系进行分析。第二步是创建不同形式或者是抽象层次更高的系统。
国外学者Scott R.Tilley 又对抽取和抽象进一步提炼,将其扩展成了建模、抽取与抽象这三大步骤。第一步建模具体指的是采用建模技术构成相关应用程序的领域模型。第二步抽取具体指的是借助于恰当的抽取机制,然后基于目标系统来对原始数据进行收集。第三步抽象指的是将具体的目标系统抽象化,同时辅助以系统的理解,并允许进行信息浏览、信息分析和得出抽象的结果并加以表示。
1.2 软件逆向工程的内涵分析
软件逆向工程所遵循的基本原理具体如下:其将软件系统中的关键内容抽取并提炼出来,同时对软件系统中的细节加以隐藏,然后借助于所抽取出来的实体,将其关键内容在更高层级系统上描述出来。通常意义上,人们将软件工程当作一种开发的新系统存在。事实上,软件工程还可分为很多更细的项目,即软件正向工程、软件逆向工程、软件系统重构、再工程以及软件的设计恢复等。其中软件正向工程指的是一种传统意义上的过程,即基于软件系统的高层抽象与逻辑层面独立出来的,从实现设计到系统的物理设计过程。具体而言,就是基于用户的实际需求到高层设计然后再回归到底层设计,
最终实现的过程。软件逆向工程是通过对系统的分析来确定系统组件以及系统组件间的相互作用,然后借助于其他形式来表示这一系统,或者是在更高层次上来对系统过程进行阐释和说明。需要额外注意的是,针对某一系统进行逆向工程时,系统本身不发生任何变化,也不会在这一系统上建立新的系统。软件系统重构就是在保持系统的功能和语义不变的前提下,在统一的抽象层次上改变表现形式。再工程是一种在对软件逆向工程、软件系统重构以及软件正向系统进行审查改造后重组的新形式。软件的设计恢复具体指的是密切结合领域知识、目标系统以及外部信息而认定的更高一层次的抽象。上述几大概念间的关系如图1
所示。
图1
结合对逆向工程及软件逆向工程的内涵的分析,就得出了软件逆向工程的具体任务。主要涉及以下方面。其一,达成分析系统的任务。这项任务具体是指对系统结构以及系统的运行过程进行分析,但是,无论目标系统所面向的是哪一种应用领域,其分析系统大体上都是一致的,基本上都可分为系统的动态信息及系统的静态信息。目标系统所面向的通常都是不同的应用领域,要想更好地达成抽象目标系统的具体任务,通常需要具备相关领域的知识和丰富的专家经验。其二是达成抽象系统的任务。其三是达成展现系统的任务。展现系统的最
软件逆向工程分析技术的实践与探索
高菁
(天津机电职业技术学院,天津 300350)
摘要:在信息技术飞速发展的背景下,软件系统的复杂度和规模也得到了提升。在软件开发工作中,软件维护工作的重要性日益凸显。软件逆向工程技术是进行软件维护的一大关键技术。本文就主要围绕软件逆向工程分析技术的实践与探索进行研究,先阐述逆向工程及软件逆向工程的具体内涵,然后探讨常用的软件逆向工程分析方法,最后结合案例对这项技术的实践应用进行研究。
关键词:逆向工程;软件逆向工程分析;技术方法;实践
中图分类号:TP311 文献标识码:A 文章编号:1671-0711(2018)03(上)-0178-03
179中国设备
工程
Engineer ing hina C P l ant
中国设备工程 2018.03 (上)佳实现方式是使展现系统可视化。通过实现这几项任务来实现帮助用户更好地理解系统这一目的。
2 常用的软件逆向工程分析方法
(1)程序切片法。程序切片技术具体指的是将程序进一步简化为同某一特殊计算具有相关性的语句技术。这一软件逆向工程分析方法源于数据流分析法。程序切片技术法在实际使用的过程中通常将程序进行进一步分解,将其分解成更小的切片代码段,进而使其关注点缩放到一个更小范围内,而不需要关注整个程序。某一程序切片是由程序中的判定表达式和部分语句组成的集合。这些判定表达式和语句甚至会给程序中的某一位置,如常用的行号标识上所界定或使用的变量值产生相应的影响。程序切片技术能够帮助我们更深入地理解程序。
(2)词法分析和语法分析。这一软件逆向工程分析法主要是针对程序源代码进行分析,进而得到程序信息的多种类型的有用表示。其中,使用频率最高的是交叉引用列表。借助于对语法的分析能够得到分析树和抽象语法树AST 这两大类型的表示方法。其中,抽象语法树AST 涉及很多同程序实际内容相关的细节,其能够为理解更加复杂的程序奠定基础。
(3)动态分析法。动态分析法大多是在程序实际运行的过程中进行的,这一方法最基本的操作是植入程序。具体来说,植入程序其实是在某一全局范围之内对源代码进行更改或者添加一些额外操作的具体过程。动态分析法所采取的基本原理是依托代码的结构信息,同时按照固定的规则给原有的程序代码添加软件触发器。
3 软件逆向工程分析技术案例分析
在实际运用软件工程分析技术的过程中,程序理解是最重要且最消耗资源的活动,要想更好地理解程序,必须从程序设计这一方面着手进行。在实际操作过程中,要想更好地对某一软件进行维护并不容易,经常会遇到缺失代码的情况。下面假设缺乏某一软件的源代码,然后探讨如何借助软件逆向工程分析技术进行软件维护。
第一步:结合对这一软件的作用、性能以及性质设计这些因素,来设计出相应的验证假设内容列表,然后结合相关内容一边进行验证,一边更好地理解这一软件,在理解软件代码期间一步步假设内容列表进行修正,进而深化对这一软件系统程序的认知和理解。第二步:对软件执行过程中的二进制码进行分析可得知,这一二进制码是由多个函数组成的,具体分析步骤如下。首先,借助于IDA 反汇编工具来分析出函数集合,具体如下所示。
{(f1、f2、f3、f3、......fn)}
然后绘制函数调用图,图中的一个节点代表的是
一个fj,节点间的连接线所代表的是函数的调用关系,fp 是被调用函数,fq 是调用函数,fp 是fq 的子函数,这一函数调用图能够较好地对整个软件执行过程中的函数关系进行描述。其中一个节点代表的是一个函数,并且每一节点都可以用函数控制图表示出来。
第三步:进一步细化函数,将其细化为基本块来分析。同时还可借助于控制流图来对二进制文件中的函数进行描述。每一函数又可被分解成若干个不同的基本块。基本块具体指的是程序遵照相应的顺序执行的语句序列,其中,仅有一个入口和一个出口。第一个语句是
入口,最后一个语句是出口。对一个基本块本身来说,在具体执行时仅能从入口进入,从出口退出。基本块具备的显著特点具体如下:一旦基本块中的第一条指令被执行之后,相应地,后续基本块中的所有执行都会按照顺序执行,且仅执行一次。控制流的结点也是由基本块组成的,主要是用来表示运算、节点和节点间的有向边代表控制流向。一个函数的控制流入口仅有一个,但是却可以有很多出口。图2是函数的控制流图。
图2 函数的控制流图
通过分析该图可知,这一函数包含五个基本块,六条有向边。如果想生成控制流图和函数调用关系图就应进行如下操作。第一步应对二进制代码的反汇编进行深入分析,借助于IDE Pro SDK 开发包有利于更好地对反汇编进行分析,依托所得出的分析结果得到信息建立的控制流图和函数调用关系图。接着,以这两大流程图为基础进行相应的断点跟踪,之所以要设置断点主要是为了在执行程序时对程序有更深入地理解。在设置断点之后,程序到达了断点将暂停程序。然后可将寄存器内的数据和执行路径记录下来,以方便更好地对断点处的上下文环境和具体执行情况进行分析,借助于设计不同的断点能够使分析人员更好地明确程序的执行方式,