来源:CSDN   作者:daiwen

名字起得好,Inline hook,乍一听,似乎很高深。此处的Inline,我以为,意指将汇编代码直接写入内核API的内存区域。Inline Hook不像用户态Hook或SSDT hook(用C语言就足够),它需要在程序中嵌入汇编代码(Inline Assembly)以操作堆栈和执行内核API对应的部分汇编指令。当然,这些都须以驱动的形式进行。

所谓API Hook,就是用自己写的函数去替代系统API的“职位”,此后,自己写的函数便掌握了以前由被hook的API所“经手”的一切“事宜”。 Windows系统分用户态和内核态,API也就有了用户级和内核级两大类。想要比较底层、彻底地做点事情,当然要hook内核API了(不过hook用户态API也有诸多用途)。

Hook内核API比较常见的是SSDT hook,一句话——Windows把需要调用的内核API地址全都存在了一个表中(System Service Descriptor Table),要想hook一个内核API,比较简单的办法就是把该内核API在表(SSDT)中保存的地址修改为自己撰写的函数地址。这个道理类似于把"Windows"先生的"内核API电话簿"给篡改了,当老先生想要打电话给"被hook的api先生"时,他找到的"电话号码"其实已被我们篡改,拨通电话,我们的"函数小子"开始应答,信息过滤自此开始。

非常不幸,ICESword等检测工具可以轻松判断SSDT是否被篡改,并且会以适当的方式通知用户(比如检索结果的字体变红)。

Inline Hook要比SSDT Hook来得更彻底一点。如果说SSDT Hook只是把某位"内核API先生"绑架,然后用我们的“自己人”来接管其工作,而ICESword却可以从其他联系途径找到被绑架的"内核API先生"并“报警”,那么——Inline Hook可以说是给"内核API先生"动了手术,让他成为"我们阵营的一分子"。Inline Hook通过硬编码的方式向内核API的内存空间(通常是开始的一段字节,且一般在第一个call之前,这么做是为了防止堆栈混乱)写入跳转语句,这样,该API只要被调用,程序就会跳转到我们的函数中来,我们在自己写的函数里需要完成3个任务:
1)重新调整当前堆栈。程序流程在刚刚跳转的时候,内核API并没有执行完,而我们的函数需要根据其结果来进行信息过滤,所以我们需要保证内核API能在顺利执行完毕后返回到我们的函数中来,这就要求对当前堆栈做一个调整。
2)执行遗失的指令。我们向内核API地址空间些如跳转指令(jmp xxxxxxxx)时,势必要覆盖原先的一些汇编指令,所以我们一定要保证这些被覆盖的指令能够顺利执行(否则,你的及其就要BSOD了,呵呵,Blue Screen Of Death)。关于这部分指令的执行,一般是将其放在我们的函数中,让我们的函数“帮助”内核API执行完被覆盖的指令,然后再跳回内核API中被覆盖内后后的地址继续执行剩余内容。跳回去的时候,一定要算好是跳回到什么地址,是内核API起始地址后的第几个字节。
一个朋友曾提出把内核API的被覆盖内容还原,然后执行之——这种方法,我没有试验,但我认为应该不会很稳定,因为内核里常有线程切换,如果你把内核API还原,万一自己函数的线程被挂起,而又有线程要调用给API,这就会出现“Hook 遗漏”。
3)信息过滤。这个就不用多说了,内核API顺利执行并返回到我们的函数中,我们自然要根据其结果做一些信息过滤,这部分内容因被hook的API以及Hook目的的不同而不同。

Inline hook的工作流程:
1)验证内核API的版本(特征码匹配)。
2)撰写自己的函数,要完成以上三项任务。
2)获取自己函数的地址,覆盖内核API内存,供跳转。

Inline Hook的缺点:
1) 不够通用。各个windows版本中,内核API的开始一段不尽相同,要想通吃,就要多写几个版本或者做一个特征码搜索(因为有的内核API在各个版本中非常相似,只是在“特征码”之前或之后加一点东西)。
2) 已被一些检测工具列入检测范围,如果直接从内核API第一个字节开始覆盖,那么很容易被检测,如果把覆盖范围往后推,并加以变形,也许能抵挡一气。具体情况,我才疏学浅,尚未试验。

