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