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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何对抗硬件断点--- 调试寄存器

發布時間:2024/7/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何对抗硬件断点--- 调试寄存器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.前言

在我跨入ollydbg的門的時候,就對ollydbg里面的各種斷點充滿了疑問,以前我總是不明白普通斷點,內存斷點,硬件斷點有什么區別,他們為什么 有些時候不能混用,他們的原理是什么,在學習了前輩們的文章以后,終于明白了一些東西。希望這篇文章能讓你對硬件斷點的原理和使用有一些幫助

2.正文
--------------------------------------------------
i.硬件斷點的原理

在寄存器中,有這么一些寄存器,它們用于調試。人們把他們稱為調試寄存器,調試寄存器一共有8個名字分別從Dr0-Dr7。所以我們也把調試寄存器簡單的稱為Drx。

對于Dr0-Dr3的四個調試寄存器,他們的作用是存放中斷的地址,例如:401000
對于Dr4,Dr5這兩個寄存器我們一般不使用他們,保留
對于Dr6,Dr7這兩個寄存器的作用是用來記錄你在Dr0-Dr3中下斷的地址的屬性,比如:對這個401000是硬件讀還是寫,或者是執行;是對字節還是對字,或者是雙字。

好了,從這里你可能明白一些東西。

1. 為什么在OD里面只能下4個硬件斷點?
2. 為什么下硬件斷點有byte,word,dword只分?
3. 為什么下硬件斷點有讀,寫,執行只分?

ii.關于F4,F8,F7,F2的區別

在ollydbug的help里面只是提到如何使用F7和F8的使用,并沒說明他們的實現原理

現在我們來做一個實驗

實驗一(F4的原理)

1.隨便找一個程序,載入OD,構造一個死循環

就象這樣:

00400154 > 90 nop //EP停在這里
00400155 90 nop
00400156 90 nop
00400157 90 nop
00400158 ^ EB FA jmp short 天2國際.<ModuleEntryPoint> //構造一個死循環
0040015A 61 popad
0040015B 94 xchg eax,esp

2.對0040015A這一行按下F4,由于死循環,程序一直運行

3.調試器的窗口里,右鍵--查看調試寄存器

結果在Drx里面顯示:

DR0 0040015A //地址
DR1 00000000
DR2 00000000
DR3 00000000
DR6 FFFF0FF0 //斷點屬性
DR7 00000401

實驗二(F8原理)

1.隨便找一個程序,載入OD,構造一個子程序的死循環

就像這樣

00400154 t> E8 0100D03F call 4010015A //EP,停在這里
00400159 90 nop
0040015A 90 nop
0040015B 90 nop
0040015C 90 nop //對這里下F2斷點
0040015D C3 retn // 返回

2.按下F8,由于INT3斷點,程序中斷在0040015C

3.調試器的窗口里,右鍵--查看調試寄存器

結果在Drx里面顯示:

DR0 00400159 //call的返回地址
DR1 00000000
DR2 00000000
DR3 00000000
DR6 FFFF4FF1 //斷點屬性
DR7 00000401


實驗三(F7原理)

1.隨便找一個程序,載入OD

2.雙擊調試器的窗口里的T標志,將TF從原來的0變成1

3.F9運行

結果程序斷在了下面的一行

實驗四(F2的原理)

1.用98的notepad吧,載入OD,構造一個死循環

004010CC N> 90 nop //EP,挺在這里
004010CD 90 nop
004010CE ^ EB FC jmp short NOTEPAD.<ModuleEntryPoint> //死循環
004010D0 90 nop //在這里按下F2,普通斷點
004010D1 90 nop

2.按下F9,由于死循環,程序一直運行著

3.使用LordPE(不要用ollydump)將這個程序dump下來

4.重新載入OD

來看看成什么樣子了

004010CC d> $ 90 nop
004010CD . 90 nop
004010CE .^ EB FC jmp short dumped.<ModuleEntryPoint>
004010D0 CC int3 //這里變成了CC了
004010D1 90 nop

--------------------------------------------------

3.總結

從實驗一和實驗二我們能清楚的看到,F4是直接將該行的地址放入drx里面,F8是將下一行的地址放入到drx里面,他們都使用了調試寄存器。從實驗三中 我們知道對于F7來說很可能使用的是將TF置一的辦法,也就是說當我們按下F7的時候OD把TF置一。對于F2來說他是將,第一個字節悄悄的修改成了 CC,雖然并沒有顯示給我看到這個是一個CC,當我們按下F2的時候,OD還沒有運行,只是把這個表示記錄下來,當運行的時候他就把所有標記的字節修改 了,盡管還是顯示原來的代碼,當然當他一暫停下來就又修改回來了。

上面的是實驗中,F7的原理只是猜測,還沒有很好的辦法能證明他就是使用TF,下面我繼續猜測一下內存斷點的原理

1.將設置的內存斷點的地址記錄下來

2.對這個地址的內存頁面修改其屬性

如果是內存寫斷點,就修改為RE(可讀,可執行)
如果是內存訪問斷點,就修改為NO ACCESS(不可訪問)

3.只要訪問到這個頁面就會產生相應的異常,然后由OD來判斷是否與記錄的斷點一致,從而是否中斷下來

--------------------------------------------------
4.后話

對于上面的F7和內存斷點的原理,我還沒想出什么好的辦法去找出OD的原理,或許去調試一下ollydbg.exe是一個不錯的建議。如果有哪位兄弟知道有什么好辦法,希望能告訴我。當然也很歡迎各位和我討論。

下面一篇將討論,如何anti-hardbreakpoint。

如果轉載請保持文章完整,謝謝您能看完。

轉載于:https://www.cnblogs.com/milantgh/p/3861367.html

總結

以上是生活随笔為你收集整理的如何对抗硬件断点--- 调试寄存器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。