跳转到内容

软件工程/重构/逆向工程简介

来自维基教科书,开放世界中的开放书籍

逆向工程是通过分析人类制造的设备、物体或系统的结构、功能和操作,来发现其技术原理的过程。它通常涉及将某物(例如机械装置、电子元件或软件程序)拆开并详细分析其工作原理,以便用于维护,或尝试制造一个新的设备或程序来执行相同的操作,而无需使用或简单地复制(无需理解)原始设备的任何部分。

逆向工程起源于对硬件的分析,以获取商业或军事优势。[1] 目的是从最终产品中推断设计决策,而对原始生产过程中涉及的程序几乎没有或根本没有额外了解。这些相同的技术随后正在被研究以应用于遗留软件系统,不是为了工业或国防目的,而是为了替换不正确、不完整或其他不可用的文档。[2]

逆向工程的原因

  • 互操作性。
  • 丢失的文档:逆向工程通常是由于某个特定设备的文档丢失(或从未编写),并且制造该设备的人员不再可用。集成电路似乎经常是在过时的专有系统上设计的,这意味着将功能整合到新技术中的唯一方法是反向工程现有芯片,然后重新设计它。
  • 产品分析。检查产品的工作原理、组成部件、估计成本以及识别潜在的专利侵权行为。
  • 数字更新/校正。更新物体的数字版本(例如 CAD 模型)以匹配“竣工”状态。
  • 安全审计。
  • 通过拆卸和分析系统组件的设计来获取敏感数据。[3]
  • 军事或商业间谍活动。通过窃取或俘获原型并将其拆卸,了解敌方或竞争对手的最新研究成果。
  • 删除复制保护、规避访问限制。
  • 创建未经许可/未经授权的副本。
  • 材料收集、分类或报废。[4]
  • 学术/学习目的。
  • 好奇心。
  • 竞争技术情报(了解您的竞争对手实际在做什么,而不是他们说他们正在做什么)。
  • 学习:从他人的错误中学习。不要犯其他人已经犯过并随后纠正的错误。

机器的逆向工程

[编辑 | 编辑源代码]

随着计算机辅助设计 (CAD) 的日益普及,逆向工程已成为一种可行的方法,可以创建现有物理零件的 3D 虚拟模型,用于 3D CAD、CAM、CAE 或其他软件。[5] 逆向工程过程包括测量物体,然后将其重建为 3D 模型。可以使用 CMM、激光扫描仪、结构光数字化仪或工业 CT 扫描(计算机断层扫描)等 3D 扫描技术测量物理物体。单独测量的点云通常缺乏拓扑信息,因此通常需要将其处理和建模为更易于使用的格式,例如三角面网格、一组 NURBS 曲面或 CAD 模型。

企业也使用逆向工程将现有的物理几何形状引入数字产品开发环境,以创建他们自己产品的数字 3D 记录,或评估竞争对手的产品。它用于分析,例如,产品的工作原理、功能、组成部件、估计成本以及识别潜在的专利侵权行为等。

价值工程是企业也使用的相关活动。它涉及对产品的拆卸和分析,但目标是寻找成本削减的机会。

软件的逆向工程

[编辑 | 编辑源代码]

应用于软件的术语逆向工程对不同的人意味着不同的东西,促使 Chikofsky 和 Cross 撰写了一篇论文来研究各种用途并定义分类法。从他们的论文中,他们指出,“逆向工程是分析目标系统以创建更高级抽象级别系统表示的过程”。[6] 它也可以被视为“沿着开发周期向后走”。[7] 在此模型中,实现阶段的输出(以源代码形式)被反向工程回分析阶段,反转了传统的瀑布模型。逆向工程仅是一个检查过程:所考虑的软件系统不会被修改(这将使其成为重新设计)。软件防篡改技术用于阻止对专有软件和软件驱动系统的逆向工程和重新设计。实际上,出现了两种主要的逆向工程类型。在第一种情况下,软件的源代码已经可用,但程序的更高级别方面,可能是文档不足的,或者有文档但不再有效,将被发现。在第二种情况下,软件没有可用的源代码,任何努力去发现该软件的一种可能的源代码都被视为逆向工程。这种对术语的第二种用法是大多数人熟悉的。软件的逆向工程可以使用洁净室设计技术来避免侵犯版权。

相关的是,软件工程中的黑盒测试与逆向工程有很多共同点。测试人员通常拥有 API,但他们的目标是通过从外部猛击产品来发现错误和未记录的功能。

