windows - 为系统调用挂钩 Windows 内核调度程序
问题描述
我正在尝试SYSENTER
从内核中挂钩调度功能,在过去的几天里,我正在研究程序执行SYSENTER
并想要进入内核时会发生什么,然后我意识到IA32_SYSENTER_EIP
并IA32_SYSENTER_ESP
负责设置内核RIP
和RSP
之后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_EIP
,IA32_SYSENTER_ESP
因此内核的堆栈指针在IA32_SYSENTER_ESP
!
我的问题:
- 如果内核堆栈地址应该来自GS,那么目的是
IA32_SYSENTER_ESP
什么? AMD LSTAR (0xC0000082)
和 和有什么区别IA32_SYSENTER_EIP
?我问它是因为我看到 Windows 在我的英特尔处理器上设置了 0xc0000082。- 挂钩内核SYSENTER调度程序是否有任何特殊问题?这是因为每当我在负责在远程调试机器(不是VM)上调度SYSENTER调用(KiSystemCall64Shadow)的Windows函数中放置断点时,它都会导致带有UNEXPECTED_KERNEL_MODE_TRAP的BSOD。
解决方案
推荐阅读
- flutter - 如何在 Flutter 中临时保存文件?
- git - 创建 git 分支时出错 - 偏移量和长度超出了数组的范围
- sql - 为什么在 WHERE 子句中使用 CONVERT(DATETIME, [date], [format]) 需要这么长时间?
- vue.js - 相关项目的链接断开
- python - 使用 EvolutionaryFS 时,只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是有效的索引
- compression - 如何使用预测概率模型压缩序列?
- ruby-on-rails - 在 Heroku 上部署失败 - Ruby(在 Windows 上)
- python - 如何在pygame中添加具有原始图像形状的白色表面?
- node.js - 如何在没有“新关注者”或“回复消息”的情况下在 NodeJS Twitter 机器人中发送 DM
- angular - 一些pdf文件的AngularFireStorage上传问题