软件反求工程

**逆向工程**（英語：Reverse Engineering），又稱**反向工程**，是一種技術仿造過程，即對一專案標產品進行逆向分析及研究，從而演繹並得出該產品的處理流程、組織結構、功能效能規格等設計要素，以製作出功能相近，但又不完全一樣的產品。逆向工程源於商業及軍事領域中的硬體分析。其主要目的是，在無法輕易獲得必要的生產資訊下，直接從成品的分析，推導產品的設計原理。

逆向工程可能會被誤認為是對智慧財產權的嚴重侵害，但是在實際應用上，反而可能會保護智慧財產權所有者。例如在積體電路領域，如果懷疑某公司侵犯智慧財產權，可以用逆向工程技術來尋找證據。

## 動機

需要逆向工程的原因如下：

* 介面設計：由於互操作性，逆向工程被用來找出系統之間的協同運作協定。
* 軍事或商業機密：竊取敵人或競爭對手的最新研究或產品原型。
* 改善文件：當原有的文件有不充分處，又當系統被更新而原設計人員不在時，逆向工程被用來取得所需資料，以補充說明或了解系統的最新狀態。
* 軟體升級或更新：出於功能、合規、安全等需求更改，逆向工程被用來了解現有或遺留軟體系統，以評估更新或移植系統所需的工作。
* 製造沒有許可／未授權的副本。
* 學術／學習目的。
* 去除複製保護和偽裝的登入權限。
* 檔案遺失：採取逆向工程的情況往往是在某一個特殊裝置的檔案已經遺失了（或者根本就沒有），同時又找不到工程的負責人。完整的系統時常需要基於陳舊的系統上進行再設計，這就意味著想要整合原有的功能進行專案的唯一方法便是採用逆向工程的方法分析已有的碎片進行再設計。
* 產品分析：用於調查產品的運作方式、部件構成、估計預算，以及辨識潛在的侵權行為。

## 應用

### 機械裝置

隨著電腦輔助設計的流行，逆向工程變成了一種能根據現有的物理部件通過 CAD、CAM、CAE 或其他軟體構築 3D 虛擬模型的方法。逆向工程的過程採用了通過測量實際物體的尺寸並將其製作成 3D 模型的方法，真實的物件可以通過如 CMMs、雷射掃描器、結構光源轉換儀，或者 X 射線斷層成像等這些 3D 掃描技術進行尺寸測量。這些測量資料通常被認作是點雲，缺乏拓撲資訊並且同時通常會被製作成更有用格式例如多邊形網格，NURBS 曲線或者 CAD 模型。由於點雲本身並不像 3D 軟體裡的模型那樣直觀，所以如同 3-matic、Imageware、PolyWorks、Rapidform 或者傑魔公司等這些軟體都提供了將點雲變成能可視圖像，或者被其他應用軟體如 3D CAD、CAM、CAE 辨識的格式的功能。

反向工程同時會被需要將真實的幾何體應用在虛擬的數字開發環境中的商業活動中應用，比如將自己產品或者競爭者的三維資料數位化。通過這種手段可以分析出產品的運作方式，部件構成，估計預算和辨識潛在的侵權行為等。

價值工程也是商業中應用的類似手段。不過價值工程的目的是通過反構造和分析產品來找到節省開銷的辦法。

### 軟體

由於「逆向工程」一詞用在軟體工程（簡稱「軟工」）領域中的具體含義模糊不清，Chikofsky 和 Cross 為此寫了篇文章，以闡清及區分「逆向工程」與各種相近的概念。據文章所述，逆向工程是一種分析目標系統的過程，其目的是辨識出系統的各個組件以及它們之間的關係，並以其它的形式或在較高的抽象層次上，重建系統的表徵（Representations）。 軟體逆向工程也可被視作「開發周期的逆行」。
在此定義下，對一項軟體程式進行逆向工程，類似於逆行傳統瀑布模型中的開發步驟，即把實現階段的輸出（即軟體程式）還原回在設計階段所做的構思。軟體逆向工程僅僅是一種檢測或分析的過程，它並不會更改目標系統（否則就成了軟體再工程）。

軟體防篡改技術被用於遏制對專有軟體進行逆向工程及再工程。實際應用中出現了兩類逆向工程。第一種，軟體的原始碼可用，但是更高層次的部分幾乎沒有描述文件或者描述文件不再適用或者遺失。第二種，軟體沒有可用的原始碼，任何能找到它的原始碼的努力都被稱為逆向工程。大部分人都熟悉這個詞的第二種用法。軟體的逆向工程可以使用淨室技術來避免侵犯著作權。

軟工中的黑箱測試與逆向工程有很多共同點，但黑箱測試人員常供以 API 以作測試，並且測試的目的就是通過外部攻擊，找出程式漏洞和未歸檔的特性。

