在我们开始实施逆向工程之前,了解逆向工程究竟是什么、它如何产生,以及它在现代有什么意义,将会非常有趣。正如其名称所示,逆向工程由"逆向"(Reverse)和"工程"(Engineering)两个词组合而成。工程学是设计和构建有益于人类的事物的科学。工程学为我们带来了诸多优势,也产生了一些负面影响。工程学使我们具备了建造对人类至关重要事物的知识和手段,包括道路、建筑、桥梁、汽车、飞机、软件等。然而,随着时间推移,我们也开始利用工程学制造大规模杀伤性武器,如导弹、恶意软件以及其他对人类和自然有害的产品。当任何事物被"工程化"时,它通常会经历设计、开发和测试的多个阶段。而通过逆向工程,情况则截然不同。
逆向工程的核心理念是通过拆解某个系统或产品,以理解其内部架构,从而复制该系统,或为了改进和修改而进行分析。在本章中,我们将通过一些真实案例来探讨逆向工程的重要性,以及它如何改变软件行业的运行方式。
章节结构
本章将涵盖以下主题:
- 逆向工程概述
- 逆向工程的重要性
- 逆向工程的作用
学习目标
学习完本章后,你应能够理解逆向工程的重要性及其对软件行业的影响。我们还将讨论与逆向工程相关的各种机遇,以及恶意软件编写者如何利用逆向工程手段来攻击大型企业的软件系统。
逆向工程概述
在软件领域,逆向工程(Reverse Engineering,简称 RE)是当没有源代码可用时,对程序代码进行剖析和理解的技术。这一切始于上世纪80年代末,当时磁盘操作系统(DOS)正流行于世。大多数人或许尚未出生,或还只是孩子,但那时有人在玩基于 DOS 的电子游戏。大多数游戏都是角色扮演类,玩家拥有生命值和武器。正是在这个背景下,一些计算机极客开始运用逆向工程技术,修改内存中存储玩家生命值和武器数量的数值,以增加生命值或武器数量。这看似是一种作弊手段,但实际上它突破了游戏的安全保护。
为了理解逆向工程在现今时代的重要性,我们举一个例子:假设有三个人------Jitender、Shilpi 和 Atul------他们分别在印度、墨西哥和美国的国际网络安全研究与开发机构(International Institute of Cyber Security)工作。这三位员工身处不同地域,却共同从事同一项目的研发。

