将Windows内核分派器挂接到系统调用

时间:2018-10-28 14:47:36

标签: windows hook system-calls sysenter

我正在尝试从内核中挂起SYSENTER调度函数,在过去的几天中,我正在研究程序执行SYSENTER并想进入内核然后意识到{ {1}}和IA32_SYSENTER_EIP负责在IA32_SYSENTER_ESP之后设置内核RIPRSP

昨天我阅读了有关SYSENTER的英特尔软件开发人员手册:

  

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

     

使用SYSCALL实施系统调用时,没有内核堆栈   在操作系统入口点。也没有直接的方法来   获取指向内核结构的指针,内核堆栈从该结构中获取   指针可以被读取。因此,内核无法保存通用目标   寄存器或参考存储器。

从第二段开始,SWAPGS似乎是OS内核执行there is no kernel stack at the OS entry point来设置SWAPGS,然后获取内核堆栈指针,但正如我所读的,在GS中内核RIP(EIP)和RSP(ESP)应该从SYSENTERIA32_SYSENTER_EIP设置,以便内核将其堆栈指针放在IA32_SYSENTER_ESP中!

我的问题:

  1. 如果内核堆栈地址应该来自GS,那么IA32_SYSENTER_ESP的目的是什么?
  2. IA32_SYSENTER_ESPAMD LSTAR (0xC0000082)之间有什么区别?我之所以这样问,是因为我看到Windows在我的Intel处理器上设置了0xc0000082。
  3. 挂接内核SYSENTER调度程序是否存在任何特殊问题?这是因为每当我在负责在远程调试机(而非VM)上调度SYSENTER调用(KiSystemCall64Shadow)的Windows函数中放置一个断点时,就会导致UNODPECTED_KERNEL_MODE_TRAP导致BSOD。

0 个答案:

没有答案
相关问题