5 記憶體斷點

2021-08-30 19:41:39 字數 2297 閱讀 5812

原理就是對所設位址的屬性設定為不可讀不可寫屬性,這樣當這個位址被訪問或寫入就會產生異常。

//改變記憶體位址記憶體頁的屬性

bool virtualprotectex

( in handle hprocess,

// 要修改記憶體的程序控制代碼

in lpvoid lpaddress,

// 要修改記憶體的起始位址

in size_t dwsize,

// 頁區域大小

in dword flnewprotect,

// 新記憶體頁屬性

out pdword lpfloldprotect //原記憶體頁屬性 用於儲存改變前的屬性

)將被除錯程序的某記憶體屬性修改為:

page_noaccess //不可訪問 (pte.p位 = 0)

page_execute_read //可讀可執行 不可寫 (pte.p位 = 1 pte.r/w = 0)

被除錯程序

cpu訪問錯誤記憶體位址,觸發頁異常

查idt表找到對應的中斷處理函式 nt !_kitrap0e (e號中斷)

conmondispatcherceptio

kidispatchexception

dbgkfporwardexception收集並傳送除錯事件

dbgkpsendapillessage

(x, x)

1)第乙個引數:訊息結構 每種訊息都有自己的訊息結構共有7種型別.

2)第二個引數,要不要把本程序內除了自己之外的其他執行緒掛起.有些訊息需要把其他執行緒掛起,比如異常

typedef

handle

(__stdcall *pmyopenthread)

(dword dwdesiredaccess,

// access right

bool binherithandle,

// handle inheritance option

dword dwthreadid // thread identifier);

//被除錯程序控制代碼

handle hdebuggeeprocess =

null

;//被除錯執行緒控制代碼

handle hdebuggeethread;

dword dworiginalprotect;

//原頁屬性

//執行緒上下文

context context =

;bool waitforusercommand()

return bret;

}bool acces***ceptionproce

(exception_debug_info* excp)

return bret;

}bool exceptionhandler

(debug_event* pdebugevent)

return bret;

}void setmembreakpoint

(lpvoid addr)

void

call()

; dword dwcontext = dbg_continue;

//1.建立除錯程序

startupinfo startupinfo =

; process_information pinfo =

;getstartupinfo

(&startupinfo)

; wchar* _processname =

; bool bret =

createprocess

(_processname,

null

,null

,null

, true, debug_process || debug_only_this_process,

null

,null

,&startupinfo,

&pinfo);if

(bret == false)

hdebuggeeprocess = pinfo.hprocess;

//除錯迴圈

while

(nisconinue)

switch

(debugevent.dwdebugeventcode)

bret =

continuedebugevent

(debugevent.dwprocessid, debugevent.dwthreadid, dbg_continue);}

}

VS的斷點 記憶體斷點

在很多情況要,我們要知道乙個變數的改變,如果這個變數使用的地方過多,又不明確這個變數在何時又會被呼叫到.這個記憶體斷點就可以輕鬆搞定了.對於乙個全域性變數或成員變數靜態變數,只要變數還逗留在記憶體中,就可以在vs中用記憶體斷點來監控記憶體的改變時就會斷下來.咱們就以乙個簡單的程式來說明這個怎麼用吧....

記憶體斷點和硬體斷點

32位邏輯位址 16位段選擇器 偏移位址 16位段選擇器 13位全域性描述符表 區域性描述符表索引 1位gdt ldtflag 2位的訪問控制許可權 由16位得到段選擇器索引到全域性描述符表得到64位的段描述符,段描述符中包含了線性段基址 線性段基址 偏移位址 邏輯位址後半段 得到線性位址空間的乙個...

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...