因專案需求,筆者近期首次接觸 EXE 程式反組譯,歷經數天終於還原出關鍵演算法。特記錄完整工具鏈、基礎知識與實戰流程,供初學者參考。
一、工作環境與工具鏈
| 類別 | 工具 | 用途 |
| 查殼 | PEiD | 判斷是否加殼、識別開發語言/編譯器 |
| 反編譯 | DeDe | 針對 Delphi/C++Builder 程式,初步定位模組、函數對應的組合語言位址 |
| 動態反組譯調試 | OllyICE (OD) | 動態追蹤程式碼邏輯、觀察暫存器/記憶體變化 |
| 開發環境 | VS.NET 2005 | 將分析出的邏輯以 C++ 重寫驗證 |
| 輔助工具 | EditPlus、計算機、記事本 | 輔助記錄、轉換、對照 |
二、必備基礎知識
- 組合語言程式設計:資料儲存、堆疊運作、副程式呼叫慣例、不同資料型別的位址跳轉規則。
- C++ 程式設計:語法、指標運算、資料型別控制。
- 工具基本操作:熟練使用上述軟體的核心功能。
三、標準反組譯工作流程
- 查殼:PEiD 開啟目標 EXE(如
test.exe),查看「多項掃描」識別編譯器;點擊右下「>>」進入詳細檢視,以「熵值」「EP校驗」「快速校驗」確認是否加殼。本例為無殼純淨程式。
- 反編譯:依編譯器選擇工具(本例為 Borland C++ 1999,故用 DeDe 3.5)。載入 EXE,切換至「過程」頁籤,雙擊可疑函數(如
Button3Click)查看其組合語言框架,記錄函數起始/結束位址(如 00401EC4 ~ 00401EF5)。
- 反組譯準備:用 OD 載入 EXE,定位至上一步記錄的位址區間。
- 特徵定位:結合 OD 中的 ASCII 字串搜尋(如 "Hello OD")、常數值、映射矩陣、計數器等特徵,精準鎖定目標程式碼片段。
- 動態調試分析:逐指令分析邏輯流程,輔以記憶體/暫存器觀察視窗記錄數值傳遞軌跡。
- C++ 還原實作:根據分析結果,以 C++ 重寫同等功能程式碼。
四、關鍵技巧補充
- **字串定位法**:OD 中搜尋 ASCII/Unicode 字串,快速找到相關程式碼區塊。
- **常數/資料結構定位法**:針對程式中固定的常數陣列、查找表、控制矩陣進行記憶體搜尋,定位更精準。
- **動態追蹤**:善用 OD 的斷點、單步執行、條件斷點,觀察關鍵暫存器(EAX, ECX, ESP 等)與堆疊變化。
備註:受保密協議限制,文中未展示具體專案程式碼細節,敬請見諒。拋磚引玉,期待前輩不吝指教。
本文出自 “空中的魚” 博客,請務必保留此出處:https://airfish.blog.51cto.com/358752/264819