日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

X86逆向教程10:学会使用硬件断点

發(fā)布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 X86逆向教程10:学会使用硬件断点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本節(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。