SetUnhandledExceptionFilter處理未捕獲異常

 

      首先看下百度上的對此函數的解釋。

設置異常捕獲函數.

  當異常沒有處理的時候,系統就會調用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{}中 將得到優先處理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章