天天看點

調試器的工作原理

調試器的工作原理《黑客調試技術揭秘》  

了解調試器的工作原理  

對調試器的工作原理毫無所知就貿然地使用它是很愚蠢的。是以,在本節中,我将介紹調試器工作的基本原理和理論基礎。這可不是一個簡明易懂的論述,不過,能讓你抓住所要研究問題的主要思想。“Intel Architecture Software Developer’s Manual Volume 3: System Programming Guide”(英特爾免費分發的一本指南)的“Debugging and Performance Monitoring”一章包含了相關的技術細節。 

現有的所有調試器都可分為兩大類。第一類調試器利用處理器提供的調試工具,而第二類調試器自行仿真處理器并完全控制所調試程式的執行過程。 

程式是既不能檢測到也不能繞過高品質仿真調試器的。可是,在本書寫作時還不存在功能完備的針對奔騰處理器的仿真器,而且也不太可能會很快出現。 

但是,是否有必要開發這類仿真調試器呢?奔騰處理器提供了一系列的控制功能,它們甚至可以控制特許操作代碼!它們支援單步執行程式,捕獲位于指定位址的指令執行,并提供對指定的記憶體單元(或者輸入/輸出端口)的通路,以及任務切換等功能。 

如果标志寄存器的追蹤位被置位,那麼執行每一條機器指令後都會産生調試中斷INT 1,并将控制傳給調試器。通過分析标志寄存器,被調試的代碼能夠檢測到追蹤。是以,為了保證其操作不被發現,調試器必須識别讀取标志寄存器的指令,并通過傳回值為零的追蹤位來仿真其執行結果。 

必須注意如下的一種重要情形:在執行了修改SS寄存器的指令之後,并不會引發調試異常。調試器必須知道如何識别這種情形,并自行在下一條指令上設定斷點。否則,追蹤者就不能進入指令POP SS後面的過程(例如:PUSH SS; POP SS; CALL MySecrectProc)。并不是所有的當代調試器都具有這一功能的,是以,雖然這一點已被發現了很長時間,但這種技巧可能依然有效。 

有四個調試寄存器(即DR0~DR3),它們用于存放四個斷點的線性位址,而控制寄存器DR7包含了這四個斷點中的每一個的控制條件。當滿足該條件時,處理器産生INT 0x1異常并将控制傳給調試器。總共有四個中斷的條件:當執行指令時發生中斷,如果記憶體單元被修改則發生中斷,當讀取或者修改但不執行記憶體單元時發生中斷,以及當通路輸入/輸出端口時發生中斷。 

通過設定特定的資料位,就可以在調試寄存器被通路的任何時間引發調試異常。即使是特許執行代碼試圖讀取(或者修改)這些寄存器時,也會引發調試異常。無論被調試的代碼有怎樣的執行特權,設計精良的調試器都能夠隐藏自己的行迹而不讓被調試的代碼發現自己(雖然如果操作代碼調試自己,那麼調試器不能使用全部的四個斷點)。 

如果任務的任務狀态段(TSS)的T位被置位,那麼每當切換到該任務時,在執行該任務的第一條指令之前,都會引發調試異常。為了防止正被調試的代碼發現調試器的存在,調試器應該追蹤通路其TSS的所有操作,并把虛構的資料傳回程式。必須注意:基于性能的考慮,Windows NT并不使用TSS(或者更精确地說,在一個硬體任務的所有運作時間内,它都隻使用一個TSS),是以在這種情形中,調試可能是無效的。 

軟體斷點是惟一的一種不編寫功能完整的處理器仿真器就不能被隐藏的對象。它表示為一個位元組的代碼0xCC,放在指令之前,當出現任何企圖執行它的操作時都将引發INT 0x3異常。對于被調試的程式,計算求和校驗位就足以發現是否至少設定了一個斷點。可以使用諸如MOV,MOVS,LOAS,POP,CMP或者CMPS之類的指令來實作這一點,因為沒有一種調試器能夠追蹤和仿真全部的這類指令。 

我們強烈地建議,隻有在硬體斷點不滿足需要時,才使用軟體斷點。然而,實際上,所有的當代調試器(包括SoftIce)都預設地設定軟體斷點而不是硬體斷點。這一事實可以成功地用于保護機制。在第12章“如何防止追蹤”一節中提供了幾個例子,以說明這種機制的實作方法。

轉:http://blog.csdn.net/bysdy/article/details/2458438

繼續閱讀