VT Msr Hook Syscall

文章详细介绍了系统调用的概念,以及VT(虚拟化技术)如何不修改系统代码,通过修改MSR寄存器来实现系统调用的Hook。在Hook过程中,需要绕过PatchGuard的检测,并在VMM的VM退出事件中处理读取MSR_LSTAR的事件,返回旧的系统调用地址。最后提到了在拦截所有系统调用时需要注意的性能问题。
摘要由CSDN通过智能技术生成
VT Msr Hook Syscall

什么是系统调用

  • 系统调用是内核提供给应用层的接口,比如在 win10x64 应用层打开一个应用,其实就是 explorer 调用了 CreateProcess,这个函数通过 NTDLL 调用表的 0xC8 号服务,执行 SYSCALL 进入内核。
  • 内核从 SSDT 服务表确定了函数参数个数,复制到内核栈中,取出对应内核函数地址,再 CALL 这个地址。
  • 执行创建进程的一系列操作后,用 SYSRET 返回到应用层,返回到调用 SYSCALL 的地方,这就完成了一次系统调用。

VT如何拦截系统调用

  • VT 不需要修改任何系统代码,只修改 MSR 寄存器,就可以达到 Hook 的目的。
  • MSR_LSTAR 这个特殊寄存器里存放的是 SYSCALL 的入口地址,我们只需要写个替换函数,把地址写入这个 MSR 即可完成挂钩,同时也要保存旧的 SYSCALL 地址。
  • PatchGuard 是微软的用来保护内核的模块,它会检查这个 MSR 是否被修改过,修改过会给个 109 蓝屏。
  • 我们可以利用VT技术对读 MSR 进行拦截,如果它读取了这个 MSR 我们给它返回旧的 SYSCALL 地址,就可以欺骗 PatchGuard。

代码流程如下:

  1. 我们要在 VT 基础框架上加些代码
  2. 申请用来 保存MSR 的内存,和 MSR位图 的内存,写入到 VMCS 对应的字段中。
  3. 设置读取 MSR_LSTAR 的 MSR位图 监控。
  4. 编写一个用来替换 MSR_LSTAR 的汇编函数。
  5. 读取并保存旧的 MSR_LSTAR。
  6. 将替换函数按照格式写入 保存MSR 的内存。
  7. 设置 VMCS 的 VM进入控制 加载MSR个数为1。
  8. 在 VMM 的 VM退出 事件处理例程里处理 读取 MSR_LSATR 的事件,返回保存的旧 SYSCALL 地址。
  9. 卸载的时候,只需要把旧的 SYSCALL 地址按格式写回到 保存MSR 的地方。
  10. 取消读取 MSR_LSTAR 的 MSR位图 监控。

注意事项:
如果拦截所有系统调用的话,不要打印,调用非常频繁,所有的核都在忙着打印,windbg 在不停输出。
推荐只打印同一个进程的系统调用,感受一下时间切片,核心切换

效果图

在这里插入图片描述

源码

源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小烟囱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值