逆向工程的其他目的包括：安全審查、 解除複製保護（又稱破解）、繞過消費類電子產品中常設有的存取限制、客製化嵌入式系統（例如引擎管理系統）、產品內部修補或更新、給功能不全的廉價硬體（例如某些顯示卡晶片組）添加額外功能，或僅為滿足好奇心。

#### 二進位軟體

對最終程式的二進位代碼所進行的逆向工程被稱為「代碼反向工程」，或簡稱 RCE（**R**everse **C**ode **E**ngineering）。例如，我們可以用 Jad 對 Java 平台的二進位碼進行反編譯。一個著名的逆向工程案例是，首個由非 IBM 公司所實現的 IBM 個人電腦中的 BIOS，這開創了 IBM PC 相容機產業，使得 IBM PC 相容機成為多年來的主流電腦硬體平台。一個以軟體逆向工程為樂的團體例子是 CORE（**C**hallenge **O**f **R**everse **E**ngineering，意為「挑戰逆向工程」）。在美國，軟體逆向工程只要遵守著作權法的合理使用規定，都是受保護的。成功的軟體逆向工程專案有：

* Samba：一個允許非 Windows 系統與 Windows 系統共享檔案的開源專案。由於微軟沒有公開 Windows 檔案分享機制的資訊，Samba 必須作逆向工程，以便在非 Windows 系統上，仿真出同樣的行為。
* Wine：對 Windows API 做了同樣的工作，
* OpenOffice.org：對 Microsoft Office 檔案格式作逆向工程。
* ReactOS：竭力在 ABI 及 API 上，相容 NT 系 Windows 系統，以便讓為 Windows 所編寫的軟體和驅動程式可以在其上執行。
* WindowsSCOPE：用來監測及分析 Windows 系統記憶體的實況內容。

#### 二進位軟體技術

軟體逆向工程有多種實現方法，主要有三：

1. 分析通過資訊交換所得的觀察。最常用於協定逆向工程，涉及使用匯流排剖析器和封包嗅探器。在接入電腦匯流排或網路的連接，並成功截取通信資料後，可以對匯流排或網路行為進行分析，以製造出擁有相同行為的通信實現。此法特別適用於裝置驅動程式的逆向工程。有時，由硬體製造商特意所做的工具，如 JTAG 埠或各種除錯工具，也有助於嵌入式系統的逆向工程。對於微軟的 Windows 系統，受歡迎的底層除錯器有 SoftICE。
2. 反組譯，即藉用反組譯器，把程式的原始機器碼，翻譯成較便於閱讀理解的組譯代碼。這適用於任何的電腦程式，對不熟悉機器碼的人特別有用。流行的相關工具有 Interactive Disassembler。
3. 反編譯，即藉用反編譯器，嘗試從程式的機器碼或位元組碼，重現高階語言形式的原始碼。

#### 原始碼

許多 UML 工具涉及到匯入原始碼生成 UML 圖，即「逆向工程」。

### 積體電路和智慧卡

分析智慧卡的逆向工程具有侵入性和破壞性，智慧卡被層層刮掉用電子顯微鏡拍照。這種技術可以完整地揭示出智慧卡的硬體和軟體部份。主要的問題就是，把所有的東西按正確的順序放好以找出每一個部件是如何工作的。工程師們用打亂記憶體位置的方法隱藏密碼和操作，例如 busscrambling。有時甚至可以在智慧卡執行的時候用探針直接測量電壓，設計師則用感應器來檢測和防止。破壞支付業務中使用的智慧卡很困難，只有大晶片製造商使用那些專業的裝置。況且，和其他安全機制例如陰影帳戶相比，這種方法回報太低。

### 軍事

逆向工程經常被用在軍事上，用來複製從戰場上由常規部隊或情報活動獲得的別國之技術、裝置、資訊或其零件。二戰和冷戰中經常被用到。二戰以來的著名例子有：

* 德國桶：英美軍注意到德軍有一種設計絕妙的油桶，於是就用逆向工程複製了這些桶。這些被泛稱為「可攜式油桶」。
* 四式 7.5 公分高射炮：日本從中國戰場擄獲的波佛斯 75 毫米口徑 M1929 高射炮上的逆向工程，產生四式 7.5 公分高射炮並搭配日本的九八式六噸牽引車使用，拖弋速度可達時速 45 公里，並擁有快速放列的作戰的能力。
* 圖波列夫 Tu-4：三架飛往日本的 B-29「超級堡壘」轟炸機迫降到了蘇聯。蘇聯沒有類似的戰略轟炸機，就決定複製 B-29。幾年後他們開發出了 Tu-4，幾近完美的複製品。
* V-2 火箭：戰爭結束時 V2 的技術文件和相關技術被西方聯盟俘獲。蘇聯和被俘的德工程師要用俘獲的構件重建技術文件和圖紙，用於生產這種飛彈的代件。R-1 啟動了戰後蘇聯導彈畫，一直到 R-7，並導致了太空競賽。
* K-13/R-3S 飛彈（北約代號為 **AA-2 'Atoll**）是蘇聯對 AIM-9 響尾蛇的逆向工程複製品。早期傳說一枚臺灣 AIM-9B 射中中國大陸 MiG-17 後沒有爆炸，這枚飛彈留在機身裡，飛行員帶著這枚飛彈返回了基地。根據蘇聯公開的資料則是由墜毀在中國境內的美國海軍戰鬥機殘骸上取得。
* BGM-71 TOW 導彈：1975 年三月，伊朗與休斯飛彈系統公司的關於 TOW 和 Maverick 飛彈合作的談判因價格體系的分歧停止了，接下來的 1979 年革命結束了這種合作的所有計劃。伊朗成功地對這種飛彈進行逆向工程，目前正在生產他們自己的複製品：圖芬（Toophan）。

