您可能之前看到過我寫的類似文章,為什么還要重復撰寫呢?只是想更好地幫助初學者了解病毒逆向分析和系統安全,更加成體系且不破壞之前的系列,因此,我重新開設了這個專欄,準備系統整理和深入學習系統安全、逆向分析和惡意代碼檢測,“系統安全”系列文章會更加聚焦,更加系統,更加深入,也是作者的慢慢成長史,換專業確實挺難的,逆向分析也是塊硬骨頭,但我也試試,看看自己未來四年究竟能將它學到什么程度,漫漫長征路,偏向虎山行,享受程序,一起加油~
作者前文介紹了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
FARPROC GetProcAddress(
HMODULE hModule, // DLL模塊句柄
LPCSTR lpProcName // 函式名
);
第一步,我們打開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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263405.html
標籤:其他
上一篇:瀏覽器插件跨域注入cookie
