如何对抗硬件断点--- 调试寄存器
1.前言
在我跨入ollydbg的門(mén)的時(shí)候,就對(duì)ollydbg里面的各種斷點(diǎn)充滿了疑問(wèn),以前我總是不明白普通斷點(diǎn),內(nèi)存斷點(diǎn),硬件斷點(diǎn)有什么區(qū)別,他們?yōu)槭裁?有些時(shí)候不能混用,他們的原理是什么,在學(xué)習(xí)了前輩們的文章以后,終于明白了一些東西。希望這篇文章能讓你對(duì)硬件斷點(diǎn)的原理和使用有一些幫助
2.正文
--------------------------------------------------
i.硬件斷點(diǎn)的原理
在寄存器中,有這么一些寄存器,它們用于調(diào)試。人們把他們稱為調(diào)試寄存器,調(diào)試寄存器一共有8個(gè)名字分別從Dr0-Dr7。所以我們也把調(diào)試寄存器簡(jiǎn)單的稱為Drx。
對(duì)于Dr0-Dr3的四個(gè)調(diào)試寄存器,他們的作用是存放中斷的地址,例如:401000
對(duì)于Dr4,Dr5這兩個(gè)寄存器我們一般不使用他們,保留
對(duì)于Dr6,Dr7這兩個(gè)寄存器的作用是用來(lái)記錄你在Dr0-Dr3中下斷的地址的屬性,比如:對(duì)這個(gè)401000是硬件讀還是寫(xiě),或者是執(zhí)行;是對(duì)字節(jié)還是對(duì)字,或者是雙字。
好了,從這里你可能明白一些東西。
1. 為什么在OD里面只能下4個(gè)硬件斷點(diǎn)?
2. 為什么下硬件斷點(diǎn)有byte,word,dword只分?
3. 為什么下硬件斷點(diǎn)有讀,寫(xiě),執(zhí)行只分?
ii.關(guān)于F4,F8,F7,F2的區(qū)別
在ollydbug的help里面只是提到如何使用F7和F8的使用,并沒(méi)說(shuō)明他們的實(shí)現(xiàn)原理
現(xiàn)在我們來(lái)做一個(gè)實(shí)驗(yàn)
實(shí)驗(yàn)一(F4的原理)
1.隨便找一個(gè)程序,載入OD,構(gòu)造一個(gè)死循環(huán)
就象這樣:
00400154 > 90 nop //EP停在這里
00400155 90 nop
00400156 90 nop
00400157 90 nop
00400158 ^ EB FA jmp short 天2國(guó)際.<ModuleEntryPoint> //構(gòu)造一個(gè)死循環(huán)
0040015A 61 popad
0040015B 94 xchg eax,esp
2.對(duì)0040015A這一行按下F4,由于死循環(huán),程序一直運(yùn)行
3.調(diào)試器的窗口里,右鍵--查看調(diào)試寄存器
結(jié)果在Drx里面顯示:
DR0 0040015A //地址
DR1 00000000
DR2 00000000
DR3 00000000
DR6 FFFF0FF0 //斷點(diǎn)屬性
DR7 00000401
實(shí)驗(yàn)二(F8原理)
1.隨便找一個(gè)程序,載入OD,構(gòu)造一個(gè)子程序的死循環(huán)
就像這樣
00400154 t> E8 0100D03F call 4010015A //EP,停在這里
00400159 90 nop
0040015A 90 nop
0040015B 90 nop
0040015C 90 nop //對(duì)這里下F2斷點(diǎn)
0040015D C3 retn // 返回
2.按下F8,由于INT3斷點(diǎn),程序中斷在0040015C
3.調(diào)試器的窗口里,右鍵--查看調(diào)試寄存器
結(jié)果在Drx里面顯示:
DR0 00400159 //call的返回地址
DR1 00000000
DR2 00000000
DR3 00000000
DR6 FFFF4FF1 //斷點(diǎn)屬性
DR7 00000401
實(shí)驗(yàn)三(F7原理)
1.隨便找一個(gè)程序,載入OD
2.雙擊調(diào)試器的窗口里的T標(biāo)志,將TF從原來(lái)的0變成1
3.F9運(yùn)行
結(jié)果程序斷在了下面的一行
實(shí)驗(yàn)四(F2的原理)
1.用98的notepad吧,載入OD,構(gòu)造一個(gè)死循環(huán)
004010CC N> 90 nop //EP,挺在這里
004010CD 90 nop
004010CE ^ EB FC jmp short NOTEPAD.<ModuleEntryPoint> //死循環(huán)
004010D0 90 nop //在這里按下F2,普通斷點(diǎn)
004010D1 90 nop
2.按下F9,由于死循環(huán),程序一直運(yùn)行著
3.使用LordPE(不要用ollydump)將這個(gè)程序dump下來(lái)
4.重新載入OD
來(lái)看看成什么樣子了
004010CC d> $ 90 nop
004010CD . 90 nop
004010CE .^ EB FC jmp short dumped.<ModuleEntryPoint>
004010D0 CC int3 //這里變成了CC了
004010D1 90 nop
--------------------------------------------------
3.總結(jié)
從實(shí)驗(yàn)一和實(shí)驗(yàn)二我們能清楚的看到,F4是直接將該行的地址放入drx里面,F8是將下一行的地址放入到drx里面,他們都使用了調(diào)試寄存器。從實(shí)驗(yàn)三中 我們知道對(duì)于F7來(lái)說(shuō)很可能使用的是將TF置一的辦法,也就是說(shuō)當(dāng)我們按下F7的時(shí)候OD把TF置一。對(duì)于F2來(lái)說(shuō)他是將,第一個(gè)字節(jié)悄悄的修改成了 CC,雖然并沒(méi)有顯示給我看到這個(gè)是一個(gè)CC,當(dāng)我們按下F2的時(shí)候,OD還沒(méi)有運(yùn)行,只是把這個(gè)表示記錄下來(lái),當(dāng)運(yùn)行的時(shí)候他就把所有標(biāo)記的字節(jié)修改 了,盡管還是顯示原來(lái)的代碼,當(dāng)然當(dāng)他一暫停下來(lái)就又修改回來(lái)了。
上面的是實(shí)驗(yàn)中,F7的原理只是猜測(cè),還沒(méi)有很好的辦法能證明他就是使用TF,下面我繼續(xù)猜測(cè)一下內(nèi)存斷點(diǎn)的原理
1.將設(shè)置的內(nèi)存斷點(diǎn)的地址記錄下來(lái)
2.對(duì)這個(gè)地址的內(nèi)存頁(yè)面修改其屬性
如果是內(nèi)存寫(xiě)斷點(diǎn),就修改為RE(可讀,可執(zhí)行)
如果是內(nèi)存訪問(wèn)斷點(diǎn),就修改為NO ACCESS(不可訪問(wèn))
3.只要訪問(wèn)到這個(gè)頁(yè)面就會(huì)產(chǎn)生相應(yīng)的異常,然后由OD來(lái)判斷是否與記錄的斷點(diǎn)一致,從而是否中斷下來(lái)
--------------------------------------------------
4.后話
對(duì)于上面的F7和內(nèi)存斷點(diǎn)的原理,我還沒(méi)想出什么好的辦法去找出OD的原理,或許去調(diào)試一下ollydbg.exe是一個(gè)不錯(cuò)的建議。如果有哪位兄弟知道有什么好辦法,希望能告訴我。當(dāng)然也很歡迎各位和我討論。
下面一篇將討論,如何anti-hardbreakpoint。
如果轉(zhuǎn)載請(qǐng)保持文章完整,謝謝您能看完。
轉(zhuǎn)載于:https://www.cnblogs.com/milantgh/p/3861367.html
總結(jié)
以上是生活随笔為你收集整理的如何对抗硬件断点--- 调试寄存器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 将MyEclipse项目导入到Eclip
- 下一篇: oracle11g dataguard物