日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2024/7/19 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何对抗硬件断点--- 调试寄存器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

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