首页 > 解决方案 > 为系统调用挂钩 Windows 内核调度程序

问题描述

我正在尝试SYSENTER从内核中挂钩调度功能,在过去的几天里,我正在研究程序执行SYSENTER并想要进入内核时会发生什么,然后我意识到IA32_SYSENTER_EIPIA32_SYSENTER_ESP负责设置内核RIPRSP之后SYSENTER

昨天我阅读了英特尔软件开发人员手册SWAPGS

SWAPGS 将当前 GS 基址寄存器值与 MSR 地址 C0000102H (IA32_KERNEL_GS_BASE) 中包含的值交换。SWAPGS 指令是供系统软件使用的特权指令。

当使用 SYSCALL 实现系统调用时,在 OS 入口点没有内核栈。也没有一种直接的方法来获取指向内核结构的指针,从中可以读取内核堆栈指针。因此,内核无法保存通用寄存器或参考内存。

从第二段开始,there is no kernel stack at the OS entry point似乎操作系统内核执行SWAPGS设置GS然后获取内核堆栈指针,但正如我所读到的,SYSENTER内核中的 RIP(EIP) 和 RSP (ESP) 应该设置从IA32_SYSENTER_EIPIA32_SYSENTER_ESP因此内核的堆栈指针在IA32_SYSENTER_ESP

我的问题:

  1. 如果内核堆栈地址应该来自GS,那么目的是IA32_SYSENTER_ESP什么?
  2. AMD LSTAR (0xC0000082)和 和有什么区别IA32_SYSENTER_EIP?我问它是因为我看到 Windows 在我的英特尔处理器上设置了 0xc0000082。
  3. 挂钩内核SYSENTER调度程序是否有任何特殊问题?这是因为每当我在负责在远程调试机器(不是VM)上调度SYSENTER调用(KiSystemCall64Shadow)的Windows函数中放置断点时,它都会导致带有UNEXPECTED_KERNEL_MODE_TRAP的BSOD。

标签: windowshooksystem-callssysenter

解决方案


推荐阅读