註冊自訂的異常處理函數
2011-9-11
SetUnhandledExceptionFilter()函數來註冊一個自己的未處理異常過濾函數,下面是一個code執行個體
/*
Demonstrates how to use SEH so that unhandled exception filter
can trap unhandled instructions.
*/
#include <windows.h>
#include <stdio.h>
LONG WINAPI MyUnFilter (struct _EXCEPTION_POINTERS *lpExceptionInfo);
void main (void)
{
LPBYTE lpBuff = NULL;
// 註冊自己的異常處理函數
SetUnhandledExceptionFilter (MyUnFilter);
*lpBuff = 54;
}
// 異常處理函數,可以自己實現所需的功能
LONG WINAPI MyUnFilter (struct _EXCEPTION_POINTERS *lpExceptionInfo)
{
static int s_SigCount = 0;
DWORD dwExceptCode = lpExceptionInfo -> ExceptionRecord ->
ExceptionCode;
LONG lResult;
if (dwExceptCode == EXCEPTION_ACCESS_VIOLATION)
{
printf ("access violation caught by MyUnFilter\n");
++s_SigCount;
// test case to keep this from going on forever (since we're not
// fixing the AV)
if (s_SigCount < 5)
lResult = EXCEPTION_CONTINUE_EXECUTION;
else
lResult = EXCEPTION_EXECUTE_HANDLER;
}
else
lResult = EXCEPTION_CONTINUE_SEARCH;
return lResult;
}
暫時就先不考慮這個頂層過濾函數,從這個樣本看,只能在進程內實現註冊自己的異常處理函數,不清楚如何能夠實現進程之間或是系統級實現註冊自己的異常處理函數。當然可以通過修改註冊表來實現定義自己使用的JIT(Just-In-Time Debugging,緊急調試)調試器,關於JIT調試器的配置資訊在註冊表:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug. 可以自己編寫JIT程式,然後修改AeDbug鍵下的Debugger選項設定為:<路徑>\OwnJIT.exe
–p %ld –e %ld. 後面的參數UnhandledExceptionFilter為啟動JIT而設定的。-p後的是發生錯誤的進程ID,-e後面的是事件的控制代碼,這些參數是通過UnhandledExceptionHandl傳遞過來的。
如果使用這種方式進行潛入或破壞的話,馬上就會被發現,因為註冊表被修改是一眼就能發現的。