OllyDbg动态调试与逆向破解TraceMe.exe
文章目錄
- 前言
- OllyDbg
- 基礎(chǔ)介紹
- 快捷操作
- TraceMe
- 調(diào)試分析
- 破解校驗(yàn)
- 總結(jié)
前言
OllyDbg 是一個(gè)新的動(dòng)態(tài)追蹤工具,是將 IDA 與 SoftICE 結(jié)合起來的產(chǎn)物,Ring3 級(jí)調(diào)試器,非常容易上手,另外由于 OllyDbg 是一個(gè)通用的 32 位匯編分析調(diào)試器且操作界面非常直觀簡(jiǎn)單,己代替 SoftICE 成為當(dāng)今最為流行的調(diào)試解密工具了。同時(shí) OllyDbg 還支持插件擴(kuò)展功能,是目前最強(qiáng)大的調(diào)試工具,OllyDbg中文官方網(wǎng)站。
OllyDbg
下面先簡(jiǎn)單介紹下 OllyDbg 這款工具的基本使用,OllyDbg下載地址(吾愛破解專用版)。
基礎(chǔ)介紹
OllyDbg 的核心窗口如下:
簡(jiǎn)單解釋一下各個(gè)窗口的功能:
| 反匯編窗口 | 顯示被調(diào)試程序的反匯編代碼 |
| 寄存器窗口 | 顯示當(dāng)前所選線程的 CPU 寄存器內(nèi)容 |
| 信息窗口 | 顯示反匯編窗口中選中的第一個(gè)命令的參數(shù)及一些跳轉(zhuǎn)目標(biāo)地址、字串等 |
| 數(shù)據(jù)窗口 | 顯示內(nèi)存或文件的內(nèi)容 |
| 堆棧窗口 | 顯示當(dāng)前線程的堆棧 |
OllyDbg 有兩個(gè)關(guān)鍵的路徑配置項(xiàng)目需要指定:
-
UDD 目錄:其作用是保存你調(diào)試的工作,比如你調(diào)試一個(gè)軟件,設(shè)置了斷點(diǎn),添加了注釋,一次沒做完,這時(shí) OllyDBG
就會(huì)把你所做的工作保存到這個(gè) UDD 目錄,以便你下次調(diào)試時(shí)可以繼續(xù)以前的工作; -
Plugin 插件目錄:OllyDBG 支持插件功能,插件的安裝也很簡(jiǎn)單,只要把下載的插件(一般是個(gè) DLL 文件)復(fù)制到 OllyDBG 安裝目錄下的 PLUGIN 目錄中就可以了,OllyDBG 啟動(dòng)時(shí)會(huì)自動(dòng)識(shí)別。
配置頁面如下圖所示:
快捷操作
OllyDbg 的核心快捷鍵:
| F2:設(shè)置斷點(diǎn) | 只要在光標(biāo)定位的位置(上圖中灰色條)按F2鍵即可,再按一次F2鍵則會(huì)刪除斷點(diǎn) |
| F8:單步步過 | 每按一次這個(gè)鍵執(zhí)行一條反匯編窗口中的一條指令,遇到 CALL 等子程序不進(jìn)入其代碼 |
| F7:單步步入 | 功能同單步步過(F8)類似,區(qū)別是遇到 CALL 等子程序時(shí)會(huì)進(jìn)入其中,進(jìn)入后首先會(huì)停留在子程序的第一條指令上 |
| F4:運(yùn)行到選定位置 | 作用就是直接運(yùn)行到光標(biāo)所在位置處暫停 |
| F9:運(yùn)行 | 按下這個(gè)鍵如果沒有設(shè)置相應(yīng)斷點(diǎn)的話,被調(diào)試的程序?qū)⒅苯娱_始運(yùn)行 |
| CTRL+F9:執(zhí)行到返回 | 此命令在執(zhí)行到一個(gè) ret (返回指令)指令時(shí)暫停,可用于快速定位到當(dāng)前 CALL 所調(diào)用函數(shù)的末端位置 |
| Alt+b:打開斷點(diǎn)編輯器 | 可查看、編輯所有下過的斷點(diǎn) |
| Alt+F9:執(zhí)行到用戶代碼 | 如果跟進(jìn)系統(tǒng)DLL提供的API函數(shù)中,此時(shí)想返回到應(yīng)用程序領(lǐng)空里,可用該快捷鍵執(zhí)行返回到用戶代碼命令 |
OllyDbg 的其他介紹和使用方法此處不再展開,有興趣可學(xué)習(xí)一下 OllyDbg 的教程(B站視頻):動(dòng)態(tài)調(diào)試工具之OllyDbg(OD)教程。
TraceMe
本文所要演示的 TraceMe.exe 程序,來自段鋼的《加密與解密》一書中的示例程序,程序下載地址。
程序的大致運(yùn)行流程如下:
下文的目的是借助 OllyDbg 對(duì)程序的邏輯進(jìn)行分析并嘗試破解序列號(hào)校驗(yàn)(類似于軟件破解)。
調(diào)試分析
1、使用 OllyDbg 打開 TraceMe.exe 程序,程序?qū)⒆詣?dòng)暫停在 WinMain() 函數(shù)入口點(diǎn)( 該函數(shù)是 32 位應(yīng)用程序開始執(zhí)行時(shí)的入口點(diǎn)),點(diǎn)擊如下按鈕或者 F9 開始運(yùn)行程序:
2、從工具欄的插件選項(xiàng)中打開 “API斷點(diǎn)設(shè)置工具”,嘗試勾選常見的的文本框數(shù)值獲取的函數(shù) “GetDlgItemTextA”,點(diǎn)擊確定后程序?qū)⒆詣?dòng)在程序中調(diào)用了該函數(shù)的位置設(shè)置斷點(diǎn):
3、接著任意輸入用戶名和序列號(hào),點(diǎn)擊 check 按鈕,發(fā)現(xiàn)程序暫停到 上述設(shè)置的調(diào)用函數(shù) “GetDlgItemTextA” 的地址處:4、按快捷鍵 Ctrl+F9,使程序快速執(zhí)行到函數(shù) “GetDlgItemTextA” 的末尾 ret 返回指令處暫停(結(jié)合堆棧窗口的信息,猜測(cè)本次函數(shù)調(diào)用僅獲取了用戶名 “11111”):
5、接著按 F8 單步步過,程序?qū)⒎祷刂猎日{(diào)用了該 “GetDlgItemTextA” 函數(shù)的程序位置處(結(jié)合匯編代碼、注釋欄目的信息可確認(rèn)確實(shí)調(diào)用了兩次獲取控件值的參數(shù)):
6、繼續(xù)按 F8 單步步過,直到 CALL 指令處,程序已經(jīng)搜集完用戶輸入的用戶名和序列號(hào),同時(shí)在該位置將兩個(gè)值壓入棧中,猜測(cè)此處正式調(diào)用了判斷序列號(hào)是否有效的核心邏輯函數(shù):
7、按 F7 單步步入,跳轉(zhuǎn)并查看被調(diào)用的函數(shù)的內(nèi)部邏輯:
F8 單步步過,運(yùn)行到該函數(shù)末尾,注意到棧中原來存儲(chǔ)用戶名的變量值發(fā)生了改變(同時(shí)請(qǐng)留意下 EAX 寄存器的值均為 0):
8、繼續(xù) F8,返回程序程序原來的運(yùn)行位置,發(fā)現(xiàn)后面即將緊接著執(zhí)行 test 判斷指令( 匯編語言的 test 指令是測(cè)試指令,用于測(cè)試某些位是否為0,執(zhí)行的是與運(yùn)算,并且會(huì)將 CF 和 OF 置 0,并且影響 SF、ZF,若測(cè)試的位均為 0,則 SF=0、ZF=1),同時(shí)緊跟著執(zhí)行了 je 判斷跳轉(zhuǎn)指令( je 指令即 Jump if Equals,在 ZF 被置位時(shí)跳轉(zhuǎn)):
繼續(xù) F8,在 je 指令的匯編代碼行處可以添加注釋“疑似關(guān)鍵跳轉(zhuǎn)”:
9、繼續(xù) F8,進(jìn)行跳轉(zhuǎn),發(fā)現(xiàn)信息窗口已經(jīng)開始提示序列號(hào)錯(cuò)誤:
10、直接 F9 放行程序,彈窗提示序列號(hào)錯(cuò)誤:
破解校驗(yàn)
通過上述調(diào)試分析,基本上可以判定 004011F5 地址處的關(guān)鍵跳轉(zhuǎn)指令將直接影響程序進(jìn)行序列號(hào)校驗(yàn)的運(yùn)行結(jié)果,下面嘗試通過 OllyDbg 對(duì)運(yùn)行結(jié)果進(jìn)行斷點(diǎn)攔截和篡改,從而繞過序列號(hào)校驗(yàn)。
1、既然 je 指令對(duì) ZF 標(biāo)志位的值進(jìn)行了判斷,可以在 je 指令處設(shè)置斷點(diǎn),重新運(yùn)行程序并輸入錯(cuò)誤的用戶名密碼,然后篡改 ZF 標(biāo)志位的值(由 1 改為 0):
2、接著放行程序,奇跡就此誕生,成功破解:
【程序篡改】
問題來了:上述通過篡改程序運(yùn)行過程中寄存器的值的方式不太方便,你總不能每次運(yùn)行該程序都打開 OllyDbg 進(jìn)行動(dòng)態(tài)調(diào)試篡改吧?那么,能不能一步到位,永久實(shí)現(xiàn)破解,每次都開該程序都能自動(dòng)繞過序列號(hào)校驗(yàn)?zāi)?#xff1f;答案當(dāng)然是可以,但是方法不是該寄存器標(biāo)志位的值,而是該程序的匯編代碼了(即 je 匯編指令),下面進(jìn)行演示。
1、雙擊 je 指令處的匯編代碼,將 je 修改為 jne 指令:
2、選中修改的這一條匯編指令(上下多選中幾條也沒關(guān)系),右鍵選擇保存到可執(zhí)行程序:
3、在彈出的新窗口繼續(xù)右鍵選擇“Save File”選項(xiàng),將修改后的程序另存為 TrcaeMeHack.exe 文件:
4、隨后運(yùn)行篡改并保存的 TrcaeMeHack.exe 文件,隨意輸入用戶名和序列號(hào),發(fā)現(xiàn)均可繞過序列號(hào)校驗(yàn):
至此,整個(gè)程序的破解工作已完成!
總結(jié)
本文介紹了 OllyDbg 調(diào)試工具的使用,并借助 TraceMe.exe 測(cè)試程序?qū)ζ溥M(jìn)行調(diào)試并成功破解其序列號(hào)校驗(yàn)。由于側(cè)重介紹 OllyDbg 的使用和對(duì)程序的猜解思路,故調(diào)試過程中沒深究與分析程序的校驗(yàn)邏輯,關(guān)于程序的逆向分析與破解腳本編寫可參見:TraceMe注冊(cè)機(jī)編寫 與 OD工具使用-逆向TraceMe.exe。
同時(shí)可以看到,OllyDbg 的動(dòng)態(tài)調(diào)試功能與作用,跟上一篇文章 GDB動(dòng)態(tài)調(diào)試攻防世界Simple-Check-100 介紹的 Linux 下的動(dòng)態(tài)調(diào)試工具 GDB 屬于異曲同工!
總結(jié)
以上是生活随笔為你收集整理的OllyDbg动态调试与逆向破解TraceMe.exe的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 送给我那八年同校的你
- 下一篇: 结构化设计(实验二)