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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows异常学习笔记(二)—— 内核异常处理流程用户异常的分发

發布時間:2025/3/21 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows异常学习笔记(二)—— 内核异常处理流程用户异常的分发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Windows異常學習筆記(二)—— 內核異常處理流程&用戶異常分發

    • 用戶層與內核層異常
    • 內核異常
      • 分析 KiDispatchException
      • 分析 RtlDispatchException
      • _EXCEPTION_REGISTRATION_RECORD
    • 用戶異常的分發
      • 用戶異常
      • 分析 KiDispatchException
      • 總結:用戶異常處理流程

用戶層與內核層異常

描述

  • 異常可以發生在用戶空間,也可以發生在內核空間
  • 無論是CPU異常還是模擬異常,是用戶層異常還是內核異常,都要通過 KiDispatchException 函數進行分發,理解這個函數是學好異常的關鍵
  • 內核異常

    分析 KiDispatchException

    聲明:

    VOID KiDispatchException(ExceptionRecord,ExceptionFrame,TrapFrame,PreviousMode,FirstChance);

    處理邏輯

  • 調用 _KeContextFromKframes,由于操作系統不知道分發的異常到底是3環的異常還是0環的異常,如果是3環的異常,進0環前的環境會被備份到Trap_Frame中,如果要在中途回到3環的話,就需要將 Trap_frame 備份到 context,為返回3環做準備
  • 判斷先前模式,0是內核調用,1是用戶層調用,此時能夠知道要分發的異常來自哪里。
  • 是否是第一次調用
  • 是否有內核調試器
  • 如果沒有或者內核調試器不處理,調用RtlDispatchException,尋找異常處理函數
  • 如果RtlDispatchException返回FALSE,也就是0
  • 再次判斷是否有內核調試器,有就調用,沒有會直接藍屏


  • 分析 RtlDispatchException

    作用

  • 遍歷異常鏈表,調用異常處理函數,如果異常被正確處理了,該函數返回
  • 如果當前異常處理函數不能處理該異常,那么調用下一個,以此類推
  • 如果到最好也沒有人處理這個異常,返回0
  • 反匯編


    可以發現,RtlDispatchException 調用了 RtlpGetRegistrationHead,RtlpGetRegistrationHead的唯一作用就是獲取fs寄存器的值給eax
    當程序位于0環是,FS寄存器指向KPCR,而KPCR的第一個成員又指向_EXCEPTION_REGISTRATION_RECORD這樣一個結構體

    _EXCEPTION_REGISTRATION_RECORD

    聲明

    typedef struct _EXCEPTION_REGISTRATION_RECORD {struct _EXCEPTION_REGISTRATION_RECORD *Next;PEXCEPTION_ROUTINE Handler; } EXCEPTION_REGISTRATION_RECORD;

    描述

  • _EXCEPTION_REGISTRATION_RECORD位于當前線程的堆棧中
  • Next指向下一個結構體,Handler指向異常處理函數,是一個鏈表結構
  • 當調用RtlDispatchException時,按順序執行異常處理函數,若其中一個異常處理函數返回結果為真,就不再繼續向下執行
  • 若執行完所有異常處理函數后,異常仍然沒有被處理,那么就返回FALSE
  • 用戶異常的分發

    描述

  • 異常如果發生在內核層,處理起來比較簡單,因為異常處理函數也在0環,不用切換堆棧,但是如果異常發生在3環,就意味著必須要切換堆棧,回到3環執行處理函數

  • 切換堆棧的處理方式與用戶APC的執行過程幾乎是一樣的,惟一的區別就是執行用戶APC時返回3環后執行的函數是KiUserApcDispatcher,而異常處理時返回3環后執行的函數是KiUserExceptionDispatcher

  • 理解用戶APC的執行過程是理解3環異常處理的關鍵

  • 用戶異常

    描述:當異常發生時,無論是CPU異常還是模擬異常,最終在0環都要通過一個函數進行分發處理,這個函數就是KiDispatchException

    VOID KiDispatchException(ExceptionRecord,ExceptionFrame,TrapFrame,PreviousMode,FirstChance);

    注意:需先掌握用戶APC執行過程

    分析 KiDispatchException

  • Trap_frame被分到context為返回3環做準備,因為目前不確定是從0環進來還是從3環進來
  • 判斷先前模式,0是內核調用,1是用戶層調用

    3. 從loc_42590B向下分析,是在為TRAP_FRAME結構體賦值,準備結束

  • 總結:用戶異常處理流程

  • _KeContextFromKframes將Trap_frame被分到context為返回3環做準備
  • 判斷席安全模式,0是內核調用,1是用戶層調用
  • 是否都是第一次機會
  • 是否有內核調試器
  • 發送給3環調試
  • 如果3環調試器沒有處理這個異常,修正EIP為KiUserExceptionDispatcher
  • KiUserExceptionDispatcher函數執行結束:CPU異常與模擬異常返回地點不同CPU異常:CPU檢測到異常→查IDT執行處理函數→CommonDispatchException→KiDispatchException通過IRETD返回3環 模擬異常:CxxThrowException→RaiseException→RtlRaiseException→NT!NtRaiseException→NT!KiRaiseException→KiDispatchException通過系統調用返回3環
  • 總結

    以上是生活随笔為你收集整理的Windows异常学习笔记(二)—— 内核异常处理流程用户异常的分发的全部內容,希望文章能夠幫你解決所遇到的問題。

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