## 相關法律

在美國及其他許多國家，製品或製法都受商業秘密保護，只要合理地取得製品或製法就可以對其進行逆向工程。專利需要將發明公開發表，因此專利不需要逆向工程就可進行研究。逆向工程的一種動力就是確認競爭者的產品是否侵權專利或侵犯著作權。

為了互用性（例如，支援未公開的檔案格式或硬體外圍），而對軟體或硬體系統進行的逆向工程被認為是合法的，雖然專利持有者經常反對並試圖打壓以任何目的對他們產品進行的逆向工程。

為了取得一個有著作權的電腦程式中隱含的思想和功能元素且有合法的理由要取得，當只有拆解這一種方法時，根據法律判定，拆解是對有著作權作品的合理使用。

## 在虛構作品

* 記憶裂痕

## 另見

* 安提基特拉機械
* 基準化分析法
* 匯流排剖析器
* 淨室設計
* 代碼融合
* 索尼 PS 遊戲機模擬器
* 反編譯
* 千禧年數位版權法案（DMCA）
* 法工程學
* 互動式反組譯器
* 知識挖掘元模型
* 邏輯剖析器
* 價值工程

## 延伸導讀

* Reverse Engineering for Beginners, D.Yurichev. [1] （頁面存檔備份，存於網際網路檔案館）.
* Eilam, Eldad. Reversing: Secrets of Reverse Engineering. 約翰威立. 2005: 595. ISBN 0764574817.
* Raja Vinesh, Fernandes Kiran J. Reverse Engineering - An Industrial Perspective. Springer. 2008: 242. ISBN 978-1-84628-855-5.

## 參考

## 外部連結

* Crackmes.de, the longest running and most complete Crackmes web page on the internet. Free Reverse Code Engineering training material
* Video RCE, the biggest Reverse Code Engineering Video Library, with hundreds of free video tutorials
* IITAC, the Reverse Code Engineering and IT Security Training/Audit Institute a leading consulting institute, home of the above free RCE resources
* Reverse Code Engineering: The complete resource for RE of software. Archives of the most important Reverse Code Engineering sites （頁面存檔備份，存於網際網路檔案館）
* OpenRCE: Reverse Engineering Portal （頁面存檔備份，存於網際網路檔案館）
* MoDisco: (Model Discovery), an Eclipse Project on Model Driven Reverse Engineering
* ERESI: The ERESI Reverse Engineering Software Interface （頁面存檔備份，存於網際網路檔案館） for RCE on UNIX
* Radare: Advanced CmdLine Hexadecimal Editor, Disassembler and Debugger （頁面存檔備份，存於網際網路檔案館） multi-platform full-featured RCE tool
* Program transformation wiki on Reverse Engineering （頁面存檔備份，存於網際網路檔案館）
* Introduction to Reverse Engineering Software （頁面存檔備份，存於網際網路檔案館）, preprint of a book by Mike Perry and Nasko Oskov.
* Reverse Engineering Shapes （頁面存檔備份，存於網際網路檔案館）, article by Tamás Várady
* Online Resource for Reverse Engineering Software （頁面存檔備份，存於網際網路檔案館）
* Article on legal considerations by David C. Musker
* CNN: How Soviets copied America's best bomber during WWII （頁面存檔備份，存於網際網路檔案館）
* Very good RE definitions from Software Engineering
* Architecture-Driven Modernization group at OMG （頁面存檔備份，存於網際網路檔案館）
* Reverse Engineering Delivers Product Knowledge Aids Technology Spread - Article in Electronic Design by Dick James, Senior Technology Adviser, Chipworks
* Chikofsky, E.J.; J.H. Cross II (January 1990). "Reverse Engineering and Design Recovery: A Taxonomy in IEEE Software". IEEE Computer Society: 13–17. （頁面存檔備份，存於網際網路檔案館） - Original Paper hosted at cs.cmu.edu
* Reverse Engineering Applications Creaform 3D Reverse Engineering Services