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函数)

      未完待续···

  • 相关阅读:
    [LeetCode] 134. Gas Station Java
    [LeetCode] 22. Best Time to Buy and Sell Stock II Java
    [LeetCode] 55. Jump Game Java
    [LeetCode] 264. Ugly Number II Java
    [LeetCode] 331. Verify Preorder Serialization of a Binary Tree Java
    [LeetCode] 232. Implement Queue using Stacks Java
    java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory的解决办法
    Linux centos 连接网络
    MyEclipse默认编码为GBK,修改为UTF8的方法
    表单
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11801059.html
Copyright © 2011-2022 走看看