逆向工程是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。本文介绍了逆向工程的相关概念和应用,着重强调了逆向工程在软件工程中的方法和理论。

考点

软件逆向工程的恢复级别

软件逆向工程的恢复级别

逆向工程

   逆向工程(Reverse Engineering),又称反向工程,是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是,在无法轻易获得必要的生产信息下,直接从成品的分析,推导产品的设计原理。

  逆向工程可能会被误认为是对知识产权的严重侵害,但是在实际应用上,反而可能会保护知识产权所有者。例如在集成电路领域,如果怀疑某公司侵犯知识产权,可以用逆向工程技术来查找证据。

逆向工程的动机

  • 接口设计。由于互操作性,逆向工程被用来找出系统之间的协作协议。
  • 军事或商业机密。窃取敌人或竞争对手的最新研究或产品原型。
  • 改善文档。当原有的文档有不充分处,又当系统被更新而原设计人员不在时,逆向工程被用来获取所需数据,以补充说明或了解系统的最新状态。
  • 软件升级或更新。出于功能、合规、安全等需求更改,逆向工程被用来了解现有或遗留软件系统,以评估更新或移植系统所需的工作。
  • 制造没有许可/未授权的副本。
  • 学术/学习目的。
  • 去除复制保护和伪装的登录权限。
  • 文件丢失:采取逆向工程的情况往往是在某一个特殊设备的文件已经丢失了(或者根本就没有),同时又找不到工程的负责人。完整的系统时常需要基于陈旧的系统上进行再设计,这就意味着想要集成原有的功能进行项目的唯一方法便是采用逆向工程的方法分析已有的碎片进行再设计。
  • 产品分析:用于调查产品的运作方式,部件构成,估计预算,识别潜在的侵权行为。

逆向工程的应用

机械设备

  随着计算机辅助设计的流行,逆向工程变成了一种能根据现有的物理部件通过CAD、CAM、CAE或其他软件构筑3D虚拟模型的方法。[1]逆向工程的过程采用了通过测量实际物体的尺寸并将其制作成3D模型的方法,真实的对象可以通过如CMMs,激光扫描仪,结构光源转换仪或者X射线断层成像这些3D扫描技术进行尺寸测量。这些测量数据通常被认作是点云,缺乏拓扑信息并且同时通常会被制作成更有用格式例如多边形网格,NURBS曲线或者CAD模型。由于点云本身并不像3D软件里的模型那样直观,所以如同3-matic、Imageware、PolyWorks、Rapidform或者杰魔公司等这些软件都提供了将点云变成能可视图像,或者被其他应用软件如3D CAD、CAM、CAE识别的格式的功能。

  反向工程同时会被需要将真实的几何体应用在虚拟的数字开发环境中的商业活动中应用,比如将自己产品或者竞争者的三维数据数字化。通过这种手段可以分析出产品的运作方式,部件构成,估计预算和识别潜在的侵权行为等。

  价值工程也是商业中应用的类似手段。不过价值工程的目的是通过反构造和分析产品来找到节省开销的办法。

集成电路和智能卡

  分析智能卡的逆向工程具有侵入性和破坏性,智能卡被层层刮掉用电子显微镜拍照。这种技术可以完整地揭示出智能卡的硬件和软件部分。主要的问题就是,把所有的东西按正确的顺序放好以找出每一个部件是如何工作的。工程师们用打乱内存位置的方法隐藏密码和操作,例如busscrambling。有时甚至可以在智能卡运行的时候用探针直接测量电压,设计师则用感应器来检测和防止。破坏支付业务中使用的智能卡很困难,只有大芯片制造商使用那些专业的设备。况且,和其他安全机制例如阴影帐户相比,这种方法回报太低。

军事

  逆向工程经常被用在军事上,用来复制从战场上由常规部队或情报活动获得的别国之技术、设备、信息或其零件。二战和冷战中经常被用到。二战以来的著名例子有:

  • 德国桶:英美军注意到德军有一种设计绝妙的油桶,于是就用逆向工程复制了这些桶。这些被泛称为“便携油桶”。
  • 四式7.5公分高射炮:日本从中国战场掳获的波佛斯75毫米口径M1929高射炮上的逆向工程,产生四式7.5公分高射炮并搭配日本的九八式六吨牵引车使用,拖弋速度可达时速45公里,并拥有快速放列的作战的能力。
  • 图波列夫Tu-4:三架飞往日本的B-29“超级堡垒”轰炸机迫降到了苏联。苏联没有类似的战略轰炸机,就决定复制B-29。几年后他们开发出了Tu-4,几近完美的复制品。
  • V-2火箭:战争结束时V2的技术文档和相关技术被西方联盟俘获。苏联和被俘的德工程师要用俘获的构件重建技术文档和图纸,用于生产这种导弹的代件。R-1引导了战后苏联导弹画,一直到R-7,并导致了太空竞赛。