他们都在一起从事某个研发项目,因此会通过互联网共享他们的研究成果。他们使用一些安全软件在彼此之间传输数据。由于这些数据对组织非常关键,所使用的软件安全性也必须非常可靠。现在,这款软件可以是开源软件,也可以是闭源软件。如果他们使用的是开源软件,那么就可以通过代码审查来检查其安全性。但如果软件是闭源的呢?他们就无法访问该软件的源代码。
在这种情况下,逆向工程在检查闭源软件安全性方面发挥着重要作用。借助逆向工程,即使在没有源代码的情况下,也能评估软件的安全性。它还能帮助发现软件或应用中可能存在的漏洞。
逆向工程这一过程最初应用于计算机软件和硬件,但如今已被应用到各个领域,从软件、机械到人类 DNA。逆向工程尤为重要,尤其是在你面对闭源软件或含有恶意内容的软件时。
让我们再来看一个著名的逆向工程案例。总部位于圣何塞的凤凰科技公司(Phoenix Technologies)希望开发一款与 IBM PC 兼容的 BIOS。与其自行设计 BIOS,不如直接对 IBM 的专有 BIOS 进行逆向工程,但要避免版权问题,他们采用了"净室"(clean room)或"防火墙"(Chinese wall)方式。具体做法是,划分两组工程师:第一组对 IBM 的专有 BIOS 进行逆向,恢复出其设计规范,并将所有流程和细节记录在案;第二组工程师仅依据这些文档和第一组制定的功能需求进行编码,完全不接触第一组的逆向过程。最终凤凰科技开发出的产品在功能上与 IBM BIOS 完全一致,却没有侵犯版权,随后卖给了其他 PC 厂商。
此外,像超威半导体(AMD)这样的公司,也曾对英特尔(Intel)公司的微处理器进行逆向工程,以生产成本更低的芯片。逆向工程不仅可用于不道德的目的,也常用于合乎伦理的场景,其中之一就是恶意软件分析。由于恶意软件通常是闭源的二进制程序,逆向工程帮助研究人员解码其功能,从而进行防御。
要真正理解逆向工程的重要性,让我们看看著名的 WannaCry 勒索软件。勒索软件是一种在受害者计算机上安装后,会加密其文件并索要赎金才能解密的恶意软件。如果受害者未在规定时间内支付赎金,数据可能会被删除、永远无法恢复,或者被黑市贩卖。WannaCry 针对 Windows 用户加密数据,并要求以比特币形式支付赎金,以规避执法部门的追踪。比特币是一种加密货币,允许人们在互联网上进行支付而无需透露真实身份。得益于逆向工程师的努力,WannaCry 的勒索功能最终被破解,使其失效。我们将在第16章"通过逆向工程破解 WannaCry 勒索软件"中详细讨论这一案例。
逆向工程的重要性
研究现有设计
在设计任何新产品之前,研究市场上已有的产品总是一个良好的做法。深入了解一款产品的功能及其工作原理,有助于激发新的思路;而识别其可改进之处,则可能带来诸多优势。
重建过时或失传的产品
当今市面上的每一款产品,都凝聚了大量的人力、物力和财力。设想这样一种情况:某公司开发的产品在市场上需求旺盛,但由于种种原因,这款产品已多年未获升级,原因可能是内部问题,也可能是原始开发公司已退出市场。通过逆向工程,可以对这些过时的产品进行研究,重新打造出符合现代需求的更新版本。
安全审计
逆向工程有时是组织安全审计的一部分,用于检验内部使用的软件和应用的安全性。它有助于发现组织系统中未知的漏洞。
提取敏感数据
通过逆向工程,可以从软件代码中提取出被编码或加密的敏感数据,用以验证软件的安全性。
军事间谍活动
军方会收集敌方在实地获取的高价值设备原型,通过拆解来了解对手的技术实力,并在此基础上开发新的装备。
发现产品漏洞
为了保障客户的安全与利益,逆向工程被用于检测产品中的缺陷或安全漏洞。尽管企业在产品的设计、开发和测试阶段投入大量资源寻找漏洞,但"没有绝对安全"。许多缺陷在前期测试中未被发现,而这正是逆向工程帮助安全研究人员发现此前未察觉问题的关键环节。
安全研究者赏金激励
过去,产品公司通常依靠内部质保团队进行功能和安全测试。但随着网络攻击事件激增,市场对网络安全的要求也随之提高。许多公司开始向安全研究人员提供赏金,鼓励他们发现自家产品的漏洞。这不仅为研究人员带来经济回报,也帮助公司修复了未被捕捉的缺陷。
逆向工程的作用
用 C/C++ 编写的计算机程序是可读的源代码。编译器将其编译为目标文件(object file),再由链接器(linker)生成二进制可执行文件------机器语言的"0"和"1"。通过逆向工程,可以从这些可执行文件入手,重建或分析程序的内部逻辑与结构。

那些"0"和"1"对人类而言是不可读的。要将机器代码转换回人类可读的格式,需要使用一种称为"反编译器"(decompiler)的工具。反编译器的作用是将二进制代码转换成可读格式,并从中重建出源码。我们将在第 3 章《反向工程工具快速入门》中详细介绍此类工具。
结论
在本章中,我们了解了逆向工程的起源,以及它在当今时代所发挥的重要作用。我们还研究了逆向工程的重要性及其对软件行业的影响,讨论了与之相关的各种机遇,以及恶意软件编写者如何利用逆向工程手段攻击大型公司的软件系统。在下一章中,我们将从逆向工程的角度深入探讨计算机系统的内部结构。