逆向工程的其他目的包括安全审计、删除复制保护(“破解”)、规避消费电子产品中经常出现的访问限制、嵌入式系统的定制(例如发动机管理系统)、内部维修或改装、启用低成本“残缺”硬件上的附加功能(例如一些显卡芯片组),甚至仅仅满足好奇心。

认证逆向工程分析师 (CREA) 是 IACRB 提供的认证,它证明候选人精通软件逆向工程。

二进制软件

[编辑 | 编辑源代码]

此过程有时被称为逆向代码工程或 RCE。[8] 例如,可以使用 Jad 完成对 Java 平台二进制文件的反编译。逆向工程的一个著名案例是 PC BIOS 的第一个非 IBM 实现,它启动了历史性的 IBM PC 兼容行业,该行业多年来一直是压倒性地占主导地位的计算机硬件平台。一个以娱乐为目的(并分发注册破解)对软件进行逆向工程的团体示例是 CORE,它代表“逆向工程挑战”。软件的逆向工程在美国受到版权法中合理使用例外条款的保护。[9] Samba 软件允许不运行 Microsoft Windows 系统的系统与运行 Windows 系统的系统共享文件,是软件逆向工程的典型例子。[10] 因为 Samba 项目必须反向工程关于 Windows 文件共享工作原理的未公开信息,以便非 Windows 计算机可以模拟它。Wine 项目对 Windows API 做了同样的事情,而 OpenOffice.org 是为此执行此操作的其中一方。Microsoft Office 文件格式。ReactOS 项目的目标更加雄心勃勃,因为它努力为 NT 分支的当前 Windows 操作系统提供二进制(ABI 和 API)兼容性,允许为 Windows 编写的软件和驱动程序在洁净室反向工程的 GPL 免费软件或开源对应物上运行。

二进制软件技术

[编辑 | 编辑源代码]

软件的逆向工程可以通过多种方法完成。软件逆向工程的三大类是

  1. 通过观察信息交换进行分析,这在协议逆向工程中最常见,例如,使用总线分析器和数据包嗅探器来访问计算机总线或计算机网络连接,并揭示其上的流量数据。然后可以分析总线或网络行为,以生成模仿该行为的独立实现。这对于反向工程设备驱动程序特别有用。有时,嵌入式系统上的逆向工程会受到制造商故意引入的工具(如 JTAG 端口或其他调试方法)的极大帮助。在 Microsoft Windows 中,低级调试器(如 SoftICE)很受欢迎。
  2. 使用反汇编器进行反汇编,这意味着仅借助机器语言助记符,就可以读取和理解程序的原始机器语言。这适用于任何计算机程序,但可能需要相当长的时间,特别是对于不习惯机器代码的人来说。交互式反汇编器是一个特别流行的工具。
  3. 使用反编译器进行反编译,这是一个尝试(结果各不相同)以某种高级语言重新创建仅以机器代码或字节码形式提供的程序的源代码的过程。

源代码

[edit | edit source]

许多 UML 工具将导入和分析源代码以生成 UML 图表的过程称为“逆向工程”。参见 UML 工具列表。

协议的逆向工程

[edit | edit source]

协议是一组规则,描述了消息格式以及消息如何交换(即协议状态机)。因此,协议逆向工程问题可以分为两个子问题;消息格式和状态机逆向工程。

消息格式传统上是通过一个乏味的手动过程进行逆向工程的,该过程涉及分析协议实现如何处理消息,但最近的研究提出了一些自动解决方案[11][12][13]。通常,这些自动方法要么使用各种聚类分析将观察到的消息分组到聚类中,要么模拟协议实现以跟踪消息处理。

关于协议状态机逆向工程的工作较少。通常,协议状态机可以通过离线学习过程来学习,该过程被动地观察通信并尝试构建接受所有观察到的消息序列的最一般状态机,以及在线学习过程,该过程允许交互式生成探测消息序列并监听对这些探测序列的响应。通常,离线学习小型状态机被认为是 NP 完全的[14],而在线学习可以在多项式时间内完成[15]。Comparetti 等人展示了一种自动离线方法。[13]。Cho 等人最近提出了一种在线方法。[16]

其他典型协议组件(如加密和哈希函数)也可以自动逆向工程。通常,自动方法跟踪协议实现的执行,并尝试检测内存中包含未加密数据包的缓冲区[17]

集成电路/智能卡的逆向工程

[edit | edit source]

