Like Share Discussion Bookmark Smile

J.J. Huang   2019-07-29   x64dbg   瀏覽次數:

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


分析總結

  1. 00401340,假設該函數是計算序列號的地方。
  2. 004011F5,判斷跳轉序列號失敗的位址。
  3. 004011F7,序列號成功的位址。

修改思路

根據分析總結做對應

  1. 步入00401340,分析並找出計算方式或是找出正確序號。
  2. 004011F5該段用NOP做填充。
  3. 在失敗錯誤的跳轉指令,修改成直接跳轉到成功的位址。

實際修改

這邊使用修改思路的第2個方法做示範。

  • 將所有中斷點移除

  • 反匯編視窗中按下Ctrl + G輸入0040122E,會跳轉到0040122E位址

  • 004011F5按右鍵選擇二進位->用 NOP 填充 (Ctrl + 9)

  • F9執行

  • 輸入用戶名abcdefg和序列號12345678,並按下Check

  • 彈出恭喜你!成功!視窗

  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

  • 另存檔名Fix_TraceMe.exe

  • 恭喜補丁產生Fix_TraceMe.exe

至於修改思路的第3個方法,這邊就不是示範了。

經驗分享

有時在動態分析程式,一直按F7F8來觀察暫存器、堆疊和記憶體,不過按太快會直接跳過關鍵的區塊,可以使用-+的快捷鍵,察看前面幾個執行的過程。


註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏OllyDbg 使用笔记 (二)