ollydbg原理分析~硬件斷點與int3

今天繼續接着上次的分析,來繼續分析OD原理,這次先分析OD最基本的功能,斷點,單步和運行到指定位置。

類似的文章前輩們已經寫了很多了,這裏只是將前輩們的思路實踐了一下,順便加入一點自己的理解和認識!

一般載入OD之後,往往大家會先下斷點,或者直接單步運行。

一般當我們着手分析一個程序的時候總是會下一個INT 3斷點,其實這個就是F2的原理

隨便載入一個程序,點一下F2,然後用ollydbg保存的時候,發現提示說是文件未被修改,其實這個也能理解,因爲我們按下F2的時候,程序還沒被運行,所以dump下來吧,但是dump需要要求程序連同f2能夠斷下,所以改一下程序:



構建一個這樣的死循環,這樣,程序在運行的時候會一直在013B2165前運行,而斷點在後,內存中斷點被記錄,所以dump下來就可以看到程序的變化

Dump下重新加載:


Int 3粗線了,原理得證明(基址加載的時候肯定會變化)

 

 

F4原理:

改一個這樣的程序


看一下調試寄存器


F4後將F4地址放在了調試寄存器裏,運行程序的時候就會中斷到那個地方

 

 

 

F8(步過)原理:

隨便寫一個程序,然後修改一下彙編,使之構成一個循環


在00F11DE8處F2斷點

在函數的時候F8步過,發現函數停在00F11DE8處,然後在調試窗口右擊查看調試寄存器,發現


關於調試寄存器,具體說明請看裝載的這篇文章,

有了對調試寄存器大致的瞭解之後,貌似我們弄懂了一些在逆向時候的問題

比如爲什麼硬件斷點只能有4個(只有4個調試寄存器)

我們發現在DR0處存放了一箇中斷地址,但是這個地址不是F2斷的地方,而是函數的下一條地址,那麼在單步的時候,我們在查看一下調試寄存器:

發現調試寄存器根本沒有變化,其實這個很好理解,因爲在沒有執行到函數之前的F8其實就是相當於F2功能

 

 

 

 

 

F7原理:步入

這個說法不一,查詢了前輩們的說法,認爲是標誌寄存器T的原因:

當TF被設置位1時,CPU進入單步模式,所謂單步模式就是CPU在每執行一步指令後都產生一個單步中斷。主要用於程序的調試。8086/8088中沒有專門用來置位和清零TF的命令,需要用其他辦法。

自己想了一個方法證明:

構造一個這樣的循環:

 

在運行到call的時候,改變T的標誌位,然後直接讓程序運行,發現程序停在開始處,得證。

 

在這和之後,在貼一段前輩們的總結:

將TF置1:程序將斷在下一條原子操作處,並將TF位清零。原子操作是指不會被線程調度機制打斷的操作;這種操作一旦開始,就一直運行倒結束,中間不會有任何 context switch (切換到另一個線程)。call指令是原子操作,它的作用是:將返回地址壓棧,並跳轉。所以,在調用call的時候,如果我們將TF置1,那麼程序將在call指令的功能完成以後(即將返回地址壓棧並跳轉)斷下來。而執行call內的語句則僅僅是call的邏輯功能(我們理解的功能),並非實際的功能(CPU理解的功能)。

 

 

 

以上差不多硬件斷點的一些原理都介紹了,驗證的方法其實就是怎麼去構造那段彙編代碼,其實這個也很好想啊,想驗證對函數的操作,步入或者步過,就要構造一個call啊,想要了解運行到斷點處和光標處,就要想着讓他跳轉啊,所以有jmp,然後之所以都構成循環,是因爲讓程序停在我們需要驗證的地方啊。

接下來會繼續分析,OD的內存斷點的原理

未完待續,大牛勿噴!

 

發佈了25 篇原創文章 · 獲贊 12 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章