首页 安全

摘要:逆向工程分为两部分,第一部分是理解系统的组成部分,以及它的内部构件之间的关系;第二部分是用以另一种形式或者更高层次的抽象来表示系统。

该文章是对于New Frontiers of Reverse Engineering这篇论文的感想

初入逆向工程,仿佛就像是从遥远的边界靠近一栋散发着神秘气息的大楼,在曾经的那个熟悉边界里,是代码的世界,一行一行的代码描绘着程序的轮廓,由外至里,仿佛构建了一个鲜活的生命。“逆向工程”正如其字面上的意思,是软件开发的逆过程,以获取源码为目的,那散发着神秘气息的大楼,只是瞥了一眼就让我心怀向往。因为这是一个妙趣横生又横贯着未知与挑战的障碍的道路,不再是曾经那样,代码毫无保留地躺在你的面前待你解剖,而是你要像一位历史学家、分析者、侦探那样,去揭开隐藏在软件背后的执行过程。

1990年Chikofsky和Cross提出了逆向工程的概念:

(i) identify the system’s components and their inter-relationships and
(ii) create representations of the system in another form or at a higher level of abstraction.

也就是说逆向工程分为两部分,第一部分是理解系统的组成部分,以及它的内部构件之间的关系;第二部分是用以另一种形式或者更高层次的抽象来表示系统。

这是Kazman等人提出的关于软件再工程(即从一个架构转换成另一个)的一个“马蹄形”模型:

请输入图片描述

这里面涉及逆向工程的思想,把一个程序的架构划分为四个层次:代码文本层、代码结构层、功能级别层、总体架构层,首先是马蹄的左半边,从底层源码中提取出软件的架构,然后是马蹄的顶部,设计从原架构到目的架构的过渡模式,最后是马蹄的右半部分,将目的架构用源码的方式实现。

对于逆向工程的应用,论文从三个方面给予分析:

一、程序应用分析

程序发展到现在,有朝着高动态性的方向发展的趋势。举个例子,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”,以这种定义的话,Java应该归为静态语言,但是不断发展的Java也加入了动态的机制——反射机制,允许在程序运行的时候,再加载一个刚刚得知名字的类,并获悉其完整的构造。动态解析使得程序的使用更为灵活、多样化,但却增加了分析的难度。再者,跨语言的应用越来越多,而不同的语言的语法结构相异,这也大大增加了分析的难度。

所以从最开始的单一的静态分析,到结合动态分析,如今又拓展了第三个维度的分析——历史分析,三者结合才能比较好的取长补短,弥补各自的缺陷,提高程序分析的准确性,降低误报率。

二、架构及设计恢复

程序的架构正朝着高动态性、高分布性、自配置性、异构性的方向发展,传统重建高层次架构和图表的方法面临着巨大的挑战。面向对象的语言广泛运用,促生了统一建模语言(Unified Modeling Language)的出现的拓展,类的概念是面向对象语言的一个核心概念,围绕类我们可以构建出类的图表,辅以静态分析还原出的控制流图、顺序图、数据流图,以及动态分析构建的流传播信息,我们可以比较好地重新还原系统的架构。

但在新的背景下,我们还需增加人工的反馈,以人类的经验矫正部分还原不准确的地方,而人工智能、机器学习技术的出现,如曙光般指明了架构与设计灰度的新方向。

三、可视化

请输入图片描述

可视化是个蛮有意思的玩意儿,将程序抽象的架构,以形状、色彩,甚至3D这些形象的模式表现出来,例如矩形块的不同颜色表示不同的类,矩形的宽是固定的,长度代表该类下方法的数量,不同层次表示类的继承关系。所以不同的程序碎片,就可以构成一个类似树状的结构,对于大型的程序而言,这种直观的图表形式非常利于程序结构的分析。

用一句话总结便是:a visualization constitutes the essence of areverse engineering technique, for its ability to highlight relevant information at the right level of detail.

更多的时候,我们怀着一种造物主的姿态,都认为自己的代码是最好的,将源码妥善保管,而众所周知,程序一般都是以编译、汇编发布的,或者采用解析的形式,在执行的时候动态释放,不论如何,源码一般都是不会外泄的。这无可厚非,毕竟代码也是知识产权的一部分,凝结了编写者的智慧和汗水。可潮流不可抵挡兮,如今已进入移动物联网时代,电子产品飞速更迭,越来越多的新设备、新算法、新设计、新语言如雨后春笋般冒了出来,程序代码不能再故步自封,相互理解和交融必会成为主流,我们必须做出选择,在源码的保密和开放中寻求平衡。

随着软件开发的水平不断提高,提出了许多新的情景和要求,如论文中所述:

一、软件开发与逆向工程同步;
二、对于面向服务的系统架构和自主计算采用逆向工程

第二个讲的就是未来程序将不是由单一的公司、组织或者个人开发的项目,所有的程序都使用统一的模板,服务则由不同的服务提供商提供,这就是面向服务的系统架构。任何公司、组织或者个人都可以是服务商,他们提供服务相当于出售“商品”,只提供接口,而隐藏实现的技术细节,这非常不利于架构后期的维护和进一步的探讨交融,所以若能针对此开发相应的逆向工程技术,将会百利而无一害。

而目前常用的IDE,我们也可以常常会被它们的智能化感动的,贴心的自动补全、凌厉的拼写检查、详尽的差错提示、方便的自动修改,和关键的缺陷建议,都使得我们的程序开发的效率大为提高,且极大的降低了出错率,但这背后实际上深深依赖于“逆向工程”这一项技术,这也就软件开发与逆向工程同步的含义。

最后,用论文中的一张图来总结一下逆向工程在软件开发、维护中所扮演的角色:

请输入图片描述




文章评论

captcha