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函数)
未完待续···
来源:oschina
链接:https://my.oschina.net/u/4343037/blog/3353863