日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异常分发(用户异常)

發布時間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异常分发(用户异常) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 內容回顧:
    • 用戶異常的處理流程:
    • 總結

內容回顧:

異常如果發送在內核層,處理起來比較簡單,因為異常處理函數也在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)

  • _KeContextFromKframes 將Trap_frame備份到context為返回3環做準備
  • 判斷先前模式 0是內核調用,1是用戶調用
  • .是否是第一次機會
  • 是否有內核調試器
  • 發送給3環調試
  • 如果3環調試器沒有處理這個異常,修正EIP為KiUserExceptionDispatcher
  • KiDispatchException函數執行結束:CPU異常與模擬異常返回地點不同
    CPU異常:CPU檢測到異?!?gt;查IDT執行處理函數—>CommonDispatchException------>KiDispatchException 通過IRETD返回3環
    模擬異常:CxxThrowException—>RaiseException—>RtlRaiseException---->Nt!NtRaiseException—>Nt!KiRaiseException---->KiDispatchException通過系統調用返回3環
  • 無論通過哪種方式,但線程再次回到3環,將執行KiUserExceptionDispatcher函數
  • 總結

    以上是生活随笔為你收集整理的异常分发(用户异常)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。