作者 | 榴莲

编辑 | 楌橪

Windows操作系统中存在多种异常处理,我们现在需要的是其中的VEH(VectoredExceptionHandler)异常处理,也就是向量化异常处理。我们之所以可以使用VEH异常来进行HOOK的主要原因,在于两点。其一,VEH异常处理的优先级是高于SEH异常处理的,也就是说可以先手拿到异常,确保不会被其他异常处理流程将异常截获而导致HOOK失败。其二就是在VEH异常处理的回调函数中,可以获取及修改异常发生处的上下文环境,这就意味着我们可以操作的东西会非常多,例如通过上下文环境中的ESP(栈顶指针寄存器)就可以拿到HOOK位置触发异常时的堆栈数据。而我们设置的HOOK位置通常位于函数内部的起始位置,这就意味着我们可以直接通过堆栈里的数据获取到被HOOK函数的参数,并且可以对其进行修改。

在我们之前的文章中,我们已经使用过利用软件断点(int 3 0xCC)触发异常,实现HOOK。

但是这种方法也是有一定缺陷的。例如,如果目标进程具有CRC32一类的完整性检查,int3 软件断点又会修改指令。这样就无法通过完整性检查了。所以,我们这一次,提出一种新的方式。依然是基于VEH异常的,但是可以实现“无痕”的效果。不修改任何一个字节就完成HOOK。那么,这种方式就是基于硬件调试寄存器实现的。也就是硬件断点。因为硬件断点的地址是存储在寄存器里的,所以不会修改内存。

那么在学习具体的HOOK方法之前,我们首先需要了解一下硬件断点的基本知识:

上图就是Intel手册中对于调试断点的说明图,下面我们对其字段进行一定解释:

DR0 - DR3就是用来保存硬件断点的地址的,这个地址是线性地址而不是物理地址,因为CPU是在线性地址被翻译成物理地址之前出处理断点的,也因此,我们在保护模式内不能用调试寄存器对物理内存地址设置断点。

DR4和DR5是保留的,如果调试扩展开启了(CR4的DE位设置成1就是开启了),任何对DR4和DR5的调用都会导致一个非法指令异常#UD,如果调试扩展禁用了,那么DR4和DR5其实就是DR6和DR7的别名寄存器。

DR7寄存器是调试控制寄存器:

R/W0 - R/W3 读写域 四个读写域分别与DR0-DR3寄存器所对应,用来指定被监控地点的访问类型。

占两位,所以有以下四种状态:

00:仅执行对应断点的时候中断(执行断点)

01:仅写数据中断(写入断点)

10:(需要开启CR4的DE【调试扩展】)I/O时中断

11:读写数据都中断,但是读指令除外(访问断点)

LEN0 - LEN3 长度域 四个长度域分别与DR0-DR3寄存器所对应,用来指定监控区域的长度

占两位,所以有以下四种状态:

00:1字节长

01:2字节长

10:8字节长

11:4字节长

如果R/W位是00,那么这里应该设置成0

L0-L3 局部断点启用 分别与DR0-DR3寄存器所对应,对应项为1就是开启断点,为0就是关闭断点,执行后自动清除该位

G0-G3 全部断点启用 分别与DR0-DR3寄存器所对应,对应项为1就是开启断点,为0就是关闭断点,CPU不会主动清除

LE和GE 忽略即可,高版本CPU不用了,486之前才会用

GD启用访问检测,如果GD是1,那么CPU遇到修改DR寄存器的指令,会产生一条异常。

DR6寄存器是调试状态寄存器

B0-B3 分别与DR0-DR3寄存器所对应,如果B0被置1了,那说明R/W0 len0 DR0的条件都被满足了

BD 与DR7的GD位相关联,当CPU发现了需要修改DR寄存器的指令,那么就会停止执行,把BD设置成1,然后交给#DB的处理程序

BS 单步 与EFLAGS里的TF位相关联,如果这一位是1,则表示是单步触发的

BT 任务切换 与任务段相关,TSS的T标志(调试陷阱)相关联,当任务切换,发现下一个TSS的T是1,那么就会中断到调试中断程序里

那么以MessageBoxA为例,我们实际上来体验一下无痕HOOK的实现方式。

首先,我们需要一个目标程序,代码如下:

然后我们来看一下HOOK后的效果:

正常情况下:

HOOK后:

接下来,我们将使用代码实现IAT Hook,我这里采用的操作系统是Windows 10 20H2(19042.1288),集成开发环境采用的是Visual Studio 2017。

阅读全文