逆向工程是一种侵入性和破坏性的分析智能卡的形式。攻击者会一层一层地磨掉智能卡,并用电子显微镜拍照。使用这种技术,可以揭示智能卡的完整硬件和软件部分。攻击者面临的主要问题是将所有内容按正确顺序排列,以找出所有内容的工作原理。工程师试图通过混淆内存位置(例如,总线混淆)来隐藏密钥和操作。[18][19]在某些情况下,甚至可以连接探针来测量智能卡运行时的电压。工程师使用传感器来检测和防止这种攻击。[20]这种攻击并不常见,因为它需要大量的努力和专门设备的投资,而这些设备通常只有大型芯片制造商才能获得。此外,这种攻击的回报率很低,因为通常会使用其他安全技术,例如影子账户。

军事应用的逆向工程

[edit | edit source]

军队经常使用逆向工程来复制其他国家从战场或情报行动中获得的技术、设备或信息。它经常在第二次世界大战和冷战期间使用。二战及其后的一些著名例子包括

  • Jerry 罐:英美军队注意到德国人拥有设计精良的汽油罐。他们逆向工程复制了这些罐子。这些罐子俗称“Jerry 罐”。
  • 图波列夫 Tu-4:三架美国 B-29 轰炸机在日本执行任务时被迫降落在苏联。苏联没有类似的战略轰炸机,于是决定复制 B-29。几年内,他们开发了 Tu-4,这是一款几乎完美的复制品。
  • V2 火箭:战争结束时,西方盟军缴获了 V2 及相关技术的技术文件。苏联和被俘的德国工程师不得不从缴获的硬件开始,重新制作技术文件和图纸,以制造他们的火箭克隆体 R-1,这开启了战后苏联的火箭计划,最终导致了 R-7 和太空竞赛的开始。
  • Vympel K-13/R-3S 导弹(北约代号为 **AA-2 Atoll**),是苏联根据 AIM-9 Sidewinder 逆向工程复制的,这是因为一架台湾 AIM-9B 击中了一架中国 MiG-17,但没有爆炸;令人惊讶的是,导弹卡在了机身内,飞行员带着俄罗斯科学家所称的导弹开发大学课程回到了基地。
  • BGM-71 TOW 导弹:1975 年 5 月,伊朗与休斯导弹系统公司关于 TOW 和小牛导弹联合生产的谈判因定价结构分歧而陷入僵局,随后的 1979 年革命终止了所有此类联合生产计划。伊朗后来成功地对该导弹进行了逆向工程,目前正在生产自己的复制品:Toophan。
  • 中国已经对许多西方和俄罗斯硬件进行了逆向工程,从战斗机到导弹和悍马汽车。

合法性

[edit | edit source]

在美国,即使某件物品或某个过程受商业秘密保护,对其进行逆向工程通常也是合法的,只要它是合法获得的。[21]另一方面,专利需要对一项发明进行公开披露,因此,不一定需要对专利物品进行逆向工程才能对其进行研究。(但是,根据一项或多项专利生产的物品也可能包含其他未获得专利且未公开的技术。)逆向工程师的一个常见动机是确定竞争对手的产品是否包含专利侵权或版权侵权。

在美国,对软件进行逆向工程通常是非法的,因为大多数最终用户许可协议禁止这样做,法院也裁定此类合同禁止条款优先于版权法;参见 Bowers v. Baystate Technologies。[22][23]1991 年欧盟《计算机程序指令》第 6 条允许出于互操作性目的进行逆向工程,但禁止出于创建竞争产品的目的进行逆向工程,并且还禁止公开发布通过对软件进行逆向工程获得的信息。[24][25][26]

另请参阅

[edit | edit source]
  • 安提基特拉机械
  • 基准测试
  • 总线分析器
  • Chonda
  • 洁净室设计
  • 代码变形
  • Connectix 虚拟游戏站
  • 反编译器
  • 数字千年版权法 (DMCA)
  • 法医工程
  • 交互式反汇编器
  • 知识发现元模型
  • 生产主题列表
  • 逻辑分析仪
  • 薪水 (电影)
  • 价值工程
  • 密码分析
  • 软件考古学

参考文献

