python灰帽子 筆記 一 調試器原理和設計

 計算機寄存器做用: 緩存

 8個通用寄存器:EAX EDX ECX ESI EDI EBP ESP EBX 服務器

 EAX 累加寄存器 進行運算操做與函數調用返回值 乘法和除法必須在EAX裏面進行 網絡

 EDX 數據寄存器 配合EAX使用,通用數據存儲 函數

 ECX 計數器 用於支持循環操做 反向計數(循環最好遞減) spa

 涉及數據處理的循環操做依賴於ESI(源變址寄存器,輸入數據流位置信息)EDI寄存器(目的變址寄存器,操做結果存放位置信息) 指針

 ESP 棧指針寄存器 始終指向函數棧的最頂端 調試

 EBP 基址指針寄存器 對象

 EBX 沒有特定用途的寄存器 three

 EIP 始終指向當前正在執行的指令 事件

 

棧:

C語言函數: int  my_socks(color_one,color_two,color_three)

X86彙編:

Push color_three

Push color_two

Push color_one

Push my_socks

棧結構:

對於彙編是由左至右壓棧,而後由右至左出棧,若是這時候涉及到運算的話就是在出棧的時候進行

若是my_socks函數存在局部變量,那麼局部變量就在返回地址之上,對應的ESP寄存器也往上

調試器:

調試器須要可以處理:斷點觸發、非法內存操做、由被調試程序拋出的異常


斷點分爲:軟斷點、硬件斷點、內存斷點


軟斷點的實現方式是:肯定斷點以後更改相應地址的操做指令(好比0xCC,INT3事件),中斷當前程序的執行,產生異常,調試器捕獲以後恢復斷點部分的指令,檢查EIP地址是否與以前要求對應,若是對應,獲取堆棧以及各類寄存器的數據。軟斷點有一次性和永久性的區別。

防止軟終端調試的方式:CRC校驗,若是校驗值不同,程序退出,就能遲滯或者延緩程序被破解的時間。

硬件斷點:

硬件斷點的對象是斷點數量少或者調試目標實現了相似CRC的校驗方式。使用的是CPU的調試寄存器,典型的CPU8個調試寄存器(DR0-7),DR0-3保存調試地址,DR4以及DR5保留使用,DR6爲調試狀態寄存器(斷點觸發時的事件類型),DR7爲硬件斷點的激活開關,存儲各個斷點觸發條件的信息。觸發條件以下:特定的內存地址指令被執行、寫入一個特定的內存地址、讀寫一個特定非可執行的內存地址。DR7 0-7位上的L域與G域分別對應局部和全局斷點,16-31位決定了相關調試寄存器上所設置的斷點的類型和字節長度。

硬件斷點觸發INT1事件,調試器捕獲以後能夠進行單步調試等等操做。其實是CPU每執行一條指令的時候會進行斷點檢測,因此斷點不能設置多,最大支持4個而且長度是4字節,大塊內存的斷點硬件斷點沒法實現。


內存斷點:

內存頁訪問權限:可執行、可讀、可寫、保護頁,權限能夠組合

保護頁的做用:隔離堆和棧、確保內存增加不會超出某一預約邊界、實現內存斷點機制

內存斷點調試的例子:網絡服務器的緩存內存頁調試的時候設置內存頁保護頁權限,這樣程序運行到訪問該內存的時候暫停程序,這樣就能調試程序對應的堆棧信息,這樣就能夠繞過相應的CRC校驗等等問題。

相關文章
相關標籤/搜索