OllyDBG - 第八章 | 反匯編練習 (二) 上
這篇反匯編開始前,要告訴大家,反匯編這是需要很大的耐心和毅力,經過不斷的追蹤分析才可以看到一些些蛛絲馬跡;當然經驗和能力也會影響的,但這是需要時間來做累積的。
首先在我沒有事先參考任何文章來做的反匯編,所以建議大家不要急著看人家的破解過程,試著自己找看看,加油。
檔案下載
目的程式:
TraceMe.7z
解壓縮密碼:
1 | morosedog |
由於目的程式是簡體中文的,所以在反匯編過程有很多亂碼,我又找不到插件可以解決這問題,於是這邊提供一個簡體的OllyDBG
預設解壓縮密碼:
1 | www.52pojie.cn |
註:轉至吾爱破解
開啟簡體軟體,這邊推薦使用Locale Emulator
註:轉至阿榮福利味
使用PEid檢驗
檢驗顯示是使用Microsoft Visual C++ v6.0
編寫。
開啟TraceMe.exe
使用並分析
- 開啟
TraceMe.exe
- 直接點選
Check
- 跳出訊息視窗
你輸入字符要大於四個!
- 輸入
用戶名
和序列號
,點選Check
- 跳出訊息視窗
序列號錯誤, 再來一次!
分析:基本上看到text輸入框,一定會用到GetDlgItemText是C++中的函數,調用這個函數以獲得與對話框中的控件相關的標題或文本
目標說明
讓程式使其驗證通過。
思路 (本人弱弱的,勿噴)
首先視窗中有一些函數,所以應該可以利用OllyDBG - 第三章 | 函數參考的方式來找到斷點,接續進行分析找到驗證序號的地方;
至於找什麼函數呢?因為有輸入框,所以程式要確認序號是否正確的時候,需要先取得輸入框的內容,這時候就會用到函數GetDlgItemText
- 移除驗證的部分或是跳過驗證
- 找出驗證的邏輯加以計算,算出正確序號
使用OllyDBG分析 (方法一)
- 啟動
OllyDBG
- 按下快捷鍵
F3
- 選擇
TraceMe.exe
- 在入口點地址後面加上註解 (良好的註解有助於分析)
- 在該函數按下右鍵
- 選擇
在每個參考上設定斷點
- 按下
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
註:
test
和cmp
都是比較用的,他們有什麼差別,這邊暫時不提 - 所以我預期這邊讓他不做跳轉就可以
Check
成功
第二種分析:
- 在追蹤的過程中會發,如果有仔細觀察資訊視窗可以發現下面三行
push
所帶的值很眼熟 - 然後就是
004011E5 . E8 56010000 call TraceMe.00401340
- 所以我猜測這個
call
是計算序列號的地方註:函數的返回值都是儲存在
eax
- 所以下面的
004011F3 . 85C0 test eax,eax
是比較的地方
1 | 004011DB . 53 push ebx ; ebx=00000007 |
註:
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 使用笔记 (二)