X86SEH分析筆記

在X86Windows中,函數經過如下步驟來參與SEH:ide

1.在自身的棧空間中分配並初始化一個EXCEPT_REGISTRATION(_RECORD)結構體。函數

2.在該EXCEPTION_REGISTRATION(_RECORD)掛入當前進程的異常鏈表。spa

當某個函數觸發異常時,系統首先經過調用KiDisaptchException來給內核調試器一個機會,若是內核調試器沒有處理該異常線程

則該機會被轉給 RtlDispatchException,這個函數就開始分發該異常。分發過程爲:調試

       從當前線程的異常鏈表頭開始遍歷,對於每個 SEH 註冊信息(即 EXCEPTION_REGISTRATION(_RECORD)),調用其 Handler。根據 Handler 的返回值作相應的後續處理:進程

               1. 返回 ExceptionContinueExecution,表示 Handler 已經修復了異常觸發點,從異常觸發點繼續執行。io

               2. 返回 ExceptionContinueSearch,表示該 Handler 沒有處理該異常,繼續遍歷異常鏈表。class

               3. Handler 沒有修復異常觸發點,可是卻能處理該異常(某個 __except 過濾代碼返回 EXCEPTION_EXECUTE_HANDLER)。這種狀況下,處理完該異常後就從異常解決代碼(__except 代碼塊)繼續執行,Handler 不會返回。遍歷

       以上是簡略的 x86 SEH 流程,其中省略了不少細節,好比展開、錯誤處理、ExceptionNestedException  ExceptionCollidedUnwind 等等。鏈表

相關文章
相關標籤/搜索