初识VEH链(用户异常派发的进一步探究)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
初识VEH链(用户异常派发的进一步探究)
VEH链是进程处理异常的一个非常重要的机制。
前面我们分析到用户异常进入内核之后会再次返回到R3层调用KeExceptionDispatcher函数尝试处理。
该函数的主要目的就是搜索VEH找到异常的解决方案,如果未找到会再次向零环抛出异常。
一、通过C代码来实现VEH挂载
如下代码,VEH是一个进程全局异常处理链表。
VEH只能处理单个进程的,后面的SEH在内核中处理全局的。
// veh.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include "pch.h"
#include <iostream>
#include <Windows.h>
LONG NTAPI MyVeH(struct _EXCEPTION_POINTERS *ExceptionInfo) {
//
// 检测到 c0000094 错误并进行处理.
//
if (ExceptionInfo->ExceptionRecord->ExceptionCode = 0xc0000094) {
MessageBoxA(NULL, NULL, NULL, NULL); //
// 方法一:除法汇编代码占两个字节,EIP+2跳过即可
//
//ExceptionInfo->ContextRecord->Eip += 2; //
// 方法二:修改ECX寄存器(原来该寄存器为0)
//
ExceptionInfo->ContextRecord->Ecx = ;
return EXCEPTION_CONTINUE_EXECUTION; }
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
//
// 将我们的异常处理函数挂在VEH头
//
AddVectoredExceptionHandler(TRUE, MyVeH); //
// 使用汇编代码产生c0000094除零错误
//
_asm {
mov eax,
mov ecx,
idiv ecx
}
getchar();
std::cout << "Hello World!\n";
}
二、 AddVectoredExceptionHandler(ntdll.dll)反汇编代码解读
该注意,其挂载的MyVeH函数会进入内核进行加密,具体加密使用xor,秘钥通过系统当前时间来计算得。
1. 流程图
2. 反汇编代码解读
.text:7C9625F9 ; START OF FUNCTION CHUNK FOR _RtlCallVectoredExceptionHandlers@
.text:7C9625F9
.text:7C9625F9 loc_7C9625F9: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+↑j
.text:7C9625F9 mov eax, [ebp+arg_0]
.text:7C9625FC push ebx
.text:7C9625FD push esi
.text:7C9625FE mov [ebp+var_8], eax
.text:7C962601 mov eax, [ebp+arg_4]
.text:7C962604 mov ebx, offset _RtlpCalloutEntryLock
.text:7C962609 push ebx
.text:7C96260A mov [ebp+var_4], eax
.text:7C96260D call _RtlEnterCriticalSection@ ; RtlEnterCriticalSection(x)
.text:7C962612 mov esi, _RtlpCalloutEntryList
.text:7C962618 jmp short loc_7C96262F
.text:7C96261A ; ---------------------------------------------------------------------------
.text:7C96261A
.text:7C96261A loc_7C96261A: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D1D↓j
.text:7C96261A push dword ptr [esi+]
.text:7C96261D call _RtlDecodePointer@ ; RtlDecodePointer(x)
.text:7C962622 lea ecx, [ebp+var_8]
.text:7C962625 push ecx
.text:7C962626 call eax
.text:7C962628 cmp eax, 0FFFFFFFFh
.text:7C96262B jz short loc_7C962647
.text:7C96262D mov esi, [esi]
.text:7C96262F
.text:7C96262F loc_7C96262F: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D04↑j
.text:7C96262F cmp esi, edi
.text:7C962631 jnz short loc_7C96261A
.text:7C962633 mov byte ptr [ebp+arg_0+],
.text:7C962637
.text:7C962637 loc_7C962637: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D37↓j
.text:7C962637 push ebx
.text:7C962638 call _RtlLeaveCriticalSection@ ; RtlLeaveCriticalSection(x)
.text:7C96263D mov al, byte ptr [ebp+arg_0+]
.text:7C962640 pop esi
.text:7C962641 pop ebx
.text:7C962642 jmp loc_7C94A92F
.text:7C962647 ; ---------------------------------------------------------------------------
.text:7C962647
.text:7C962647 loc_7C962647: ; CODE XREF: RtlCallVectoredExceptionHandlers(x,x)+17D17↑j
.text:7C962647 mov byte ptr [ebp+arg_0+],
.text:7C96264B jmp short loc_7C962637
.text:7C96264B ; END OF FUNCTION CHUNK FOR _RtlCallVectoredExceptionHandlers@
.text:7C96264D ; ---------------------------------------------------------------------------
.text:7C96264D ; START OF FUNCTION CHUNK FOR _RtlAddVectoredExceptionHandler@
.text:7C96264D
.text:7C96264D loc_7C96264D: ; CODE XREF: RtlAddVectoredExceptionHandler(x,x)+3C↑j
.text:7C96264D mov eax, _RtlpCalloutEntryListBlink ; 挂在Veh链尾部
.text:7C962652 mov [esi+_VECTORED_EXCEPTION_NODE.ListEntry.Flink], offset _RtlpCalloutEntryList
.text:7C962658 mov [esi+_VECTORED_EXCEPTION_NODE.ListEntry.Blink], eax
.text:7C96265B mov [eax], esi
.text:7C96265D mov _RtlpCalloutEntryListBlink, esi
.text:7C962663 jmp loc_7C956C53
.text:7C962663 ; END OF FUNCTION CHUNK FOR _RtlAddVectoredExceptionHandler@
.text:7C962668 ; ---------------------------------------------------------------------------
.text:7C962668 ; START OF FUNCTION CHUNK FOR _RtlRemoveVectoredExceptionHandler@
.text:7C962668
.text:7C962668 loc_7C962668: ; CODE XREF: RtlRemoveVectoredExceptionHandler(x)+↑j
.text:7C962668 mov eax, [eax]
.text:7C96266A jmp loc_7C956C85
三. 用户异常的派发
之前我们分析过用户的派发分析到 KiUserExceptionDispatcher(ntdll.dll) 函数,现在我们分析这个函数。
1. 流程图
2.反汇编代码有点多,就不发上来了。
四、 关于 Safe VEH机制(分析IsValidHander函数)
未完待续···
初识VEH链(用户异常派发的进一步探究)的更多相关文章
- 同时大量PPPoE连接请求,攻击PPPoE服务器,导致的用户异常掉线故障分析
前几天接一个客户电话,PPPoE下用户异常掉线,掉线后拨号困难 到达后,我首先查看PPPoE日志,发现一秒钟内有大量PADI包,浪费服务器的SESSION,同时让服务器无法处理其他用户的请求. 打开W ...
- Java链式异常
以下实例演示了使用多个 catch 来处理链试异常:public class Main { public static void main (String args[])throws Exceptio ...
- freeradius防止用户异常断开无法重新链接上
freeradius防止用户异常断开无法重新链接上 http://www.cnblogs.com/klobohyz/archive/2012/02/08/2342532.html 编辑default文 ...
- Java提高:采用异常链传递异常
一.分析 异常需要封装,但是仅仅封装还是不够的,还需要传递异常.一个系统的友好型的标识,友好的界面功能是一方面,另一方面就是系统出现非预期的情况的处理方式了. 二.场景 比如我们的JEE项目一般都又三 ...
- PHP - 用户异常断开连接,脚本强制继续执行,异常退出回调
试想如下情况.如果你的用户正在执行一个需要非常长的执行时间的操作.他点了执行了之后,浏览器就开始蛋疼地转.如果执行5分钟,你猜他会干啥,显然会觉得什么狗屎垃圾站,这么久都不响应,然后就给关了.当然这个 ...
- Java 创建用户异常类、将异常一直向上抛、 throw和throws的区别
如果java提供的系统异常类型不能满足程序设计的需求,那么可以设计自己的异常类型. 从java异常类的结构层次可以看出,java类型的公共父类为Throwable.在程序运行中可能出现俩种问题:一种是 ...
- NGK——解决区块链用户之“难”
自比特币诞生以来,区块链行业已发展十余年,而且在在金融.民生.司法存证.供应链协同.税务发票.版权保护等领域得到一定程度的应用,但大多属于边缘业务,以探索试点为主,应用深度和广度不足.为什么会这样?是 ...
- 初识区块链——用JS构建你自己的区块链
前言 区块链太复杂,那我们就讲点简单的.用JS来构建你自己的区块链系统,寥寥几行代码就可以说明区块链的底层数据结构.POW挖矿思想和交易过程等.当然了,真实的场景远远远比这复杂.本文的目的仅限于让大家 ...
- java动态代理——jvm指令集基本概念和方法字节码结构的进一步探究及proxy源码分析四
前文地址 https://www.cnblogs.com/tera/p/13336627.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
随机推荐
- Unity5优秀插件分享
转载请标明原文地址:http://www.cnblogs.com/zhangyukof/p/6836001.html 天空盒:1.SkyboxesUnity4中自带的天空盒,经常用到.不知道为什么U ...
- webpack学习1.1 webpack背景介绍
一.为什么要前端需要构建? 开发复杂化 框架去中心化(代码中需要的模块都可以通过npm安装佢解决一个问题,包越来越零散,根据需要来安装) 开发编译化 语言模块化 二.为什么要用webpack? 1.三 ...
- Microsemi Libero使用技巧——使用命令行模式下载程序
前言 在工程代码编译完成之后,如果需要给某个芯片下载程序时,或者是工厂量产烧录程序时,我们不需要把整个工程文件给别人,而只需要把生成的下载文件给别人,然后使用FlashPro就可以单独下载程序文件了. ...
- c++-重载等号,数组,指针,字符串类
重载 重载=操作符 1先释放旧对象资源 2用一个对象=给另外一个对象 3函数返回值当左值 返回一个引用 4 数组类 Array& operator=(Array& a1); 5 字符串 ...
- SuperMap iDesktop .NET 10i制图技巧-----如何贴图
当我们在没有模型数据的情况下,我们只能通过造白膜来模拟三维建筑了,但是光秃秃的建筑物显然缺乏代入感,因此需要贴图来给场景润色,本文介绍如何给道路贴图和如何给白膜贴图 道路贴图: 1.打开二维道路数据 ...
- STM32基本GPIO操作:按键输入(扫描+外部中断)
(涉及专有名词较多,难免解释不到位,若有错误还请指出,谢谢!) 硬件连接图如下: 一.扫描 思路是在main函数中通过死循环来扫描端口电平状态检测,以此判断按键是否按下.实现较为简单. 1.初始化(注 ...
- eclipse 的安装
打开eclipse官网 https://www.eclipse.org/ 点击此处 再点击 最后点击下载 然后一路下一步安装即可 添加中文语言包 打开eclipse官网 https://www.ecl ...
- 面试连环炮系列(十二):说说Atomiclnteger的使用场景
说说Atomiclnteger的使用场景 AtomicInteger提供原子操作来进行Integer的使用,适合并发情况下的使用,比如两个线程对同一个整数累加. 为什么Atomiclnteger是线程 ...
- 【STM32-V6】STM32F429BIT6开发板开源, 丰富软件资源, 强劲硬件配置, 配套400多实例, 9套手册持续更新中2019-12-12
淘宝购买地址:淘宝购买链接 次.当前标准库最新版本V2.3,HAL库最新版本V1.1 安富莱微信公共平台,欢迎大家关注(打造高质量公众号) 新版用户手册,重在BSP驱动包设计方法,HAL库的框架学习, ...
- JPA中实现单向多对一的关联关系
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...