為什麼要動態逆向#
動態逆向工程(dynamic reverse engineering) 是檢視執行中執行檔的運作。在分析複雜功能——例如自訂密碼學或壓縮常式——時特別有用:你不必盯著一大片反組譯硬想,而是可以一次一條指令地逐步走過去。動態逆向還讓你能注入測試輸入,用來驗證自己對程式碼的理解是否正確。
最常見的做法是用除錯器(debugger) 在特定點暫停執行中的應用程式,然後檢視資料值。可選的除錯器不少,這裡使用 IDA Pro,因為它內建一個給 Windows 應用程式用的基本除錯器,而且會與靜態檢視同步——例如你在除錯器裡重新命名一個函式,靜態反組譯那邊也會跟著改。
以下說明以 Windows 上的 IDA Pro 為例,但這些基本技巧同樣適用於其他作業系統與除錯器。
基本操作:
- 按 F9 在 IDA Pro 除錯器中執行目前反組譯的執行檔。
- 若執行檔需要命令列參數,選 Debugger ▸ Process Options,在 Parameters 文字框中填入。
- 按 CTRL-F2 停止對執行中行程的除錯。
設定中斷點#
使用除錯器最簡單的方式,就是在反組譯中感興趣的位置設中斷點(breakpoint),然後在中斷點檢視程式的執行狀態。
找到目標區域後按 F2,該行反組譯會轉為紅色,代表中斷點設定成功。之後只要程式試圖執行該中斷點上的指令,除錯器就會停下來,把程式的當前狀態交到你手上。
除錯器視窗#
命中中斷點時,IDA Pro 除錯器預設會顯示三個重要視窗。
EIP 視窗#
第一個視窗依 EIP 暫存器中的指令顯示反組譯檢視,也就是目前正在執行的指令。它的操作方式和靜態逆向時的反組譯視窗大致相同:你可以從這裡快速跳到其他函式、重新命名參照(變更會反映到靜態反組譯上)。把滑鼠移到暫存器上會看到值的快速預覽——當暫存器指向某個記憶體位址時,這一點非常實用。

圖表 6-14:除錯器的 EIP 視窗
ESP 視窗#
ESP 視窗反映 ESP 暫存器的當前位置,也就是目前執行緒堆疊的基底。這裡是辨識「傳給函式呼叫的參數」與「區域變數的值」的地方——例如在呼叫 send 函式之前,堆疊上就會排著它的四個參數。和 EIP 視窗一樣,雙擊參照可跳到對應位置。

圖表 6-15:除錯器的 ESP 視窗
通用暫存器視窗#
General registers 預設視窗顯示通用暫存器的當前狀態。回想一下,暫存器用來存放各種程式狀態的當前值,例如迴圈計數器與記憶體位址。

圖表 6-16:General registers 視窗
- 對記憶體位址而言,這個視窗提供了跳到記憶體檢視視窗的便捷途徑:點位址旁邊的箭頭,即可從最後作用的記憶體視窗跳到該暫存器值對應的記憶體位址。
- 要開新的記憶體視窗,在陣列上按右鍵並選 Jump in new window。
- 視窗右側會顯示來自 EFLAGS 暫存器的條件旗標。
中斷點該下在哪裡#
調查網路協定時,最值得下中斷點的位置有這幾類:
send與recv的呼叫:這是最好的第一步,它們負責從網路堆疊收送資料。- 密碼學函式:設定加密金鑰的函式,以及加解密函式,都是很好的目標。
- 看起來在組建網路協定資料的程式碼區域:因為 IDA Pro 的除錯器與靜態反組譯器同步,你可以直接把靜態分析階段標記出來的可疑區域轉成中斷點。
在中斷點之間逐指令單步執行,能讓你真正看懂底層演算法的運作方式——這往往比反覆重讀組語更快抵達答案。
靜態與動態不是二選一。靜態分析幫你找到「該在哪裡停下來」,動態分析幫你看到「停下來的那一刻資料長什麼樣」,兩者交替使用效率最高。