基于VEH调试寄存器实现无痕HOOK(5)相关推荐

  1. 调试寄存器 原理与使用:DR0-DR7

    调试寄存器 原理与使用:DR0-DR7 下面介绍的知识性信息来自intel IA-32手册(可以在intel的开发手册或者官方网站查到),提示和补充来自学习调试器实现时的总结. 希望能给你带去有用的信 ...

  2. 调试寄存器(debug registers, DRx)理论及实践

    导读: 标 题:DRx寄存器的使用(待续) (4千字) 发信人:hume   时 间:2003-06-18 17:33:11 详细信息: 调试寄存器(DRx)理论与实践 By Hume/冷雨飘心 前言 ...

  3. 如何对抗硬件断点--- 调试寄存器

    1.前言 在我跨入ollydbg的门的时候,就对ollydbg里面的各种断点充满了疑问,以前我总是不明白普通断点,内存断点,硬件断点有什么区别,他们为什么 有些时候不能混用,他们的原理是什么,在学习了 ...

  4. linux gdb 寄存器,x86 调试寄存器

    英文官方介绍<Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programmin ...

  5. 处理veh调试器检测_越狱检测抖音逻辑???

    对于应用安全甲方一般会在这三个方面做防御.按逻辑分类的话应该应该分为这几类, 但如果从实现原理的话, 应该分为两类, 用API实现的 和 不用API实现的(这说的不用 API 实现, 不是指换成 in ...

  6. Android逆向之旅---破解某应用加密算法(动态调试so和frida hook so代码)

    一.样本静态分析 最近有位同学发了一个样本给我,主要是有一个解密方法,把字符串加密了,加解密方法都放在so中,所以之前也没怎么去给大家介绍arm指令和解密算法等知识,正好借助这个样本给大家介绍一些so ...

  7. 基于 CherryUSB 调试 dwc2 usb host 笔记

    本文由RT-Thread论坛用户@sakumisu原创发布:https://club.rt-thread.org/ask/article/9c31ce71ead26c2b.html 背景 之前适配 D ...

  8. 基于dalvik模式下的Xposed Hook开发的某加固脱壳工具

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77966109 这段时间好好的学习了一下Android加固相关的知识和流程也大致把A ...

  9. vscode 调试html页面,基于VSCode调试网页JavaScript代码过程详解

    一.调试准备 Windows10 64bits IDE:Visual Studio Code1.28.2 安装插件:Chrome(安装方法:Debug -> Install Additional ...

  10. 基于ARM9程序状态寄存器CPSR

    定义:程序状态寄存器: 功能:反映数据运算状态,控制系统模式等: 特点:程序状态寄存器不属于通用寄存器: 关于CPSR的访问,ARM专门为其设立了两条指令: MRS:CPSR到通用寄存器传递数据指令: ...

最新文章

  1. android 图片 编辑app,图片编辑工具手机版下载-图片编辑工具app下载8.33.107安卓官方版-西西软件下载...
  2. iphone 常用预编译代码
  3. python动态图片转字符画_GIF动态图,视频?都能用Python转换成字符画图像
  4. mysql事务实战_MySQL - 实战 (2) - 事务隔离
  5. 四 Spring的工厂类,xml的配置
  6. stringreader_Java StringReader markSupported()方法与示例
  7. 【BZOJ2818】Gcd,数论练习之欧拉筛
  8. osm数据导入mysql_OSM(OpenStreetMap) poi、路网 数据导入 PostgreSQL
  9. 微课|中学生可以这样学Python(例11.3):tkinter通信录管理系统4
  10. keil uVision4 创建项目
  11. 线程池----合理的设置大小
  12. 使用AJAX时出现“Microsoft JScript 运行时错误: 'Sys' 未定义”提示的解决方法
  13. Vue中<keep-alive>组件的使用
  14. 全文搜索引擎solr使用说明
  15. qq系统软件测试计划,软件测试设计报告案例——qq空间.doc
  16. 陕西宝鸡发现桃花水母 (组图)
  17. 电力系统的遥测、遥信、遥控、遥调
  18. Celestial Altium Library
  19. 数学奥赛狂砍10题!Meta发布全新定理证明器:AI即将接管数学?
  20. 报错: TypeError: Cannot read property ‘forceUpdate‘ of undefined

热门文章

  1. 关于「数据分析师」的一些理解
  2. C# 小数点后保留两位小数,四舍五入的函数及使用方法
  3. dell加装固态硬盘_戴尔(dell)计算机nvme固态硬盘安装win10系统和分区教程
  4. python之json模块
  5. 自己写的Excel查询小工具,需要的可以拿走
  6. 人机融合智能时代的人心
  7. 等保测评机构是什么意思?是什么性质的单位?
  8. Hadoop-HDFS学习
  9. Word 2016使用技巧
  10. 计算机项目符号操作,word项目符号和编号的操作方法-word技巧-电脑技巧收藏家...