初識VEH鏈(用戶異常派發的進一步探究)

Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.htmlhtml

初識VEH鏈(用戶異常派發的進一步探究) ios

  VEH鏈是進程處理異常的一個很是重要的機制。函數

  前面咱們分析到用戶異常進入內核以後會再次返回到R3層調用KeExceptionDispatcher函數嘗試處理。加密

  該函數的主要目的就是搜索VEH找到異常的解決方案,若是未找到會再次向零環拋出異常。spa

 

1、經過C代碼來實現VEH掛載code

  以下代碼,VEH是一個進程全局異常處理鏈表。htm

  VEH只能處理單個進程的,後面的SEH在內核中處理全局的。blog

 1 // veh.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
 2 //
 3 
 4 #include "pch.h"
 5 #include <iostream>
 6 #include <Windows.h>
 7  LONG NTAPI MyVeH(struct _EXCEPTION_POINTERS *ExceptionInfo) {
 8      //
 9      // 檢測到 c0000094 錯誤並進行處理.
10      //
11      if (ExceptionInfo->ExceptionRecord->ExceptionCode = 0xc0000094) {
12          MessageBoxA(NULL, NULL, NULL, NULL);
13 
14          //
15          // 方法一:除法彙編代碼佔兩個字節,EIP+2跳過便可
16          //
17          //ExceptionInfo->ContextRecord->Eip += 2;
18 
19          //
20          // 方法二:修改ECX寄存器(原來該寄存器爲0)
21          //
22          ExceptionInfo->ContextRecord->Ecx = 1;
23          return EXCEPTION_CONTINUE_EXECUTION;
24 
25      }
26      return EXCEPTION_CONTINUE_SEARCH;
27 }
28 int main()
29 {
30     //
31     // 將咱們的異常處理函數掛在VEH頭
32     //
33     AddVectoredExceptionHandler(TRUE, MyVeH);
34     
35     //
36     // 使用匯編代碼產生c0000094除零錯誤
37     //
38     _asm {
39         mov eax,1
40         mov ecx,0
41         idiv ecx
42     }
43     getchar();
44     std::cout << "Hello World!\n";
45 }

 

 

2、 AddVectoredExceptionHandler(ntdll.dll)反彙編代碼解讀索引

  該注意,其掛載的MyVeH函數會進入內核進行加密,具體加密使用xor,祕鑰經過系統當前時間來計算得。進程

1. 流程圖

2. 反彙編代碼解讀

 1 .text:7C9625F9 ; START OF FUNCTION CHUNK FOR _RtlCallVectoredExceptionHandlers@8
 2 .text:7C9625F9
 3 .text:7C9625F9 loc_7C9625F9:                           ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+13↑j
 4 .text:7C9625F9                 mov     eax, [ebp+arg_0]
 5 .text:7C9625FC                 push    ebx
 6 .text:7C9625FD                 push    esi
 7 .text:7C9625FE                 mov     [ebp+var_8], eax
 8 .text:7C962601                 mov     eax, [ebp+arg_4]
 9 .text:7C962604                 mov     ebx, offset _RtlpCalloutEntryLock
10 .text:7C962609                 push    ebx
11 .text:7C96260A                 mov     [ebp+var_4], eax
12 .text:7C96260D                 call    _RtlEnterCriticalSection@4 ; RtlEnterCriticalSection(x)
13 .text:7C962612                 mov     esi, _RtlpCalloutEntryList
14 .text:7C962618                 jmp     short loc_7C96262F
15 .text:7C96261A ; ---------------------------------------------------------------------------
16 .text:7C96261A
17 .text:7C96261A loc_7C96261A:                           ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D1D↓j
18 .text:7C96261A                 push    dword ptr [esi+8]
19 .text:7C96261D                 call    _RtlDecodePointer@4 ; RtlDecodePointer(x)
20 .text:7C962622                 lea     ecx, [ebp+var_8]
21 .text:7C962625                 push    ecx
22 .text:7C962626                 call    eax
23 .text:7C962628                 cmp     eax, 0FFFFFFFFh
24 .text:7C96262B                 jz      short loc_7C962647
25 .text:7C96262D                 mov     esi, [esi]
26 .text:7C96262F
27 .text:7C96262F loc_7C96262F:                           ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D04↑j
28 .text:7C96262F                 cmp     esi, edi
29 .text:7C962631                 jnz     short loc_7C96261A
30 .text:7C962633                 mov     byte ptr [ebp+arg_0+3], 0
31 .text:7C962637
32 .text:7C962637 loc_7C962637:                           ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D37↓j
33 .text:7C962637                 push    ebx
34 .text:7C962638                 call    _RtlLeaveCriticalSection@4 ; RtlLeaveCriticalSection(x)
35 .text:7C96263D                 mov     al, byte ptr [ebp+arg_0+3]
36 .text:7C962640                 pop     esi
37 .text:7C962641                 pop     ebx
38 .text:7C962642                 jmp     loc_7C94A92F
39 .text:7C962647 ; ---------------------------------------------------------------------------
40 .text:7C962647
41 .text:7C962647 loc_7C962647:                           ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D17↑j
42 .text:7C962647                 mov     byte ptr [ebp+arg_0+3], 1
43 .text:7C96264B                 jmp     short loc_7C962637
44 .text:7C96264B ; END OF FUNCTION CHUNK FOR _RtlCallVectoredExceptionHandlers@8
45 .text:7C96264D ; ---------------------------------------------------------------------------
46 .text:7C96264D ; START OF FUNCTION CHUNK FOR _RtlAddVectoredExceptionHandler@8
47 .text:7C96264D
48 .text:7C96264D loc_7C96264D:                           ; CODE XREF: RtlAddVectoredExceptionHandler(x,x)+3C↑j
49 .text:7C96264D                 mov     eax, _RtlpCalloutEntryListBlink ; 掛在Veh鏈尾部
50 .text:7C962652                 mov     [esi+_VECTORED_EXCEPTION_NODE.ListEntry.Flink], offset _RtlpCalloutEntryList
51 .text:7C962658                 mov     [esi+_VECTORED_EXCEPTION_NODE.ListEntry.Blink], eax
52 .text:7C96265B                 mov     [eax], esi
53 .text:7C96265D                 mov     _RtlpCalloutEntryListBlink, esi
54 .text:7C962663                 jmp     loc_7C956C53
55 .text:7C962663 ; END OF FUNCTION CHUNK FOR _RtlAddVectoredExceptionHandler@8
56 .text:7C962668 ; ---------------------------------------------------------------------------
57 .text:7C962668 ; START OF FUNCTION CHUNK FOR _RtlRemoveVectoredExceptionHandler@4
58 .text:7C962668
59 .text:7C962668 loc_7C962668:                           ; CODE XREF: RtlRemoveVectoredExceptionHandler(x)+29↑j
60 .text:7C962668                 mov     eax, [eax]
61 .text:7C96266A                 jmp     loc_7C956C85

 

三. 用戶異常的派發

  以前咱們分析過用戶的派發分析到 KiUserExceptionDispatcher(ntdll.dll) 函數,如今咱們分析這個函數。

1. 流程圖

 

2.反彙編代碼有點多,就不發上來了。

 

4、 關於 Safe VEH機制(分析IsValidHander函數)

  未完待續···

相關文章
相關標籤/搜索