Windows驱动学习(八)-- 通过InlineHook实现变速齿轮
教程参考自:https://www.bilibili.com/video/av26193169/?p=9
代码地址:https://github.com/G4rb3n/Windows-Driver/tree/master/MT-InlineHook
1. 概述
之前的章节我们介绍了FSD Hook技术,这章我们来讲解一下更底层一点的Inline Hook技术。
2. 原理介绍
Inline Hook直接修改内存中任意函数的代码,将其劫持至Hook API。它的目标是系统函数,如下,第一张图是Hook之前的状态,procexp.exe进程调用ZwQuerySystemInformation()函数时,ZwQuerySystemInformation()的代码是正常的代码。第二张图是Hook后的状态,注意红框中的代码,ZwQuerySystemInformation()函数开头5个字节已被修改,变成了jmp 0x10001120,也就是我们恶意代码的地址,之后便可以开始我们的自定义操作。0x1000116A我们先进行unhook操作(脱钩),目的是将ZwQuerySystemInformation()的代码恢复。大家可能有疑惑,为什么刚修改完又要恢复回来,原因很简单,Hook的目的是当调用某个函数时,我们能劫持进程的执行流。现在我们已经劫持了进程的执行流,便可以恢复ZwQuerySystemInformation()的代码,以便我们的恶意代码可以正常调用ZwQuerySystemInformation()。执行完恶意代码后,再次挂钩,监控该函数。
3. 驱动编写
3.1 驱动入口函数
代码的原理很简单,首先获取KeUpdateSystemTime和KeQueryPerformanceCounter的地址,然后将前5个字节替换成“jmp [hook addr]”的字节码,值得注意的是,这里的hook addr应该是hook函数和被hook函数的地址差值。
因为执行完hook函数后还要跳回执行原函数(KeUpdateSystemTime、KeQueryPerformanceCounter),所以在修改字节码前要先保存原函数的字节码,到底要保存几个字节码呢?这就要看函数的开头了,不过至少要大于5个,因为那样我们的“jmp [hook addr]”字节码才放得下。
使用VS调试驱动,查看原函数的结构,来决定要保存几个字节码。但在这之前,我发现一个奇怪的现象,使用MmGetSystemRoutineAddress(“KeUpdateSystemTime”)获取到的函数地址居然是KeUpdateSystemTimeAssist函数的地址,我也不知道这是什么原因,只有微软才知道。。那我们就将错就错,获取KeUpdateSystemTimeAssist函数的结构呗。
该函数的开头是连着的7个字节,所以我们应该保存它的7个字节。
同理调试KeQueryPerformanceCounter,查看其函数结构。
这个函数我们应该替换前5字节。
后面,将保存的字节码写入跳转函数(updatetimeOriginCode、querycounterOriginCode)就行了。
3.2 fakeupdatetimeAddr函数
fakeupdatetimeAddr函数是KeUpdateSystemTime的hook函数,它先修改KeUpdateSystemTime的速度参数,然后调用原函数“KeUpdateSystemTime”。
3.3 updatetimeOriginCode函数
前面的nop是用来被替换为原函数的7个字节的,执行完该7个字节后跳转回KeUpdateSystemTime函数执行剩下的字节码。
3.4 fakequerycounterAddr函数
fakequerycounterAddr函数是KeQueryPerformanceCounter的hook函数,跟fakeupdatetimeAddr不一样,它是先调用原函数“KeQueryPerformanceCounter”,然后修改其返回值,实现变速。
3.5 querycounterOriginCode函数
前面的nop是用来被替换为原函数的5个字节的,执行完该5个字节后跳转回KeQueryPerformanceCounter函数执行剩下的字节码。
3.6 WPOFF函数
cr0寄存器是用来存储当前进程的内存属性的,这里的代码功能为从cr0获取内存属性值,修改,然后赋值回去。
3.7 WPON函数
WPON的代码功能则跟WPOFF相反。
3.8 卸载函数
4. 驱动测试
加载该驱动后,系统时钟变快了。
Windows驱动学习(八)-- 通过InlineHook实现变速齿轮相关推荐
- Windows驱动学习第一步,第一个Windows驱动
前段时间工作需要做了一段防外挂的工作,虽说是防外挂,但是只能从ring3来做,ring0的是一点也不知道,公司倒是请来了一个做Windows驱动的,但是他对ring3也是不懂,我俩就配合做一些事情,但 ...
- Windows驱动学习(六)-- FSD钩子
教程参考自:https://www.bilibili.com/video/av26193169/?p=8 代码地址:https://github.com/G4rb3n/Windows-Driver/t ...
- 9、Windows驱动开发技术详解笔记(5) 基本语法回顾
5.在驱动中获取系统时间 1)获取启动毫秒数 在ring3 我们可以通过一个GetTickCount 函数来获得自系统启动开始的毫秒数,在ring0也有一个与之对应的KeQueryTickCount ...
- 15、Windows驱动开发技术详解笔记(11) 基本概念
9.Windows驱动程序的入口函数规定为_DriverEntry@8,所以用C++编写时要用extern. 驱动程序中,不能使用编译器运行时函数,甚至C语言中的malloc,C++的new函数都不能 ...
- linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析
这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...
- JsGear -- JavaScript版变速齿轮
在JS开发中经常会用到定时器,尤其是一些动画特效,小游戏等完全依靠定时器驱动. 要让动画跑得更流畅,我们常常使用较高的刷新率,例如60fps.由于每一帧的间隔非常短,很难看清楚每一帧具体的运行情况. ...
- Windows驱动开发学习笔记(七)—— 多核同步内核重载
Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...
- Windows驱动开发学习笔记(六)—— Inline HOOK
Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...
- Windows驱动开发学习笔记(五)—— SSDT HOOK
Windows驱动开发学习笔记(五)-- SSDT HOOK 系统服务表 系统服务描述符表 实验一:通过代码获取SSDT表地址 通过页表基址修改页属性 方法1:修改页属性 方法2:修改CR0寄存器 实 ...
最新文章
- 第五章ThinkingInJava
- 零拷贝 zero-copy 原理
- python详细安装教程环境配置-python环境配置详细步骤
- python工程师月薪-在三线城市,Python工程师也能拿到月薪20K?
- laravel 导出导入excel和csv文件的 使用
- 基因分子生物学~DNA与蛋白质模板
- 十分钟看懂什么是VoLTE【包学包会,否则退款】
- php vendor路径,php – 如何使用composer获取根包路径
- JS中浮点数运算误差处理
- mysql管理数据_MySQL 管理
- mysql xp系统时间_【MySQL】时间函数
- C# string 转 bool
- Code Snippet 插件 使用——代码高亮
- Layui 左部菜单栏无限级分类
- Android10 mockLocation 模拟定位
- JavaScript实现节点的增加修改删除查找
- 移动硬盘中安装ubuntu系统——Vmware Workstation安装
- 依据Right-BICEP要求的对四则运算2的测试
- 全局刷新和局部刷新的理解
- Python爬虫:BeautifulSoup的find()和findAll()