32位邏輯位址=16位段選擇器+偏移位址
16位段選擇器=13位全域性描述符表/區域性描述符表索引+1位gdt/ldtflag+2位的訪問控制許可權
由16位得到段選擇器索引到全域性描述符表得到64位的段描述符,段描述符中包含了線性段基址
線性段基址+偏移位址(邏輯位址後半段)得到線性位址空間的乙個32位線性位址
32位線性位址=10位頁目錄索引+10位頁表索引+12位物理頁內偏移
根據頁目錄索引找到相應頁表位址,然後加上頁表偏移得到乙個實體地址空間中的乙個基位址,該物理基址加上物理頁內偏移即是邏輯位址所對映的實體地址。
比如用來存放資料的頁要設定成不可執行的,這樣可以防止緩衝區溢位等攻擊
記憶體斷點的實現方式是將你欲下斷位址所在的記憶體頁增加乙個名為page_noaccess的屬性,這個屬性會把當前記憶體頁設為禁止任何形式的訪問,如果進行訪問會觸發乙個記憶體訪問異常。在這同時,od開始捕獲目標程式中出現的這個異常,並判斷觸發這個異常的位置是否跟你下斷的位址相同,如果相同則記憶體斷點觸發,暫停被除錯程式的執行,否則放行。
補充|:
1.記憶體斷點很消耗資源,因為page_noaccess屬性一設定就是一整個記憶體頁無法訪問,那麼當程式訪問該記憶體頁中非斷點位址的內容同樣會觸發異常,這時od收到異常後需要進行特殊處理,臨時放行,非常消耗資源,甚至這使得記憶體斷點在除錯很多大型程式時慢到近乎不可用。
2.雖然記憶體斷點的效率經常很不理想,但是因為僅僅是修改了乙個記憶體屬性,所以記憶體斷點可以下數量非常多、單斷點範圍非常大。這是它的優勢。
3.只在寫入時斷下的記憶體斷點通常是將記憶體屬性設為page_execute_read,也就是不可寫來實現的。對這種屬性的記憶體進行寫操作將會觸發異常。
硬體斷點是由硬體提供給我們的除錯暫存器組,我們可以對這些硬體暫存器設定相應的值,然後讓硬體幫我們斷在需要下斷點的位址。
intel 80386以上的cpu 提供了除錯暫存器以用於軟體除錯。386和486擁有6個(另外兩個保留)除錯暫存器:dr0 ~ dr7。
dr0,dr1,dr2,dr3是用於設定硬體斷點的,由於只有4個硬體斷點暫存器,所以同時最多只能設定4個硬體斷點。產生的異常是status_single_step(單步異常)。
dr7是一些控制位,用於控制斷點的方式
位0 l0和位1 g0:用於控制dr0是全域性斷點還是區域性斷點,如果g0為1則是全域性斷點,如果l0為1則為區域性斷點。g0,l0 ~g3,l3分別用於控制dr0~dr3。
le和ge:p6 family和之後的ia32處理器都不支援這兩位。當設定時,使得處理器會檢測觸發資料斷點的精確的指令。當其中乙個被設定的時候,處理器會放慢執行速度,這樣當命令執行的時候可以通知這些資料斷點。建議在設定資料斷點時需要設定其中乙個。切換任務時le會被清除而ge不會被清除。為了相容性,intel建議使用精確斷點時把le和ge都設定為1。
len0到len3:指定除錯位址暫存器dr0到dr3對應斷點所下斷的長度。如果r/wx位為0(表示執行斷點),則lenx位也必須為0(表示1位元組),否則會產生不確定的行為。len0到len3其可能的取值如下:
(1)00 1位元組
(2)01 2位元組
(3)10 保留
(4)11 4位元組
(1) 00 只執行
(2) 01 寫入資料斷點
(3) 10 i/o埠斷點(只用於pentium+,需設定cr4的de位,de是cr4的第3位 )
(4) 11 讀或寫資料斷點
gd位:用於保護drx,如果gd位為1,則對drx的任何訪問都會導致進入1號除錯陷阱(int 1)。
補充|:
1.暫存器數量的限制導致硬體斷點最多只能同時存在4個,並且od在特定設定或者外掛程式的影響下可能內部還會占用一兩個用來輔助程式除錯,導致可用數量十分有限。
3.由於cpu的直接支援,硬體斷點的效率是非常高的,給乙個程式設定了硬體斷點,在不觸發的情況下,不會有肉眼可見的效率影響,畢竟只是寫了個暫存器而已。
原始碼:
快速找到入口點,當程式執行到如圖所示時:
此時sp指向0019ff80,此處存放的是00000011,將記憶體資料跟隨到0019ff80,並在此處設定硬體斷點,斷點型別為訪問型別:
此時檢視硬體斷點:
**程式斷在了push edx指令處,此時sp指向0x0019ff84,它的上一條指令 pop edx訪問了位址
0x0019ff80,即設下硬體斷點的地方。**
文章參考了部落格:
OD硬體斷點,OD記憶體斷點,API斷點
一.設定硬體寫入斷點 9 i0 b m a8 8 w8 u f q q r w0 s,k9 h s.2 l w1 d8 r8 j a 0 v4 o r q at r p a l y h 在指定位址進行反 彙編 g m d q e d b,a l x x 7 l h.r d t8 k1 4 follo...
硬體斷點和軟體斷點
硬體斷點和軟體斷點 在嵌入式開發 經常用到 jtag 器。jtag 器可以滿足嵌入式程式除錯的基本要求 斷點設定 單步除錯 記憶體編輯 變數 暫存器觀測等。而斷點設定是 jtag 器最基本的除錯功能。使用者需要系統在設定斷點處停下來後再進行除錯。斷點根據原理和用途不同又分為幾個不同的種類。斷點可分為...
OD筆記2 記憶體斷點與硬體斷點
精闢解釋 來自看雪論壇 記憶體訪問斷點是利用 virtualprotect 來把該記憶體位址所在的記憶體頁 大小為4096位元組 設定為不可讀 不可寫 不可執行 所以當訪問該記憶體的時候會產生乙個訪問異常 從而在異常處理函式中實現記憶體訪問斷點的操作 硬體斷點是利用 cpu自帶的除錯暫存器 dr 產...