初识VEH链(用户异常派发的进一步探究)

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

初识VEH链(用户异常派发的进一步探究) 

  VEH链是进程处理异常的一个非常重要的机制。

  前面我们分析到用户异常进入内核之后会再次返回到R3层调用KeExceptionDispatcher函数尝试处理。

  该函数的主要目的就是搜索VEH找到异常的解决方案,如果未找到会再次向零环抛出异常。

 

一、通过C代码来实现VEH挂载

  如下代码,VEH是一个进程全局异常处理链表。

  VEH只能处理单个进程的,后面的SEH在内核中处理全局的。

 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 }

 

 

二、 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.反汇编代码有点多,就不发上来了。

 

四、 关于 Safe VEH机制(分析IsValidHander函数)

  未完待续···

 

 

 

 

posted @ 2019-11-05 19:41  OneTrainee  阅读(1223)  评论(0编辑  收藏  举报