教程参考自: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实现变速齿轮相关推荐

  1. Windows驱动学习第一步,第一个Windows驱动

    前段时间工作需要做了一段防外挂的工作,虽说是防外挂,但是只能从ring3来做,ring0的是一点也不知道,公司倒是请来了一个做Windows驱动的,但是他对ring3也是不懂,我俩就配合做一些事情,但 ...

  2. Windows驱动学习(六)-- FSD钩子

    教程参考自:https://www.bilibili.com/video/av26193169/?p=8 代码地址:https://github.com/G4rb3n/Windows-Driver/t ...

  3. 9、Windows驱动开发技术详解笔记(5) 基本语法回顾

    5.在驱动中获取系统时间 1)获取启动毫秒数 在ring3 我们可以通过一个GetTickCount 函数来获得自系统启动开始的毫秒数,在ring0也有一个与之对应的KeQueryTickCount ...

  4. 15、Windows驱动开发技术详解笔记(11) 基本概念

    9.Windows驱动程序的入口函数规定为_DriverEntry@8,所以用C++编写时要用extern. 驱动程序中,不能使用编译器运行时函数,甚至C语言中的malloc,C++的new函数都不能 ...

  5. linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析

    这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2). 一. V4L2框架: video for linux ...

  6. JsGear -- JavaScript版变速齿轮

    在JS开发中经常会用到定时器,尤其是一些动画特效,小游戏等完全依靠定时器驱动. 要让动画跑得更流畅,我们常常使用较高的刷新率,例如60fps.由于每一帧的间隔非常短,很难看清楚每一帧具体的运行情况. ...

  7. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

  8. Windows驱动开发学习笔记(六)—— Inline HOOK

    Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...

  9. Windows驱动开发学习笔记(五)—— SSDT HOOK

    Windows驱动开发学习笔记(五)-- SSDT HOOK 系统服务表 系统服务描述符表 实验一:通过代码获取SSDT表地址 通过页表基址修改页属性 方法1:修改页属性 方法2:修改CR0寄存器 实 ...

最新文章

  1. 第五章ThinkingInJava
  2. 零拷贝 zero-copy 原理
  3. python详细安装教程环境配置-python环境配置详细步骤
  4. python工程师月薪-在三线城市,Python工程师也能拿到月薪20K?
  5. laravel 导出导入excel和csv文件的 使用
  6. 基因分子生物学~DNA与蛋白质模板
  7. 十分钟看懂什么是VoLTE【包学包会,否则退款】
  8. php vendor路径,php – 如何使用composer获取根包路径
  9. JS中浮点数运算误差处理
  10. mysql管理数据_MySQL 管理
  11. mysql xp系统时间_【MySQL】时间函数
  12. C# string 转 bool
  13. Code Snippet 插件 使用——代码高亮
  14. Layui 左部菜单栏无限级分类
  15. Android10 mockLocation 模拟定位
  16. JavaScript实现节点的增加修改删除查找
  17. 移动硬盘中安装ubuntu系统——Vmware Workstation安装
  18. 依据Right-BICEP要求的对四则运算2的测试
  19. 全局刷新和局部刷新的理解
  20. Python爬虫:BeautifulSoup的find()和findAll()

热门文章

  1. Ubuntu 下USB抓包工具—usbmon
  2. Qt使用大图标工具栏、svg格式图标
  3. 谷歌验证器的原理及JS实现
  4. 河北省高中会考计算机试题及答案,河北省高中会考试卷数学附答案
  5. 既要技术制胜,也要体验为王:今天我们需要怎样的WLAN?
  6. 坦克大战_我方坦克发射子弹
  7. 怎样增加混凝土粘聚性_混凝土粘聚性调整技巧
  8. 气动调节蝶阀小知识!
  9. C++算法之组合算法
  10. codeigniter如何开启关闭调试模式?