x64dbg - 第九章 | 反匯編練習(二) 上
前置作業
因為要反匯編的程式是簡體字,避免在分析過程中看到亂碼
- 使用Locale Emulator用中文(簡體)開啟x64dbg

- 安裝x64dbg_tol外掛 [參考]註:用於顯示 x64dbg顯示中文的自動註解
目標程式
檔案下載:TraceMe.exe
解壓密碼:morosedog
任務目標
- 讓程式使其驗證通過。
分析程式
- 開啟TraceMe.exe
- 直接點選Check
- 跳出訊息視窗你輸入字符要大於四個!
- 輸入用戶名和序列號,點選Check
- 跳出訊息視窗序列號錯誤, 再來一次!

- 檢驗顯示是使用Microsoft Visual C++ v6.0編寫。

搜尋思路
- C++撰寫的,使用函數搜尋 (輸入框函數:GetDlgItemText)
修改思路
- 移除驗證的部分或是跳過驗證
- 驗證的邏輯分析,算出正確序號
實際分析
- 開啟 - TraceMe.exe
- 於反匯編視窗點選右鍵選擇 - 搜尋(S)->- 目前模組->- 跨模組呼叫(I)
- 發現 - GetDlgItemTextA,對其設定中斷點
- F9執行程式
- 輸入用戶名 - abcdefg和序列號- 12345678,並按下- Check
- 斷點在 - 004011A3 | 8B3D A0404000 | mov edi,dword ptr ds:[<&GetDlgItemTextA>] |
- F8一步一步過,並觀察反匯編視窗的註解和資訊視窗的內容
- 步過到下方指令時 - 1 
 2
 3- 004011D0 | 74 76 | je traceme.401248 | 
 004011D2 | 83FB 05 | cmp ebx,5 |
 004011D5 | 7C 71 | jl traceme.401248 |
- 可以發現跳轉實現的話是到 - 00401248
- 我們使用滑鼠指定到 - 00401248並觀察資訊視窗,可以發現此判斷是判斷用戶名要大於四個以上- 1 
 2
 3- eax=61 'a' 
 dword ptr [esp+1C]=[0018F6A8 "你输入字符要大于四个!"]=E4CAE3C4
 .text:00401248 traceme.exe:$1248 #1248
- F8繼續步過,並觀察反匯編視窗的註解和資訊視窗的內容
- 步過到下方指令時 - 1 
 2
 3- 004011E3 | 52 | push edx | edx:"abcdefg" 
 004011E4 | 50 | push eax | eax:"12345678"
 004011E5 | E8 56010000 | call traceme.401340 |
- 發現這邊將用戶名和序列號傳入 - 00401340,這邊假設該函數是計算序列號的地方
- F8繼續步過,並觀察反匯編視窗的註解和資訊視窗的內容
- 步過到下方指令時 - 1 
 2- 004011F3 | 85C0 | test eax,eax | 
 004011F5 | 74 37 | je traceme.40122E |
- 可以發現跳轉實現的話是到 - 0040122E
- 我們使用滑鼠指定到 - 0040122E並觀察資訊視窗,可以發現這邊表示序列號是錯誤- 1 
 2
 3- edx=02020D19 
 dword ptr [esp+34]=[0018F6C0 "序列号错误,再来一次!"]=D0C1F2D0
 .text:0040122E traceme.exe:$122E #122E
- 這邊我假設不能讓他實現跳轉 
- je跳轉實現為- ZF=1,我們將其修改為- ZF=0
- F8繼續步過,並觀察反匯編視窗的註解和資訊視窗的內容
- 步過到下方指令時 - 1 
 2- 004011F7 | 8D4C24 0C | lea ecx,dword ptr ss:[esp+C] | 
 004011FB | 51 | push ecx | ecx:"恭喜你!成功!"
- 可以發現準備了 - 恭喜你!成功!的字樣
- F8繼續步過,並觀察反匯編視窗的註解和資訊視窗的內容
- 步過到下方指令時 - 1 - 00401281 | FF15 C8404000 | call dword ptr ds:[<&DialogBoxParamA>] | 
- 發現會卡住,無法繼續步過 
- 此時點擊開啟的程式,會發現跳出訊息視窗為 - 恭喜你!成功!- 註:函數:DialogBoxParam 

分析總結
- 00401340,假設該函數是計算序列號的地方。
- 004011F5,判斷跳轉序列號失敗的位址。
- 004011F7,序列號成功的位址。
修改思路
根據分析總結做對應
- 步入00401340,分析並找出計算方式或是找出正確序號。
- 將004011F5該段用NOP做填充。
- 在失敗錯誤的跳轉指令,修改成直接跳轉到成功的位址。
實際修改
這邊使用修改思路的第2個方法做示範。
- 將所有中斷點移除 
- 反匯編視窗中按下 - Ctrl + G輸入- 0040122E,會跳轉到- 0040122E位址
- 對 - 004011F5按右鍵選擇- 二進位->- 用 NOP 填充 (Ctrl + 9)
- F9執行
- 輸入用戶名 - abcdefg和序列號- 12345678,並按下- Check
- 彈出 - 恭喜你!成功!視窗
- 點擊 - 修補程式或是快捷鍵- Ctrl + P
- 點擊 - 修補檔案(P)
- 另存檔名 - Fix_TraceMe.exe
- 恭喜補丁產生 - Fix_TraceMe.exe

至於修改思路的第3個方法,這邊就不是示範了。
經驗分享
有時在動態分析程式,一直按F7或F8來觀察暫存器、堆疊和記憶體,不過按太快會直接跳過關鍵的區塊,可以使用-或 +的快捷鍵,察看前面幾個執行的過程。
註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (二)

 
		