Like Share Discussion Bookmark Smile

J.J. Huang   2019-07-12   OllyDBG   瀏覽次數:

OllyDBG - 第八章 | 反匯編練習 (二) 上

這篇反匯編開始前,要告訴大家,反匯編這是需要很大的耐心和毅力,經過不斷的追蹤分析才可以看到一些些蛛絲馬跡;當然經驗和能力也會影響的,但這是需要時間來做累積的。

首先在我沒有事先參考任何文章來做的反匯編,所以建議大家不要急著看人家的破解過程,試著自己找看看,加油。

檔案下載

目的程式:
TraceMe.7z

解壓縮密碼:

1
morosedog

由於目的程式是簡體中文的,所以在反匯編過程有很多亂碼,我又找不到插件可以解決這問題,於是這邊提供一個簡體的OllyDBG

吾爱破解专用版Ollydbg.rar

預設解壓縮密碼:

1
www.52pojie.cn

註:轉至吾爱破解


開啟簡體軟體,這邊推薦使用Locale Emulator

註:轉至阿榮福利味

使用PEid檢驗

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

開啟TraceMe.exe使用並分析

  • 開啟 TraceMe.exe
  • 直接點選Check
  • 跳出訊息視窗你輸入字符要大於四個!
  • 輸入用戶名序列號,點選Check
  • 跳出訊息視窗序列號錯誤, 再來一次!

分析:基本上看到text輸入框,一定會用到GetDlgItemText是C++中的函數,調用這個函數以獲得與對話框中的控件相關的標題或文本

目標說明

讓程式使其驗證通過。

思路 (本人弱弱的,勿噴)

首先視窗中有一些函數,所以應該可以利用OllyDBG - 第三章 | 函數參考的方式來找到斷點,接續進行分析找到驗證序號的地方;

至於找什麼函數呢?因為有輸入框,所以程式要確認序號是否正確的時候,需要先取得輸入框的內容,這時候就會用到函數GetDlgItemText

  1. 移除驗證的部分或是跳過驗證
  2. 找出驗證的邏輯加以計算,算出正確序號

使用OllyDBG分析 (方法一)

  • 啟動OllyDBG
  • 按下快捷鍵F3
  • 選擇TraceMe.exe
  • 在入口點地址後面加上註解 (良好的註解有助於分析)

  • 按下Ctrl + N
  • 瀏覽一下函數,在上方可以判定是一個訊息窗口,所以基本上找類似GetDlgItemText的函數

  • 在該函數按下右鍵
  • 選擇在每個參考上設定斷點

  • 按下F9執行程式
  • 輸入用戶名abcdefg、序列號12345678

  • 按下Check按鈕
  • 看到斷點斷在004011A3 . 8B3D A0404000 mov edi,dword ptr ds:[<&USER32.GetDlgIte>; user32.GetDlgItemTextA
  • F8一步一步往下看 (多觀察資訊視窗)
  • 會發現執行到004011F5 . /74 37 je short TraceMe.0040122E,然後跳轉到0040122E > \8D5424 34 lea edx,dword ptr ss:[esp+0x34]
  • 再繼續往下就會看到OD自動註解的內容序列號錯誤, 再來一次!
  • 繼續下去到00401281 . FF15 C8404000 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA停住
  • 跳出訊息視窗內容為序列號錯誤, 再來一次!

分析

第一種分析:

  • 我們剛剛發現執行到004011F5 . /74 37 je short TraceMe.0040122E就跳到準備錯誤訊息的那邊

    註:je 若等於則跳越 x = y ZF=1

  • 所以關鍵就是這行的上一行指令004011F3 . 85C0 test eax,eax

    註:testcmp都是比較用的,他們有什麼差別,這邊暫時不提

  • 所以我預期這邊讓他不做跳轉就可以Check成功

第二種分析:

  • 在追蹤的過程中會發,如果有仔細觀察資訊視窗可以發現下面三行push所帶的值很眼熟
  • 然後就是004011E5 . E8 56010000 call TraceMe.00401340
  • 所以我猜測這個call是計算序列號的地方

    註:函数的返回值都是儲存在eax

  • 所以下面的004011F3 . 85C0 test eax,eax是比較的地方
1
2
3
4
5
004011DB   .  53            push ebx ; ebx=00000007
004011E3 . 52 push edx ; edx=0018F6D8, (ASCII "abcdefg")
004011E4 . 50 push eax ; eax=0018F728, (ASCII "12345678")

004011E5 . E8 56010000 call TraceMe.00401340 ; 猜測是計算序列號的地方

註:test比對的結果放在ZF:零值旗標


  • 按下Alt + B
  • 先刪除或是停用之前的斷點Breakpoints, 条目 0 地址=004011A3 模块=TraceMe 激活=始终 反汇编=mov edi,dword ptr ds:[<&USER32.GetDlgItemTextA>]
  • 然後在004011F3 . 85C0 test eax,eax的上一行設定新的斷點

  • Ctrl + F2重新開始
  • F9開始
  • 輸入用戶名abcdefg、序列號12345678
  • 按下Check按鈕
  • 觀察暫存器的視窗Z (也就是ZF) 的參數
  • 在執行過004011F3 . 85C0 test eax,eax後,ZF=1
  • 此時我們修改其值為0
  • 繼續F8
  • 會看到沒有跳轉走,而是繼續往下,並可以看到OD自動註解恭喜你!成功!
  • 繼續F8
  • 繼續下去到00401281 . FF15 C8404000 call dword ptr ds:[<&USER32.DialogBoxPar>; \DialogBoxParamA停住
  • 跳出訊息視窗內容為恭喜你!成功!

  • 到這邊很明顯我們只要把004011F3 . 85C0 test eax,eax判斷修改或是移除即可
  • Ctrl + F2重新開始
  • F9開始
  • 輸入用戶名abcdefg、序列號12345678
  • 按下Check按鈕
  • 004011F3 . 85C0 test eax,eax按下右鍵選擇編譯
  • 輸入NOP,按下組譯
  • 會看到指令被換成了NOP
  • 繼續F8
  • 恭喜你!成功!

註:以上將指令重新編譯成NOP,這個俗稱暴破 (暴力破解);而不是叫做破解。
真正的破解應該是找到序號的計算方法,然後寫出註冊機來產生序號,這才稱得上是破解。

  • 選擇兩個修改後NOP的指令
  • 按下右鍵選擇複製到可執行檔案 -> 選擇
  • 在視窗按下右鍵選擇備份 -> 儲存資料到檔案
  • 另存在別的位置,檔名改為TraceMe(Cracked).exe

  • 執行TraceMe(Cracked).exe
  • 輸入用戶名abcdefg、序列號12345678 (程式已經被爆破,輸入什麼都不重要了)
  • 目標達成

總結

這個TraceMe,我至少重新分析了不下30次,才可以略有小成的分析出點東西,然後在不斷地看組合語言的過程,看不懂該行指令在做什麼,或是猜測不到不確的時候,就是去看x86組合語言 - 第三章 | 基本指令集,或是上網直接查詢,慢慢了解,才終於發現看懂了!!!真的有很大的成就感,後面將會繼續針對這個TraceMe繼續分析。


註:我這邊提供一些可以參考的文章 (以上的練習我沒事先參考)
CSDN billvsme的专栏OllyDbg 使用笔记 (二)