X86逆向教程10:学会使用硬件断点
本節(jié)課我們將學(xué)習(xí)硬件斷點(diǎn)的使用技巧,硬件斷點(diǎn)是由硬件提供給我們的一組寄存器,我們可以對這些硬件寄存器設(shè)置相應(yīng)的值,然后讓硬件幫我們斷在需要下斷點(diǎn)的地址上面,這就是硬件斷點(diǎn),硬件斷點(diǎn)依賴于寄存器,這些寄存器有個通用的名稱,即調(diào)試寄存器,調(diào)試寄存器一共有8個分別從Dr0-Dr7。在軟件破解中硬件斷點(diǎn)常用來尋找賦值或讀取的原始位置。
硬件斷點(diǎn)并不是OD等調(diào)試器的特有功能,調(diào)試器只是把用戶的需求轉(zhuǎn)換成特定的格式,并寫入DRX寄存器組中,等待硬件返回執(zhí)行結(jié)果,由于硬件斷點(diǎn)是由CPU直接提供硬件級別的支持,所以硬件斷點(diǎn)的效率是所有斷點(diǎn)中最高的。
在OD等調(diào)試器中,除了硬件斷點(diǎn)之外,還有個內(nèi)存斷點(diǎn),內(nèi)存斷點(diǎn)通過修改內(nèi)存頁的屬性并捕獲異常來間接暫停被調(diào)試的程序運(yùn)行,內(nèi)存斷點(diǎn)的效率大大低于硬件斷點(diǎn),但內(nèi)存斷點(diǎn)的自由性大于硬件斷點(diǎn),通常情況下能用硬件斷點(diǎn)則不要使用內(nèi)存斷點(diǎn),有時候容易卡成狗。
------------------------------------------------------------
本章難度:★★★★☆☆☆☆☆☆
課程課件:CM_10.zip
------------------------------------------------------------
1.老樣子在進(jìn)行破解實戰(zhàn)之前,我們先來看一個CM小程序,先了解一下硬件斷點(diǎn)的使用技巧,如下OD直接載入這個CM程序然后運(yùn)行。
?
2.我們直接按下【Ctrl + B】,輸入按鈕事件特征碼【FF 55 FC 5F 5E】,然后在CALL的位置下斷點(diǎn)。
?
3.回到CM程序,點(diǎn)擊【測試硬件寫入斷點(diǎn)】,OD斷下后按下【F7】進(jìn)入到CALL的內(nèi)部,也就是按鈕的按鈕事件。
上圖有CMP指令,該指令取出【4A25F0】中的數(shù)值,和0做了一次比較,從而影響了JNZ跳轉(zhuǎn),我們接下來就是找到是誰向這個內(nèi)存地址寫入的數(shù)據(jù)。
4.直接在數(shù)據(jù)窗口,按下【Ctrl +G】,輸入內(nèi)存地址【4A25F0】,會發(fā)現(xiàn)其中的數(shù)值是0。
?
5.選擇數(shù)據(jù)窗口中的第一個DWORD數(shù)據(jù),然后選擇【斷點(diǎn)】,【硬件寫入】,【DWORD】,這里的DWORD是由CMP指令決定的,此處【CMP DWORD PTR】所以我們需要下一個DWORD斷點(diǎn)。
?
6.下完斷點(diǎn)后重新載入程序,然后運(yùn)行程序會直接斷下,你會發(fā)現(xiàn)一條【MOV DWORD 】這樣的賦值語句,沒錯這就是源頭。
?
實戰(zhàn):破解 HofoSetup 2019
免責(zé)聲明:該教程僅用于技術(shù)交流,并無任何商業(yè)目的,您不得將下述內(nèi)容用于商業(yè)或者非法用途,否則后果自負(fù),如果您喜歡該程序,請支持正版軟件,購買注冊?,得到更好的正版服務(wù),如有侵權(quán)請郵件聯(lián)系作者!
1.首先OD載入然后直接,【F9】運(yùn)行程序,并記下關(guān)鍵字符串,這里我們記下【vip】這段。
?
2.直接在反匯編窗口,右鍵選擇中文搜索,智能搜索字符串,并查找?guī)в衯ip的字符串,這里我找到了如下字符串。
?
3.這里我們看到了關(guān)鍵的比較和關(guān)鍵的跳轉(zhuǎn),但并沒有發(fā)現(xiàn)關(guān)鍵CALL,這里的CMP指令的意思是,取出[eax]寄存器地址里面的一個字節(jié)和0進(jìn)行比較并影響關(guān)鍵的跳轉(zhuǎn),接下來我們將查找是誰向這個內(nèi)存地址中寫入了數(shù)據(jù),也就是說我們要找到誰給[eax]寄存器賦值找它的源頭。
?
4.直接在反匯編窗口中選擇,數(shù)據(jù)窗口中跟隨,選擇內(nèi)存地址,會發(fā)現(xiàn)數(shù)據(jù)窗口地址變了。
?
5.直接在數(shù)據(jù)窗口中右鍵選擇,斷點(diǎn),硬件寫入斷點(diǎn),字節(jié)型。
?
6.此時,取消其他的所有內(nèi)存斷點(diǎn),只保留一個硬件寫入斷點(diǎn),然后我們重新載入程序并運(yùn)行起來。
?
7.運(yùn)行后會斷下多次,我們不用管直接再次運(yùn)行,然后回到程序中,點(diǎn)擊【添加自定義快捷方式】,此時OD會直接斷下。
?
8.下方會發(fā)現(xiàn)OD自動斷在了【0042128A】的位置上,也就是說是上一條命令寫入的,我們從下向上分析一下代碼。
【mov byte ptr [ebx+4D8],al ?】將al中的數(shù)寫入到,[ebx+4D8]的地址中去,0011F700+4D8=0011FBD8剛好是我們下硬件斷點(diǎn)的地址處。
【setne al】 這條指令很有意思,經(jīng)過我的測試,當(dāng)al中的數(shù)值不為0時直接返回al=1,如果為零則al就等于0,此處al只會從【1,0】中取值。
【CALL CNsCode::CheckCode】 這一段應(yīng)該就是驗證我們是否為合法用戶的關(guān)鍵CALL了,內(nèi)部是計算的核心代碼。
?
9.我們就直接跟在CALL的位置下一個斷點(diǎn),并刪除硬件斷點(diǎn)吧,找到了更近的我們就刪除遠(yuǎn)的,然后點(diǎn)擊運(yùn)行,讓程序運(yùn)行起來。
?
10.回到程序,再次點(diǎn)擊【添加自定義快捷方式】按鈕,程序會斷在剛才的CALL處,我們直接【F7】跟進(jìn)去看看,嗯!果然是核心CALL,看下方這么多處調(diào)用了這個CALL來完成用戶身份的驗證。
?
11.此時我們直接到CALL的斷尾,看返回值返回了多少,直接單步【F8】,或者按下【Ctrl + F9】執(zhí)行到返回,這里我們暫時不分析注冊算法。
?
12.好了,回到CALL的斷首,然后寫入以下匯編代碼,直接讓其返回1。
?
13.直接點(diǎn)擊OD的運(yùn)行按鈕,讓程序跑起來,然后點(diǎn)擊箭頭指向的圖標(biāo),選擇【注冊VIP用戶按鈕】,程序提示完成了注冊。
?
寫教程不容易,轉(zhuǎn)載請加出處,您添加出處,是我創(chuàng)作的動力!
轉(zhuǎn)載于:https://www.cnblogs.com/LyShark/p/11181812.html
總結(jié)
以上是生活随笔為你收集整理的X86逆向教程10:学会使用硬件断点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker查看命令帮助手册
- 下一篇: docker显示镜像的摘要信息