原理就是對所設位址的屬性設定為不可讀不可寫屬性,這樣當這個位址被訪問或寫入就會產生異常。
//改變記憶體位址記憶體頁的屬性
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...