异常分发(用户异常)
文章目錄
- 內容回顧:
- 用戶異常的處理流程:
- 總結
內容回顧:
異常如果發送在內核層,處理起來比較簡單,因為異常處理函數也在0環,不用切換堆棧,但是如果異常發生在3環,就意味著必須要切換堆棧,回到3環執行處理函數
切換堆棧的處理方式與用戶APC的執行過程幾乎是一樣的,惟一的區別就是執行用戶APC時返回3環后執行的函數是KiUserApcDispatcher,而異常處理時返回3環后執行的函數是KiUserExceprionDispatcher
所以,理解用戶APC的執行過程是理解3環異常處理的關鍵
用戶異常的處理流程:
VOID KiDispatchException(ExceptionRecord,ExceptionFrame,TrapFrame,PreviousMode,FirstChance)
1._KeContextFromKframes 將Trap_frame備份到context為返回3環做準備
第一步:不管用戶異常還是內核異常,先把Trap_frame(當前線程3環進入0環時,那些寄存區環境,也就是eip運行地方那些值)備份到context里(為返回3環做準備)
這個函數兩種異常(用戶異常和內核異常)的分發都歸它管,所以就存在異常處理是否需要回到三環,內核異常不用回去(內核異常處理函數在0環),用戶異常需要回去(用戶層處理函數在3環0)。
2.第二步:判斷先前模式,0是內核調用,1是用戶調用,用戶層異常呢,緊接著就是跳轉:0x4258C3
第三步:第一次執行時,肯定是第一次調用(這個函數不止執行一次),所以接著往下:
這里判斷是否啟用了內核調試器,如果有內核調試器的話,那么這個值是非零的,如果有內核調試器的話,那它就調用,把異常信息先發送給異常調試器(那么我們此處假設沒有內核異常調試器,或者內核異常調試器沒有處理)
第四步:用來判斷3環調試器(3環調試器如果不存在或者3環調試器沒有處理的話,那么接著往下走)
第五步:為回到三環做準備
一開始就把Trap_frame備份到context里,然后這里接下來就可以隨心所欲地改
最關鍵的修改,把KeUserExceptionDispatcher里面的值覆蓋到Eip,它并沒有在當前位置直接返回三環。而是讓當前程序結束執行
總結
VOID KiDispatchException(ExceptionRecord,ExceptionFrame,TrapFrame,PreviousMode,FirstChance)
CPU異常:CPU檢測到異?!?gt;查IDT執行處理函數—>CommonDispatchException------>KiDispatchException 通過IRETD返回3環
模擬異常:CxxThrowException—>RaiseException—>RtlRaiseException---->Nt!NtRaiseException—>Nt!KiRaiseException---->KiDispatchException通過系統調用返回3環
總結
以上是生活随笔為你收集整理的异常分发(用户异常)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异常分发(内核异常)
- 下一篇: SEH(结构化异常处理)