通用暫存器:
暫存器可以被認為是位於cpu上的小型儲存器。cpu獲取資料的最快方式是直接訪問暫存器。在x86指令集中,乙個cpu具有8個通用暫存器:eax,edx,ecx,esi,edi,ebp,esp,ebx。每乙個都被安排了特定用途。cpu在執行某些指令時需要特點的暫存器協作以高效地完成其指令執行過程。
eax累加器,用於執行一些常見的運算操作以及用於傳遞函式呼叫的返回值。可以基於儲存在eax中的值來判斷乙個函式呼叫所執行的操作是成功還是失敗了。
edx資料暫存器。被認為是eax的延伸部分,用於協助一些複雜的運算指令如乘法、除法。edx被用於儲存這些指令的額外資料結果。edx也可以用於通用目的資料儲存,但是其最常見的用法是和eax聯合使用,協助執行更為複雜的運算。
ecx計數器。用於支援迴圈操作。儲存乙個字串或者進行計數就是典型的迴圈操作。ecx是反向計數的。(彙編**中計數都是反向進行的)
在x86組合語言中,涉及資料處理的迴圈操作依賴於esi, edi。esi為源變址暫存器,儲存輸入流的位置資訊。edi為目的變址暫存器,指向相關資料操作結果的存放的位置。可以簡記esi「讀」,edi"寫」。
esp和ebp分別被稱為棧指標和基址指標。這些暫存器用於控制函式呼叫和相關的棧操作。當乙個函式被呼叫時,呼叫引數連同函式的返回位址將先後被壓入函式棧中。esp始終指向函式棧的最頂端(esp指向了函式的返回位址),ebp暫存器用於指向函式棧的底端。某些情況下,編譯器為了指令優化目的可能會避免將ebp暫存器用作棧幀指標。此時,ebp可以像其他通用暫存器一樣另作他用。
ebx暫存器是唯一乙個沒有被指定特殊用途的暫存器,可以作為額外的儲存單元來使用。
eip暫存器始終指向當前正在執行的命令。當cpu穿行於二進位制**中時,eip暫存器中的值隨之更新以實時反映當前**所執行的位置。
乙個偵錯程式應當能夠讀取和修改這些暫存器的內容,每個作業系統都會提供一組介面使偵錯程式能夠與cpu進行互動,以獲取或修改暫存器中的值。
棧是一種非常重要的資料結構。棧中儲存著有關函式如何被呼叫的資訊,包括函式所接收的引數以及該函式在執行結束後該如何返回的相關資訊。棧是乙個先進後出的資料結構,引數在函式呼叫前入棧並在函式結束呼叫後出棧。esp暫存器用於記錄當前棧幀的頂部,而ebp暫存器用於記錄當前棧幀的底部。棧是由記憶體高位址向記憶體低位址的方向增長的。
棧是二進位制**中實現函式呼叫的基石。
根據棧幀的內容與變化情況,偵錯程式能夠實時地跟蹤函式呼叫情況,記錄下程式「奔潰」瞬間的棧上資訊,並最終捕獲基於棧型別的溢位事件。
偵錯程式內部實際上是乙個無限迴圈,迴圈每執行一次,偵錯程式就會使自己進入「阻塞」狀態,以等待除錯事件的發生。
乙個偵錯程式必須捕獲以下幾種常見的除錯事件:斷點觸發,非法記憶體操作(也稱為非法訪問或者段違規),由被除錯程式丟擲的異常
偵錯程式一般會提供三種最基本型別的斷點:軟斷點、硬體斷點和記憶體斷點。
軟斷點能夠使目標程序執行到位於某特定位置的指令時暫停執行。軟斷點實質上只是乙個單位元組長的指令,該指令可以使被除錯的目標程序暫停執行並將控制器交給偵錯程式的異常處理例程。
彙編指令是cpu可以識別和執行的指令的一種高階表現形式,稱之為助記符。cpu並不直接識別這種形式的指令,它首先被轉換為「操作碼」(opcode),這才是cpu真正可以識別和執行的機器語言。
硬體斷點適用於:少量斷點即可滿足除錯任務,湖綜合除錯目標實現了類似crc校驗的反除錯機制。這種型別的斷點的設定是通過使用位於cpu上的一組特殊的暫存器來實現的,我們稱其為除錯暫存器。乙個典型的cpu有8個除錯暫存器(暫存器dr0到dr7)分別用於設定和管理硬體斷點。dr0到dr3用於儲存所設硬體斷點的記憶體位址,即意味著任何時刻最多只能使用4個硬體斷點,暫存器dr4和dr5保留使用。暫存器dr6稱為除錯狀態暫存器,記錄了上一次斷點觸發所產生的除錯事件型別資訊。dr7實質上是硬體斷點的啟用開關,同時還儲存著各個斷點的觸發條件資訊。通過設定dr7暫存器特定的標記位,你可以為斷點設定以下幾種觸發條件:當位於乙個特定記憶體位址上的指令被執行時觸發斷點,當資料被寫入乙個特定記憶體位址時觸發斷點,當資料被讀出或寫入(不包括執行)乙個特定非可執行記憶體位址時觸發斷點。
軟斷點使用int3軟中斷事件,硬體斷點使用1號中斷(int1),int1事件被用於硬體斷點和單步事件。
硬體斷點的限制:1.在任意時刻最多只能設定4個斷點2.最多只能對4個位元組長的資料設定斷點。
記憶體斷點本質上不是真正的斷點。當設定記憶體斷點時,偵錯程式實質上是改變乙個記憶體區域或乙個記憶體頁的訪問許可權。記憶體頁是作業系統可以一次處理的最小記憶體塊。
幾個不同的記憶體頁訪問許可權的例子:
頁可執行,頁可讀,頁可寫,保護頁
保護頁:對保護頁的任何型別的訪問將導致一次性異常,之後這個記憶體頁會恢復到之前的狀態。
大多數作業系統允許組合不同的訪問許可權。如,可以將某個記憶體頁設定為讀寫許可權,而將另乙個記憶體頁設定為讀和執行許可權。
我們最感興趣的記憶體頁訪問許可權是保護頁。保護頁可以用於隔離堆和棧,或者用於確保乙個記憶體塊的增長不會超出某一預定邊界。保護頁特性可以用來幫組我們實現記憶體斷點機制,利用該特性,當程序訪問乙個特定區域的內容時,我們可以讓程序暫停執行。
Python灰帽子筆記一
動態鏈結庫本身是一些經過編譯的二進位制檔案,之在執行時才會被連線進主程序。在windows下這些二進位制檔案被稱為動態鏈結庫 dll 而在linux下這些庫檔案被稱為共享物件 so,shared object 無論哪種平台,這些二進位制檔案都是通過匯出函式名稱的方式來呈現它們所包含的函式。這些由鏈結...
灰帽子python 讀書筆記 1
交上去坐等答辯畢業,於是閒來看看這本書。書裡的 用python 2.5 win32系統,我手頭的是python3.4 win64系統,所以會有點不一樣,就當做是讀後實踐的考驗了。在這裡記錄一下遇到的問題,也方便後來參考吧。廢話不多說,第一章,匯入ctypes並呼叫printf。書中 from cty...
灰帽子Python 學習記錄 5
waitfordebugevent 這個函式是等待除錯事件,每次捕捉到的時候就返回乙個debug event 然後同樣用notepad 做實驗,記錄每次的eventcode enter pid 75160 openprocess successful,handle 504 event code 3 ...