zoukankan      html  css  js  c++  java
  • 初识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!
    ";
    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函数)

      未完待续···

  • 相关阅读:
    第二十一章流 1流的操作 简单
    第二十章友元类与嵌套类 1友元类 简单
    第十九章 19 利用私有继承来实现代码重用 简单
    第二十章友元类与嵌套类 2嵌套类 简单
    第十九章 8链表类Node 简单
    第二十一章流 3用cin输入 简单
    第十九章 10 图书 药品管理系统 简单
    第十九章 11图书 药品管理系统 简单
    第二十一章流 4文件的输入和输出 简单
    第十九章 12 什么时候使用私有继承,什么时候使用包含 简单
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11801059.html
Copyright © 2011-2022 走看看