[编辑 | 编辑源代码]
  1. Chikofsky, E. J.; Cross, J. H., II (1990). "逆向工程和设计恢复:分类法". IEEE 软件. 7 (1): 13–17. doi:10.1109/52.43044. {{cite journal}}: 未知参数 |lastauthoramp= 被忽略 (|name-list-style= 建议) (帮助).
  2. 逆向工程和程序理解调查。迈克尔·L·尼尔森,1996 年 4 月 19 日,ODU CS 551 - 软件工程调查。此外,逆向工程概念用于修改或更改操作系统中的预制 .dll 文件
  3. 互联网工程任务组 RFC 2828 互联网安全词汇表
  4. http://scrappingmetal.blogspot.com/2010/10/reverse-engineering.html
  5. T. Varady, R. R. Martin, J. Cox, 几何模型的逆向工程 - 概述,计算机辅助设计 29 (4), 255-268, 1997.
  6. Chikofsky, E.J. (1990). "逆向工程和设计恢复:IEEE 软件中的分类法". IEEE 计算机学会: 13–17. {{cite journal}}: 未知参数 |coauthors= 被忽略 (|author= 建议) (帮助); 未知参数 |month= 被忽略 (帮助)
  7. Warden, R. (1992). 软件重用和逆向工程实践. 英国伦敦:Chapman & Hall. pp. 283–305.
  8. Chuvakin, Anton (2004). 安全战士 (第 1 版). O'Reilly. {{cite book}}: |access-date= 需要 |url= (帮助); 未知参数 |coauthors= 被忽略 (|author= 建议) (帮助); 未知参数 |month= 被忽略 (帮助)
  9. 参见 Samuelson, Pamela; Scotchmer, Suzanne (2002). "逆向工程的法律与经济学". 耶鲁法学杂志. 111 (7): 1575–1663. doi:10.2307/797533. JSTOR 797533. {{cite journal}}: 未知参数 |lastauthoramp= 被忽略 (|name-list-style= 建议) (帮助).
  10. "Samba:简介". 2001-11-27. 检索于 2009-05-07.
  11. W. Cui、J. Kannan 和 H. J. Wang。Discoverer:从网络跟踪中自动逆向工程协议。在第 16 届 USENIX 安全研讨会上关于 USENIX 安全研讨会的论文集,第 1-14 页。
  12. W. Cui、M. Peinado、K. Chen、H. J. Wang 和 L. Irún-Briz。Tupni:输入格式的自动逆向工程。在第 15 届 ACM 计算机和通信安全会议论文集,第 391-402 页。ACM,2008 年 10 月。
  13. a b P. M. Comparetti、G. Wondracek、C. Kruegel 和 E. Kirda。Prospex:协议规范提取。在 2009 年第 30 届 IEEE 安全与隐私研讨会论文集,第 110-125 页,华盛顿,2009 年。IEEE 计算机学会。
  14. E. M. Gold。从给定数据中识别自动机的复杂性。信息与控制,37(3):302-320,1978 年。
  15. D. Angluin。从查询和反例中学习正则集。信息与计算,75(2):87-106,1987 年。
  16. C.Y. Cho、D. Babic、R. Shin 和 D. Song。 僵尸网络命令和控制协议的形式模型的推理和分析,2010 年 ACM 计算机和通信安全会议。
  17. Polyglot:使用动态二进制分析自动提取协议消息格式。J. Caballero、H. Yin、Z. Liang 和 D. Song。第 14 届 ACM 计算机和通信安全会议论文集,第 317-329 页。
  18. Wolfgang Rankl,Wolfgang Effing,智能卡手册 (2004)
  19. T. Welz:智能卡作为支付方式 (2008 年),鲁尔大学波鸿 ITS 安全研讨会,"http://www.crypto.rub.de/its_seminar_ws0708.html"
  20. David C. Musker:保护和利用电子产品中的知识产权,IBC 会议,1998 年 6 月 10 日
  21. http://www.memagazine.org/contents/current/features/trade101/trade101.html
  22. http://www.utsystem.edu/ogc/intellectualproperty/baystatevbowersdiscussion.htm
  23. http://www.infoworld.com/d/developer-world/contract-case-could-hurt-reverse-engineering-337
  24. http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:31991L0250:EN:HTML
  25. http://books.google.com/books?id=KJmNGglq0nwC&pg=PA321&lpg=PA321&dq=e+European+Software+Directive+reverse+engineering&source=bl&ots=D-fjaWSI4Y&sig=47VJ-tdmg8abUjEjEtvYueC4WKU&hl=en&ei=SIGITJDxI8GLswa4kpScCg&sa=X&oi=book_result&ct=result&resnum=3&ved=0CBwQ6AEwAg#v=onepage&q=e%20European%20Software%20Directive%20reverse%20engineering&f=false
  26. http://www.jenkins.eu/articles-general/reverse-engineering.asp

进一步阅读

[编辑 | 编辑源代码]
[edit | edit source]
华夏公益教科书