首先看下百度上的對此函數的解釋。 設定異常捕獲函數. 當異常沒有處理的時候,系統就會調用SetUnhandledExceptionFilter所設定異常處理函數.
例如一些程式在出錯的時候,會向使用者報告說程式那出錯就是利用這個.例如QQ..
異常處理中的一部分 當發生異常時,比如記憶體訪問違例時,CPU硬體會發現此問題,併產生一個異常(你可以把它理解為中斷)
然後CPU會把代碼流程切換到異常處理服務常式。作業系統異常處理服務常式會查看當前進程是否處於調試狀態
如果時,則通知調試器發生了異常,如果不是則作業系統會查看當前線程是否安裝了的異常幀鏈(FS[0]),如果安裝了SEH(try.... catch....),則調用SEH,並根據返回結果決定是否全域展開活局部展開。如果異常鏈中所有的SEH都沒有處理此異常,而且此進程還處於調試狀態,則作業系統會再次通知調試器發生異常(二次異常)。如果還沒人處理,則叫用作業系統的預設異常處理代碼UnhandledExceptionHandler,不過作業系統允許你Hook這個函數,就是通過SetUnhandledExceptionFilter函數來設定。大部分異常通過此種方法都能捕獲,不過棧溢出、覆蓋的有可能捕獲不到。
大部分保護殼都採用異常處理技術,跳出正常的代碼指令流程,來迷惑Cracker。 說的有點粗略。 下面根據自己的理解闡述下。 SetUnhandledExceptionFilter,根據函數的名字能看出是設定異常處理函數,其實如果程式沒設定異常處理函數,程式會調用預設的處理函數處理異常,然後程式終止,一般情況下就彈出個對話方塊。 如何設定自己的異常處理函數? LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
); 參數是一個函數指標,定義如下 LONG UnhandledExceptionFilter( STRUCT _EXCEPTION_POINTERS *ExceptionInfo
); 函數類型 ExceptionInfo 是對異常描述的一個結構體 typedef struct _EXCEPTION_POINTERS { PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; 異常捕獲函數有三種傳回值 EXCEPTION_EXECUTE_HANDLER:表明異常處理完畢,程式可以退出 EXCEPTION_CONTINUE_EXECUTION:忽略此異常,從異常點繼續運行。如果此時再發生異常,還會調用異常處理函數 EXCEPTION_CONTINUE_SEARCH:異常沒被識別,交由上一級處理函數處理; SetUnhandledExceptionFilter傳回值,如果為0,表明此時沒有附加額外的處理函數(除預設的處理函數),如果非空,則存放到當前頂層的處理函數地址。 需要注意的是,SetUnhandledExceptionFilter設定的異常處理函數為全域的處理函數,是異常發生後,最後一次處理異常的機會。如果程式被調試器附加。調試器將優先於SetUnhandledExceptionFilter設定的異常處理函數處理異常。C++自訂的try{}Catch{}比較。這是C++自訂的異常處理過程,利用SEH來處理髮生的異常,如果異常發生,又出現在try{}Catch{}中 將得到優先處理。 |