软件

  由于“逆向工程”一词用在软件工程(简称“软工”)领域中的具体含义模糊不清,Chikofsky和Cross为此写了篇文章,以阐清及区分“逆向工程”与各种相近的概念。据文章所述,逆向工程是一种分析目标系统的过程,其目的是识别出系统的各个组件以及它们之间的关系,并以其它的形式或在较高的抽象层次上,重建系统的表征(Representations)。 软件逆向工程也可被视作“开发周期的逆行”。在此定义下,对一项软件程序进行逆向工程,类似于逆行传统瀑布模型中的开发步骤,即把实现阶段的输出(即软件程序)还原回在设计阶段所做的构思。软件逆向工程仅仅是一种检测或分析的过程,它并不会更改目标系统(否则就成了软件再工程)。

  软件防篡改技术被用于遏制对专有软件进行逆向工程及再工程。实际应用中出现了两类逆向工程。第一种,软件的源代码可用,但是更高层次的部分几乎没有描述文档或者描述文档不再适用或者丢失。第二种,软件没有可用的源代码,任何能找到它的源代码的努力都被称为逆向工程。[来源请求]大部分人都熟悉这个词的第二种用法。软件的逆向工程可以使用净室技术来避免侵犯著作权。

  软工中的黑盒测试与逆向工程有很多共同点,但黑箱测试人员常供以API以作测试,并且测试的目的就是通过外部攻击,找出程序漏洞和未归档的特性。

  逆向工程的其他目的包括:安全审查、 解除复制保护(又称破解)、绕过消费类电子产品中常设有的访问限制、定制嵌入式系统(例如引擎管理系统)、产品内部修补或更新、给功能不全的廉价硬件(例如某些显卡芯片组)添加额外功能,或仅为满足好奇心

软件工程的逆向工程

  软件的逆向工程也基本类似,不过通常“解剖”的不仅是竞争对手的程序,而且还包括本公司多年前的产品,此时得不到设计“机密”的主要障碍是缺乏文档。因此,所谓软件的逆向工程就是分析已有的程序,寻求比源代码更高级的抽象表现形式。一般认为,凡是在软件生命周期内将软件某种形式的转换成更为抽象形式的活动都可称为逆向工程。与之相关的概念是:重构(restructuring),指在同一抽象级别上转换系统描述形式;设计恢复(design recovery),指借助工具从已有程序中抽象出有关数据设计、总体结构设计和过程设计的信息(不一定是原设计);重构工程(re-engineering),也称修复和改造工程,它是在逆向工程所获信息的基础上修改或重构已有的系统,产生系统的一个新版本。

恢复信息的级别

逆向工程导出的信息可分为如下4个抽象层次。

  1. 实现级:包括程序的抽象语法树、符号表等信息。
  2. 结构级:包括反映程序分量之间相互依赖关系的信息,例如调用图、结构图等。
  3. 功能级:包括反映程序段功能及程序段之间关系的信息。
  4. 领域级:包括反映程序分量或程序诸实体与应用领域概念之间对应关系的信息。
    显然,上述信息的抽象级别越高,它与代码的距离就越远,通过逆向工程恢复的难度亦越大,而自动工具支持的可能性相对变小,要求人参与判断和推理的工作增多。

恢复信息的方法

  在逆向工程中用于恢复信息的方法有4类。

  • 第一类为用户指导下的搜索与变换(User-Directed Search and Transformation)。此类方法用于导出实现级和结构级信息。它要求维护人员在数据库系统的支持下,运用询问语言,针对源代码或与之相近的表示形式,指定待查找的句型(pattern),根据搜索结果析出所需信息或进行特殊变换。
  • 第二类方法为变换式方法(Transformational Approaches),除领域级外所有抽象级别上的信息都可用此类方法推导。变换式方法又细分为不需要维护人员过多干涉的自动分析法(如静态分析和调用图、控制流图生成等)和基于特定库的用户指导变换法两类。变换方法自动化程度越高,得到的设计信息越粗略,因为任何深层次的分析不可避免地要借助人的智力。一般借助变换法得到程序的某种中间表示形式,通过进一步使用其他工具将已获粗略的设计信息精化为完整、一致的软件设计。
  • 第三类方法是基于领域知识的(Domain Knowledge-Based),主要用于恢复功能级和领域级信息。领域知识一般用规则库表示,用已确定或假定的领域概念与代码之间的对应关系推导进一步的假设,最后导出程序的功能。显然该类方法的不确定性最大,因此目前成熟的工具和原型系统还很少见。
  • 最后一类方法称为铅板恢复法,这类方法仅适用于推导实现级和结构级信息。这些方法用于识别程序设计“铅板”或公共结构,“铅板”既可为一个简单算法(如两变量互换值),亦可为相对复杂的成分(如冒泡分类)。因铅板与程序之间可能存在多种匹配形式,所以此类方法还包含大量的推理与决策。各类方法采用的输入形式、搜索策略和推理策略都不尽相同。后两类方法又称为基于知识的方法。

  尽管每个软件组织都可能有数百万行代码可供重构,但由于缺乏时机和支持工具或者因为经济上得不偿失,往往只有那些决定或移植、或重新设计、或为重用而需验证正确性的程序才被选择实施逆向工程。

参考文献

  • 杨春晖.《系统架构设计师教程》. 清华大学出版社, 2012.
  • Reverse engineering

相关文章

Q.E.D.