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