上一篇我们介绍了最简单的SSDT,这篇来写一下inlineHook。

所谓的inlineHook就是在内存中修改所需要挂钩函数的前几个字节,让其跳转到我们的fake函数,执行完毕后再跳回去执行原函数,这样的话我们就没有修改SST表里面的内容,而是对函数本身修改。

流程摘自:看雪aniquest

1. 获取服务函数地址:

(1)通过全局变量KeServiceDescriptorTable获得SSDT表的起始地址;

(2)映射ntdll.dll到ring0空间,获得要Hook的函数的服务索引号;

(3)根据获得的函数的服务索引号,从SSDT表中获得函数地址;

2. 进行Hook(这里采用的Inline Hook是修改函数前五个字节的方法):

(1)申请一块五字节大小的内存用来备份原函数的前五个字节,用于驱动卸载的时候恢复原函数;

(2)申请一块十字节大小的内存用来构造“跳板代码”;

(3)拷贝原函数的前五个字节到跳板代码的前五个字节处;

(4)计算由跳板代码处跳转到原函数开始处过五个字节的偏移(记为offset1),将jmp offset1指令写入跳板代码的后五个字节处;

(5)编写Fake函数,也就是我们需要执行的代码;

(6)计算原函数开始处跳转到Fake函数开始处的偏移(offset2),将jmp offset2指令写入原函数开始处;

3. 驱动卸载时,

恢复被Hook的函数,也就是将一开始备份的原函数开始处的五个字节拷贝到原函数开始处。

通过全局变量KeServiceDescriptorTable获得SSDT表的起始地址

extern PSYSTEM_SERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

映射ntdll.dll到ring0空间,获得要Hook的函数的服务索引号;

通过PE文件结构在导出表中搜索函数,这里不再赘述。

2: kd> u ZwOpenProcessnt!ZwOpenProcess:8485acd8 b8be000000      mov     eax,0BEh8485acdd 8d542404        lea     edx,[esp+4]8485ace1 9c              pushfd8485ace2 6a08            push    88485ace4 e8d5190000      call    nt!KiSystemService (8485c6be)8485ace9 c21000          ret     10h

可以看到函数地址+1个字节的位置存的就是函数在SST表中的索引

根据获得的函数的服务索引号,从SSDT表中获得函数地址;

当进行Hook时我们要思考一个问题,跳转到我们的fake函数地址,我们怎么执行回原函数,原本的函数代码都已经被我们改了,所以我们必须保存原来的函数代码。之后呢,修改回去吗?当然不用。既然我们已经保存了原始的五个字节代码,我们只需要执行这个代码,然后再跳回去原始函数+5的位置,就可以完整执行了原函数。

代码就不贴了,搞明白了原理还要实践才可以。

记得修改内存的时候关闭写保护哦!

SSDT inlineHook相关推荐

  1. win10 x64中inlineHook SSDT里面的函数

    inlineHook的原理: 为了方便好理解,一些变量名和函数名在这里使用中文命名,有些编译器不支持中文命名,在这里要注意(我的是VS2019) hook.h: #pragma once #inclu ...

  2. Win64 驱动内核编程-23.Ring0 InLineHook 和UnHook

    Ring0 InLineHook 和UnHook 如果是要在R0里hook,作者的建议是InLine HOOK,毕竟SSDT HOOK 和 SHADOW SSDT HOOK比较麻烦,不好修改.目前R3 ...

  3. shadow ssdt学习笔记

    1.取得shadow ssdt真实地址 系统只提供了KeServiceDescriptorTable导出 KeServiceDescriptorTableShadow是个未导出结构 定义 Copy c ...

  4. 用SSDT方法恢复冒险岛的部分函数

    看了那么多文章.视频,现在自己跟着做下恢复的驱动程序吧.今天拿冒险岛的HS驱动做为例子吧.冒险岛游戏对Xuetr进行检测了,打开XueTr不久就会游戏发现非法模块,最终游戏关闭.就拿上了一款叫Kern ...

  5. 内核层 inlinehook 隐藏进程

    上次是SSDT  HOOK 方式 隐藏 进程 ,如链接:http://blog.csdn.net/hjxyshell/article/details/16993119 这次是InlineHook 方式 ...

  6. Rootkit之SSDT hook(通过CR0)

    SSDT即System Service Dispath Table,它是一个表,这个表中有内核调用的函数地址. KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导 ...

  7. win10 64位SSDT函数索引动态查找

    在win10 64位下SSDT是不导出的.同时如果你要hook某个函数时你要知道他的索引,以前都是调试或者网上找然后硬编码进去.这里动态找. 原理是上层调用的所有函数都经过ntdll 然后进入0环,进 ...

  8. 使用WinDbg获取SSDT 系统服务描述表的函数服务号(索引)

    今天研究了一下午SSDT的东东,最尴尬的是起初我不知道如何获取到SSDT的函数服务号,而这个玩意儿在不同版本的windows是不一样的,后面经过研究还是找到了正确的方法.这里简单的分享一下. ·    ...

  9. Win7 64位的SSDTHOOK(2)---64位SSDT hook的实现

    Hook之前要干掉PG:http://www.m5home.com/bbs/thread-5893-1-1.html 上篇文章知道了寻找SSDT表的方法,这篇记录一下如何实现SSDT表的Hook. 下 ...

  10. Win7 64位的SSDTHOOK(1)---SSDT表的寻找

    最近在学习64位驱动,涉及到了SSDT的知识,结果发现64位下的SSDT和32位下的SSDT有所不同. 开始发现64位下的KeServiceDescriptorTable是未导出的函数.首先要找到Ke ...

最新文章

  1. Linux那些事儿 之 戏说USB(22)设备的生命线(五)
  2. 用C语言解“打印九九乘法表”题
  3. CSS3之创建3D场景
  4. 搭建MongoDB分片集群
  5. redmine 无法登录 mysql 服务器_Redmine 数据库连接错误
  6. 【转】Android编程点滴(14) -- Android中资源文件夹res/raw和assets的使用
  7. OpenStack-Zun 使用
  8. Web框架——Flask系列之Jinja2模板引擎(二)
  9. 【Python】TensorBoard已发送内容的清除
  10. Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)
  11. ragel学习资源整合
  12. 如何在面试中介绍自己的项目经验
  13. RocketMQ 实战与原理解析
  14. 全国各省手机号测试用例
  15. Wifi热点java_Wifi热点实现文件传输
  16. 纽约大学Gary Marcus等撰文:人类思维对于AI的11个启示
  17. 【详解】MySQL分区表,分区的过程,四种分区类型
  18. 车载多媒体 android play,先锋推新款车载多媒体设备 支持Android Auto
  19. OpenCV 计算运行时间(us,ms,s)
  20. 如何自己写一门简单的编程语言(解释型语言)

热门文章

  1. 个人博客系统项目-已开源
  2. 跨界干货:如何在一周内摸清一个行业
  3. 异常:could not initialize proxy - the owning Session was closed
  4. java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes
  5. (C语言)不变初心数 (15 分)---pta
  6. 观光公交(codevs 1139)题解
  7. 《基于Cortex-M4的虚拟机制作与测试》课程设计 结题报告
  8. Iterative Deep Learning论文简读
  9. android记账本折线图_小熊记账本
  10. 实战:解密拼多多玩法—砍价