上文权且当作是以下两文的读书笔记:
1) kernel inline hook 绕过vice检测——xfocus上的文章
2) 实现kernel-mode inline function hook的简单方法(http://www.phpfav.com/?p=35)——5eCur!ty上的文章

大家可以去参看原文,文章1中的代码可以用文章2的方法优化一下。

转载于:https://www.cnblogs.com/dflower/archive/2009/09/21/1571006.html

Windows内核API HOOK 之 Inline Hook相关推荐

  1. PLT hook与Inline hook

    前言 在目前的安卓APP测试中对于Native Hook的需求越来越大,越来越多的APP开始逐渐使用NDK来开发核心或者敏感代码逻辑. 个人认为原因如下: 安全的考虑.各大APP越来越注重安全性,ND ...

  2. IAT hook与inline hook的区别

    IAT hook 导入表hook原理:修改导入表中某函数的地址到自己的补丁函数.IATHook 通过GetProcAddress获取目标函数地址 在程序内存中找到所在dll的导入表 查找目标函数地址保 ...

  3. SSDT Hook的妙用-对抗ring0 inline hook

    ******************************************************* *标题:[原创]SSDT Hook的妙用-对抗ring0 inline hook  * ...

  4. Inline Hook Syscall 详解

    文章目录 1. hook一般syscall 2. hook stub syscall 2.1 stub_xxx 原理 2.2 方法1:hook `stub_xxx` 2.3 方法2:hook `cal ...

  5. 【梅哥的Ring0湿润插入教程】第一课Windows内核/驱动编程概述及应用、商业驱动保护软件原理分析...

    [梅哥的Ring0湿润插入教程] Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋! 第一课Windows内核/驱动编程概述及应用. 商业驱动保护软 ...

  6. Windows内核实验005 Inline Hook

    文章目录 准备工作 寻找Inline Hook的返回地址 编写代码 动态变化的返回地址 JmpTargetAddr Inline Hook基本框架 示例代码 实战HOOK KiTrap01 无需计算偏 ...

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

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

  8. Ring3下Inline Hook API

    用CreateFile为例子,讲解一下Ring3下的Inline Hook API,基本原理很简单 1.获取CreateFile函数的地址 2.读取CreateFile函数的前8个字节 3.将Crea ...

  9. 学习windows 应用层 inline hook 原理总结

    inline hook 实际上就是指 通过改变目标函数头部的代码来使改变后的代码跳转到我们自己设置的一个函数里,产生hook. 今天就拿MessageBoxA这个api函数来做实验.功能就是当程序调用 ...

最新文章

  1. Ubuntu16.04 Table无法自动补全
  2. maven中spring-boot-dependencies变量名冲突
  3. 【Mysql】MySQL event 计划任务
  4. 项目奖金一般有多少_全年一次性奖金如何进行纳税筹划?
  5. nest 架构_如何与其他人分享您的Nest Cam Feed
  6. C/C++程序从源代码到可执行程序的流程
  7. mysql 创建删除表_mysql创建删除表的的详细解析
  8. linux实现双网卡互通,linux 双网卡互通配置
  9. 矩阵的舒尔补(Schur complement)
  10. 电驴emule使用教程
  11. (转载)学好 Python 的 11 个优秀资源
  12. 英语日常短语积累(1)
  13. 第十二届蓝桥杯 ——国际象棋
  14. 世上真有后悔药,删除的数据文件可恢复,6款免费数据恢复软件
  15. Windows共享、打印机操作、远程桌面
  16. excel下拉表格复制公式不自动递增
  17. 【DR_CAN-MPC学习笔记】1.最优化控制和MPC基本概念
  18. 摆脱社恐六部曲, 你可以的!
  19. Python中plot() 淘宝历史价格,js chrome 插件
  20. 无忧启动源码 仿音速启动

热门文章

  1. Oracle的order by的中文排序问题
  2. PCI-E 5.0标准公布:速度再次翻番达32GT/s
  3. Kubernetes的系统架构与设计理念
  4. 算法笔记_072:N皇后问题(Java)
  5. oracle创建索引后sqlldr导入错误
  6. puppet成长日记二 Package资源详细介绍及案例分析
  7. VMware ESXI5.0的安装配置
  8. 你要练神功,就应该先自宫,对不?
  9. jq写的项目如何部署到静态服务器_如何把前端项目部署到服务器
  10. Linux下的虚拟机安装