[系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点
您可能之前看到過我寫的類似文章,為什么還要重復(fù)撰寫呢?只是想更好地幫助初學(xué)者了解病毒逆向分析和系統(tǒng)安全,更加成體系且不破壞之前的系列。因此,我重新開設(shè)了這個(gè)專欄,準(zhǔn)備系統(tǒng)整理和深入學(xué)習(xí)系統(tǒng)安全、逆向分析和惡意代碼檢測(cè),“系統(tǒng)安全”系列文章會(huì)更加聚焦,更加系統(tǒng),更加深入,也是作者的慢慢成長(zhǎng)史。換專業(yè)確實(shí)挺難的,逆向分析也是塊硬骨頭,但我也試試,看看自己未來四年究竟能將它學(xué)到什么程度,漫漫長(zhǎng)征路,偏向虎山行。享受過程,一起加油~
作者前文介紹了OllyDbg動(dòng)態(tài)調(diào)試工具的基本用法,包括界面介紹、常用快捷鍵和TraceMe案例分析。這篇文章將講解逆向分析之OllyDbg動(dòng)態(tài)調(diào)試工具,包括INT3斷點(diǎn)、反調(diào)試、硬件斷點(diǎn)和內(nèi)存斷點(diǎn)。 這些基礎(chǔ)性知識(shí)不僅和系統(tǒng)安全相關(guān),同樣與我們身邊常用的軟件、文檔、操作系統(tǒng)緊密聯(lián)系,希望這些知識(shí)對(duì)您有所幫助,更希望大家提高安全意識(shí),安全保障任重道遠(yuǎn)。本文參考了B站yxfzedu、安全網(wǎng)站和參考文獻(xiàn)中的文章,并結(jié)合自己的經(jīng)驗(yàn)和實(shí)踐進(jìn)行撰寫,在此感謝這些大佬們。
文章目錄
- 一.常用斷點(diǎn)之INT3斷點(diǎn)
- 1.查看INT3斷點(diǎn)
- 2.INT3原理
- 3.INT3例子
- 二.INT3斷點(diǎn)的反調(diào)試與反反調(diào)試
- 三.常用斷點(diǎn)之硬件斷點(diǎn)原理解析
- 四.常用斷點(diǎn)之內(nèi)存斷點(diǎn)原理解析
- 五.總結(jié)
作者的github資源:
軟件安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
逆向分析:https://github.com/eastmountyxz/Reverse-Analysis-Case
文章目錄
- 一.常用斷點(diǎn)之INT3斷點(diǎn)
- 1.查看INT3斷點(diǎn)
- 2.INT3原理
- 3.INT3例子
- 二.INT3斷點(diǎn)的反調(diào)試與反反調(diào)試
- 三.常用斷點(diǎn)之硬件斷點(diǎn)原理解析
- 四.常用斷點(diǎn)之內(nèi)存斷點(diǎn)原理解析
- 五.總結(jié)
從2019年7月開始,我來到了一個(gè)陌生的專業(yè)——網(wǎng)絡(luò)空間安全。初入安全領(lǐng)域,是非常痛苦和難受的,要學(xué)的東西太多、涉及面太廣,但好在自己通過分享100篇“網(wǎng)絡(luò)安全自學(xué)”系列文章,艱難前行著。感恩這一年相識(shí)、相知、相趣的安全大佬和朋友們,如果寫得不好或不足之處,還請(qǐng)大家海涵!
接下來我將開啟新的安全系列,叫“系統(tǒng)安全”,也是免費(fèi)的100篇文章,作者將更加深入的去研究惡意樣本分析、逆向分析、內(nèi)網(wǎng)滲透、網(wǎng)絡(luò)攻防實(shí)戰(zhàn)等,也將通過在線筆記和實(shí)踐操作的形式分享與博友們學(xué)習(xí),希望能與您一起進(jìn)步,加油~
- 推薦前文:網(wǎng)絡(luò)安全自學(xué)篇系列-100篇
作者的github資源:
- 逆向分析:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
- 網(wǎng)絡(luò)安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study
前文分析:
- [系統(tǒng)安全] 一.什么是逆向分析、逆向分析基礎(chǔ)及經(jīng)典掃雷游戲逆向
- [系統(tǒng)安全] 二.如何學(xué)好逆向分析及呂布傳游戲逆向案例
- [系統(tǒng)安全] 三.IDA Pro反匯編工具初識(shí)及逆向工程解密實(shí)戰(zhàn)
- [系統(tǒng)安全] 四.OllyDbg動(dòng)態(tài)分析工具基礎(chǔ)用法及Crakeme逆向
- [系統(tǒng)安全] 五.OllyDbg和Cheat Engine工具逆向分析植物大戰(zhàn)僵尸游戲
- [系統(tǒng)安全] 六.逆向分析之條件語句和循環(huán)語句源碼還原及流程控制
- [系統(tǒng)安全] 七.逆向分析之PE病毒原理、C++實(shí)現(xiàn)文件加解密及OllyDbg逆向
- [系統(tǒng)安全] 八.Windows漏洞利用之CVE-2019-0708復(fù)現(xiàn)及藍(lán)屏攻擊
- [系統(tǒng)安全] 九.Windows漏洞利用之MS08-067遠(yuǎn)程代碼執(zhí)行漏洞復(fù)現(xiàn)及深度提權(quán)
- [系統(tǒng)安全] 十.Windows漏洞利用之SMBv3服務(wù)遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2020-0796)復(fù)現(xiàn)
- [系統(tǒng)安全] 十一.那些年的熊貓燒香及PE病毒行為機(jī)理分析
- [系統(tǒng)安全] 十二.熊貓燒香病毒IDA和OD逆向分析(上)病毒初始化
- [系統(tǒng)安全] 十三.熊貓燒香病毒IDA和OD逆向分析(中)病毒釋放機(jī)理
- [系統(tǒng)安全] 十四.熊貓燒香病毒IDA和OD逆向分析–病毒釋放過程(下)
- [系統(tǒng)安全] 十五.Chrome瀏覽器保留密碼功能滲透解析、藍(lán)屏漏洞及某音樂軟件漏洞復(fù)現(xiàn)
- [系統(tǒng)安全] 十六.PE文件逆向基礎(chǔ)知識(shí)(PE解析、PE編輯工具和PE修改)
- [系統(tǒng)安全] 十七.Windows PE病毒概念、分類及感染方式詳解
- [系統(tǒng)安全] 十八.病毒攻防機(jī)理及WinRAR惡意劫持漏洞(腳本病毒、自啟動(dòng)、定時(shí)關(guān)機(jī)、藍(lán)屏攻擊)
- [系統(tǒng)安全] 十九.宏病毒之入門基礎(chǔ)、防御措施、自發(fā)郵件及APT28宏樣本分析
- [系統(tǒng)安全] 二十.PE數(shù)字簽名之(上)什么是數(shù)字簽名及Signtool簽名工具詳解
- [系統(tǒng)安全] 二十一.PE數(shù)字簽名之(中)Signcode、PEView、010Editor、Asn1View工具用法
- [系統(tǒng)安全] 二十二.PE數(shù)字簽名之(下)微軟證書漏洞CVE-2020-0601復(fù)現(xiàn)及Windows驗(yàn)證機(jī)制分析
- [系統(tǒng)安全] 二十三.逆向分析之OllyDbg動(dòng)態(tài)調(diào)試復(fù)習(xí)及TraceMe案例分析
- [系統(tǒng)安全] 二十四.逆向分析之OllyDbg調(diào)試INT3斷點(diǎn)、反調(diào)試、硬件斷點(diǎn)與內(nèi)存斷點(diǎn)
聲明:本人堅(jiān)決反對(duì)利用教學(xué)方法進(jìn)行犯罪的行為,一切犯罪行為必將受到嚴(yán)懲,綠色網(wǎng)絡(luò)需要我們共同維護(hù),更推薦大家了解它們背后的原理,更好地進(jìn)行防護(hù)。該樣本不會(huì)分享給大家,分析工具會(huì)分享。(參考文獻(xiàn)見后)
一.常用斷點(diǎn)之INT3斷點(diǎn)
1.查看INT3斷點(diǎn)
INT3斷點(diǎn)對(duì)應(yīng)OD中的F2斷點(diǎn),有時(shí)也稱為CC斷點(diǎn)。為什么叫CC斷點(diǎn)呢?因?yàn)檗D(zhuǎn)換成硬編碼之后就是CC,我們來查看CC斷點(diǎn)。
首先,我們用OD打開程序TraceMe.exe
打開之后會(huì)自動(dòng)定位至004013A0,接著再下一行增加斷點(diǎn)(按F2),即INT3斷點(diǎn)。
但OD中并沒有顯示CC,我們打開Cheat Engine軟件。
然后在OD按下F9運(yùn)行,彈出如下圖對(duì)話框。
接著在CE中選擇該程序TraceMe打開。
然后點(diǎn)擊“手動(dòng)加入地址”,輸入地址“4013A1”。
接著選中數(shù)據(jù)并右鍵點(diǎn)擊“顯示未十六進(jìn)制”。
由于采用小端存儲(chǔ),故“FF6AECCC”是從右往左數(shù)的,如下圖所示。
如果我們選擇“4字節(jié)”點(diǎn)擊,然后選擇“Byte”,可以轉(zhuǎn)換成1個(gè)字節(jié),因?yàn)镃C就占用一個(gè)字節(jié),我們主要是觀察它的。
為什么OD不顯示CC呢?
其實(shí)OD是為了不破壞源代碼的完整性,默認(rèn)隱藏掉了。
2.INT3原理
接著我們分析INT3的原理。程序運(yùn)行中,OD會(huì)檢查匯編指令有沒有INT3,即機(jī)器碼有沒有CC指令。如果存在,就會(huì)引發(fā)并捕獲這個(gè)異常,程序就中斷在此處,然后OD會(huì)刪除INT3,還原原來的代碼,接著繼續(xù)運(yùn)行我們的程序。
執(zhí)行流程的原理可歸納為:
- 替換指令,換成INT3指令或CC硬編碼
- OD檢測(cè)到INT3指令之后會(huì)引發(fā)一個(gè)異常并且捕獲它,這時(shí)候程序就會(huì)中斷
- 刪除INT3指令,還原之前的指令
優(yōu)點(diǎn):
- 可以無限的下INT3斷點(diǎn)
缺點(diǎn):
- 很容易被檢測(cè)
為什么要詳細(xì)介紹斷點(diǎn)的原理呢?
只有了解每個(gè)斷點(diǎn)的原理之后,以后做爆破才知道應(yīng)該下什么樣的斷點(diǎn)合適。
3.INT3例子
接下來我們舉個(gè)INT3斷點(diǎn)的例子,使用OD打開TraceMe.exe程序,設(shè)置API斷點(diǎn)。
這里勾選“GetDlgItemTextA”函數(shù)。
接著輸入用戶名和序列號(hào),按F9運(yùn)行程序。
代碼會(huì)停在“761F4390”位置,我們接著用CE看看它是不是CC斷點(diǎn)。
接著以十六進(jìn)制顯示,并只顯示一字節(jié),發(fā)現(xiàn)的確是CC斷點(diǎn)。所以,CC斷點(diǎn)很容易被檢測(cè)出來。
二.INT3斷點(diǎn)的反調(diào)試與反反調(diào)試
我們編寫的軟件被爆破時(shí),總會(huì)被下INT3斷點(diǎn),我們能不能寫個(gè)程序防止別人下CC斷點(diǎn),從而保護(hù)我們的程序呢?這個(gè)就叫反調(diào)試,而反反調(diào)試是繞過保護(hù)過程。
- 反調(diào)試:保護(hù)這個(gè)程序
- 反反調(diào)試:爆破這個(gè)程序
基礎(chǔ)知識(shí):
- FARPROC結(jié)構(gòu)體
- GetProcAddress函數(shù)
它是一個(gè)計(jì)算機(jī)函數(shù),功能是檢索指定的動(dòng)態(tài)鏈接庫(DLL)中的輸出庫函數(shù)地址 - LoadLibrary函數(shù)
將指定的模塊加載到調(diào)用進(jìn)程的地址空間中
接著我們用VS編寫代碼講解。LoadLibrary函數(shù)會(huì)返回一個(gè)句柄,然后調(diào)用GetProcAddress函數(shù)。GetProcAddress返回值包括:
- 如果函數(shù)調(diào)用成功,返回值是DLL中的輸出函數(shù)地址
- 如果函數(shù)調(diào)用失敗,返回值是NULL。得到進(jìn)一步的錯(cuò)誤信息,調(diào)用函數(shù)GetLastError
第一步,我們打開VS編寫C++代碼。
下列代碼是獲取MessageBoxA函數(shù)的首地址,并判斷是否為CC斷點(diǎn)。
#include <iostream> #include <Windows.h> int main() {//獲取MessageBoxA的首地址FARPROC addr = GetProcAddress(LoadLibrary(L"user32.dll"), "MessageBoxA");//僅獲取首地址的第一個(gè)字節(jié)byte byteAddr = *(byte *)addr;//彈框::MessageBoxA(NULL, "內(nèi)容", "標(biāo)題", MB_OK);//判斷地址if(byteAddr == 0xCC) {//檢測(cè)到有人在調(diào)試我們的程序 退出程序printf("檢測(cè)到非法調(diào)試");}else {printf("代碼正常");}getchar(); }在VS中輸入上述代碼。
第二步,運(yùn)行前,需要簡(jiǎn)單設(shè)置。
- 設(shè)置Release
- 設(shè)置屬性
- 禁用Spectre緩解
- 設(shè)置隨機(jī)基址否
第三步,接著運(yùn)行代碼
運(yùn)行結(jié)果如下圖所示:
顯示代碼正常執(zhí)行。
第四步,使用OD調(diào)試程序
接下來我們嘗試調(diào)試這個(gè)EXE程序,用OD打開“ConsoleApplication1.exe”。
OD打開如下圖所示:
然后點(diǎn)擊“插件”->“API斷點(diǎn)設(shè)置工具”->“常用斷點(diǎn)設(shè)置”,給MessageBoxA下斷點(diǎn)。
運(yùn)行OD,斷點(diǎn)位于761E0F40位置,對(duì)應(yīng)user32.MessageBoxA。
繼續(xù)運(yùn)行代碼。
查看調(diào)試信息,發(fā)現(xiàn)檢測(cè)到非法調(diào)試,也表明我們的判斷沒有問題。
第五步,刪除斷點(diǎn)對(duì)比執(zhí)行結(jié)果
接著按下“b”刪除斷點(diǎn),繼續(xù)運(yùn)行代碼。
發(fā)現(xiàn)代碼正常運(yùn)行。
這就是一個(gè)INT3斷點(diǎn)的反調(diào)試過程。
那么,怎么進(jìn)行反反調(diào)試呢?我們又怎么下INT3斷點(diǎn)呢?
我們進(jìn)入函數(shù)之后,可以將斷點(diǎn)下到中間或尾部即可。OD重新打開程序,并找到MessageBoxA的位置。
我們?cè)谥虚g位置下斷點(diǎn),如下圖所示 761E0F45處。
接著F9運(yùn)行程序,發(fā)現(xiàn)此時(shí)輸出“代碼正常”,該斷點(diǎn)并沒有被檢測(cè)出來,這就是所謂的反反調(diào)試。
三.常用斷點(diǎn)之硬件斷點(diǎn)原理解析
硬件斷點(diǎn)和調(diào)試寄存器有關(guān),共有8個(gè)調(diào)試寄存器DR0~DR7。
- DR0~DR3: 保存斷點(diǎn)地址。由于只有4個(gè)硬件斷點(diǎn)寄存器,所以同時(shí)最多只能設(shè)置4個(gè)硬件斷點(diǎn)
- DR4~DR5: 系統(tǒng)保留
- DR6: 狀態(tài)寄存器,顯示哪個(gè)硬件調(diào)試寄存器引發(fā)的斷點(diǎn)。如果是Dr0-Dr3的話,相應(yīng)位會(huì)被置1。如果是Dr0引發(fā)的斷點(diǎn),則Dr6的第0位被置1;如果是Dr1引發(fā)的斷點(diǎn),則Dr6的第1位被置1,依次類推。因?yàn)橛布帱c(diǎn)同時(shí)只會(huì)觸發(fā)一個(gè),所以Dr6的低4位最多只有一位被置1,所以在進(jìn)入單步后,我們可以通過檢測(cè)Dr6的低4位是否有1的位,就可以判斷該單步是否是因?yàn)橛布帱c(diǎn)被斷下的。如果是硬件斷點(diǎn)被斷下的,進(jìn)而可以通過Dr6的哪一位為1來判斷是由Dr0-Dr3中的哪個(gè)斷點(diǎn)斷下的。
- DR7: 控制寄存器。設(shè)置相應(yīng)控制位,用于控制斷點(diǎn)的方式
原理:
- DR0~DR3保存我們斷點(diǎn)的地址
- DR7寄存器設(shè)置相對(duì)應(yīng)的控制位
- 程序執(zhí)行到該地址時(shí),CPU會(huì)向OD發(fā)送異常信息
- 程序會(huì)執(zhí)行中斷操作,等待用戶操作
優(yōu)點(diǎn):
- 速度快,比INT3快,因?yàn)镮NT3需要改匯編代碼,而硬件斷點(diǎn)使用寄存器
- 不容易被檢測(cè)
缺點(diǎn):
- 最多只能下4個(gè)硬件斷點(diǎn)
接著我們繼續(xù)用OD分析TraceMe.exe為例,打開之后定位至004013A0位置。
選擇004013B6位置,右鍵“斷點(diǎn)”->“硬件執(zhí)行”。
這樣就增加了一個(gè)硬件斷點(diǎn),當(dāng)CPU運(yùn)行到該地址會(huì)發(fā)送一場(chǎng)信息中斷。
如何查看硬件斷點(diǎn)呢?點(diǎn)擊“調(diào)試”->“硬件斷點(diǎn)”可以查看剛打的硬件斷點(diǎn)。
接著按下F9運(yùn)行程序,它會(huì)停在硬件斷點(diǎn)位置。
四.常用斷點(diǎn)之內(nèi)存斷點(diǎn)原理解析
在介紹內(nèi)存斷點(diǎn)之前,首先需要知道什么是內(nèi)存屬性。內(nèi)存屬性包括Read、Write、Execute的組合,即可讀、可寫、可執(zhí)行。比如VirtualProtectEx函數(shù),可以改變?cè)谔囟ㄟM(jìn)程中內(nèi)存區(qū)域的保護(hù)屬性。
內(nèi)存斷點(diǎn)就是根據(jù)內(nèi)存屬性來實(shí)現(xiàn)的,比如想對(duì)一個(gè)地址打個(gè)內(nèi)存訪問斷點(diǎn),就是把這個(gè)地址的內(nèi)存屬性改為不可訪問(不可讀寫執(zhí)行),當(dāng)程序運(yùn)行到此處時(shí),就會(huì)產(chǎn)生一個(gè)異常被OD捕獲,從而中斷程序。
原理:
- 設(shè)置完內(nèi)存斷點(diǎn)之后,它就是對(duì)這個(gè)地址賦予了不可讀、不可寫、不可執(zhí)行的屬性
- 程序運(yùn)行到這里之后,會(huì)產(chǎn)生一個(gè)異常
- OD捕獲這個(gè)異常,然后程序中斷,實(shí)現(xiàn)了一個(gè)內(nèi)存斷點(diǎn)
優(yōu)點(diǎn):
- 沒有改變匯編代碼,改變的是內(nèi)存屬性
- 游戲爆破時(shí),如果常規(guī)斷點(diǎn)沒效果,可以嘗試內(nèi)存斷點(diǎn)
接下來我們想在004013D0位置代碼增加內(nèi)存斷點(diǎn),對(duì)應(yīng)代碼:
mov dword ptr ds:[0x405528],edx該代碼就是一個(gè)寫操作,edx往ds:[0x405528]中寫入一個(gè)值。
選擇數(shù)據(jù)窗口中跟隨。
然后再數(shù)據(jù)窗口中選擇4個(gè)字節(jié),右鍵“斷點(diǎn)”->“內(nèi)存寫入”或“內(nèi)存訪問”。
然后按下F9運(yùn)行,此時(shí)斷到了此處。證明我們內(nèi)存寫入斷點(diǎn)已經(jīng)生效。
接下來補(bǔ)充內(nèi)存讀寫斷點(diǎn)和硬件讀寫斷點(diǎn)的區(qū)別。
以剛才的代碼為例,我們先刪除剛才的內(nèi)存斷點(diǎn)。
接著OD重新打開EXE程序,數(shù)據(jù)窗口跟隨到405528。
選中4字節(jié),設(shè)置其為“硬件寫入”斷點(diǎn)。
運(yùn)行代碼,此時(shí)硬件斷點(diǎn)斷在了下一行位置004013D6。
至此,內(nèi)存斷點(diǎn)和硬件斷點(diǎn)介紹完畢!
五.總結(jié)
寫到這里,這篇文章就介紹完畢,希望您喜歡~
- 常用斷點(diǎn)之INT3斷點(diǎn)
1.查看INT3斷點(diǎn)
2.INT3原理
3.INT3例子 - INT3斷點(diǎn)的反調(diào)試與反反調(diào)試
- 常用斷點(diǎn)之硬件斷點(diǎn)原理解析
- 常用斷點(diǎn)之內(nèi)存斷點(diǎn)原理解析
這篇文章中如果存在一些不足,還請(qǐng)海涵。作者作為網(wǎng)絡(luò)安全初學(xué)者的慢慢成長(zhǎng)路吧!希望未來能更透徹撰寫相關(guān)文章。同時(shí)非常感謝參考文獻(xiàn)中的安全大佬們的文章分享,感謝師傅、師兄師弟、師姐師妹們的教導(dǎo),深知自己很菜,得努力前行。
歡迎大家討論,是否覺得這系列文章幫助到您!任何建議都可以評(píng)論告知讀者,共勉。
- 逆向分析:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
- 網(wǎng)絡(luò)安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study
2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大數(shù)據(jù)分析、網(wǎng)絡(luò)空間安全、人工智能、Web滲透及攻防技術(shù)進(jìn)行講解,同時(shí)分享CCF、SCI、南核北核論文的算法實(shí)現(xiàn)。娜璋之家會(huì)更加系統(tǒng),并重構(gòu)作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學(xué)所感所做分享出來,還請(qǐng)各位多多指教,真誠(chéng)邀請(qǐng)您的關(guān)注!謝謝。
(By:Eastmount 2021-02-4 夜于武漢 http://blog.csdn.net/eastmount/ )
參考文章:
[1] 動(dòng)態(tài)調(diào)試工具之OllyDbg(OD)教程 - B站yxfzedu
[2] [逆向筆記] OD工具使用-逆向TraceMe.exe- 17bdw隨手筆記
[3]《加密與解密》段鋼等著
[4]《OllyDBG入門教程》看雪學(xué)院 - CCDebuger
[5] 160個(gè)Crackme006 - 鬼手56大佬
[6] [調(diào)試逆向] 硬件斷點(diǎn)的原理與實(shí)現(xiàn) - 52PJ VicZ
[7] https://github.com/eastmountyxz/Reverse-Analysis-Case
[8] Cheat Engine 基本用法 - thomas_blog
總結(jié)
以上是生活随笔為你收集整理的[系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [系统安全] 二十三.逆向分析之Olly
- 下一篇: [网络安全提高篇] 一〇二.Metasp