軟件調試
調試事件采集
前面有說到在調試器和被調試之間會創建一個_DEBUG_OBJECT對象來進行關聯
調試事件的種類
被調試進程會把一個個的調試事件寫到_DEBUG_OBJECT中的一個成員鏈表中,調試器就通過它們建立的
_DEBUG_OBJECT調試對象獲取調式事件,但并不是進程的任何操作都會被寫入到調試事件當中
//
// Debug Message API Number
//
typedef enum _DBGKM_APINUMBER
{DbgKmExceptionApi = 0, // 異常DbgKmCreateThreadApi = 1, // 創建線程DbgKmCreateProcessApi = 2, // 創建進程DbgKmExitThreadApi = 3, // 線程退出DbgKmExitProcessApi = 4, // 進程退出DbgKmLoadDllApi = 5, // 加載DLLDbgKmUnloadDllApi = 6, // 卸載DLLDbgKmErrorReportApi = 7, // 已廢棄DbgKmMaxApiNumber = 8, // 最大值
} DBGKM_APINUMBER;
那就有一個問題,是誰在為我們添加調試事件呢?
調試事件采集函數
- 創建進程、線程必經之路:
- PspUserThreadStartup
- DbgkCreateThread ->
DbgkpSendApiMessage()
- DbgkCreateThread ->
- PspUserThreadStartup
- 退出線程、進程必經之路:
- PspExitThread
- DbgkExitThread/DbgkExitProcess ->
DbgkpSendApiMessage()
- DbgkExitThread/DbgkExitProcess ->
- PspExitThread
- 加載模塊的必經之路:
- NtMapViewOfSection
- DbgkMapViewOfSection ->
DbgkpSendApiMessage()
- DbgkMapViewOfSection ->
- NtMapViewOfSection
- 卸載模塊的必經之路:
- NtUnMapViewOfSection
- DbgkUnMapViewOfSection ->
DbgkpSendApiMessage()
- DbgkUnMapViewOfSection ->
- NtUnMapViewOfSection
- 異常的必經之路:
- KiDispatchException
- DbgkForwardException ->
DbgkpSendApiMessage()
- DbgkForwardException ->
- KiDispatchException
答案就是在你加載DLL,卸載DLL,創建進程結束進程的必經之路上調用這個方法
DbgkpSendApiMessage(x,x)參數說明
第一個參數:消息結構,每種消息都有自己的消息結構共有7種類型
第二個參數:要不要把本進程內除了自己之外的其他線程掛起