我們已經進行了一番基礎的動態分析,了解了這隻惡意程式的安裝行為,並使用 IDA Pro 對 lab 9-1 的函式參數進行分析,得知在輸入參數時必須提供密碼,為了讓我們的分析可以繼續順利進行,今天就要學習如何將函式中的檢查機制 patch 掉!
從昨天 的分析中我們已經得知在 0x402510 可以看到要求的密碼為 abcd,我們可以透過使用這個密碼或是把他 patch 掉,而今天就是要嘗試把他 patch 掉。
我們不去逆向他,而是直接 patch 掉執行檔,讓位於 0x402510 的密碼檢查函式永遠回傳代表驗證成功的值,這樣一來,我們就可以繼續分析這個惡意程式真正的核心功能。我們注意到,在位址 0x40251B 到 0x402521 之間有一段 inline 的 strlen 函式呼叫

如果傳入的參數沒有通過這項檢查,eax 就會被清為 0,接著程式會從 0x4025A0 的 function cleanup 的部分繼續執行。
昨天進行逆向分析後可以發現,只有輸入正確的參數,這個函式才會回傳數值 1,但是我們要修改這個函式,使它無論收到什麼參數,都一律回傳 1,為了做到這一點,我們會插入下圖所顯示的指令。

我們使用 x32dbg 的 Assemble 選項來組譯這些指令,得到一段長度為 6 bytes 的機器碼:B8 01 00 00 00 C3。由於 CALL 指令會事先準備好 stack,而 RET 指令會負責在函式返回時處理相應的流程,因此我們可以直接覆寫密碼檢查函式最開頭,也就是位址 0x402510 的指令。要修改這些指令,可以在想開始修改的位址上按右鍵,然後選擇 Binary > Edit,如下圖

下圖顯示了在 Edit 對話框中輸入完成後的組譯指令,由於我們想要寫入 6 bytes 的資料,覆蓋掉原本只佔 1 byte 的指令,因此我們取消勾選標示為 Keep size 的選項。接著,我們在 HEX+06 欄位中輸入組譯完成的十六進位數值,然後按下 OK

x32dbg 會自動進行組譯,並且在正確的位置顯示新的指令。接下來,我們要把這些修改儲存到執行檔中。方法是在反組譯視窗中按滑鼠右鍵,選擇 Copy to executable → All modifications。接受接下來出現的所有對話框,並將修改後的新版本儲存為 Lab09-01-patched.exe。
為了測試密碼檢查函式是否已經成功被停用,我們再次使用命令列參數 -in 來除錯這個程式,這次 malware 成功通過位址 0x402510 的檢查,並跳到位址 0x402B3F。再執行六條指令之後,一個指向第一個命令列參數的指標會被 push 到 stack 上,而它旁邊則會有另一個指向 ASCII 字串「-in」的指標。下圖顯示了此時 stack 的狀態。

學會了如何在 Debugger 中 patch 掉函式以後,在惡意程式分析中會非常有用,因為有時需要操控達到的結果以觀察惡意程式的行為,此時 patch 的功能便會非常實用
