前言
之前,跟着海哥学习了windows内核的一些机制,包括保护模式,异常处理,消息机制等等,使用的环境是XP系统。
但是,在实际工作中,面对需要用到x64内核相关的内容时,依旧会感到茫然无措,毕竟脑中的知识只局限在32位内核。
随着时代发展,64位系统未来必将成为主流,但苦于市面上关于x64的教程非常少,因此一直没有机会系统化学习。
前段时间才发现周壑老师出了一套名为「x64内核研究」的教程,不得不说周壑老师真是太牛了。
那么,就让我们一起来学习x64内核吧。
新特性
相较于x32内核而言,x64内核包含以下几个新特性
- SMEP / SMAP
分别为控制寄存器Cr4的两个标志位,用于控制内核对用户层的数据读写与执行的权限。
例如如果像x32内核一样,在x64中做idt后门,那么可能会产生类似「三重错误」的错误。 - KPTI
内核页表隔离,Win10在2018年初更新的补丁,使得一个进程对应两个Cr3,处理用户层和内核层时拥有两个idt表。 - 硬件漏洞(幽灵、熔断)相关(介绍)
- CFG(介绍)
- Patch Guard
内核补丁保护,不能随意对x64内核进行patch,否则会触发不定时蓝屏。 - DSE强制签名(介绍)
基础要求
- C语言
- x64汇编
- x86保护模式
实验环境
- 虚拟机:VMware Workstation(15.1.0)版本及以上
- 操作系统:Windows 10 1903 (笔者使用的小版本是18362.356)
- 调试器:Windbg(10.0.18362.1)
- C语言(x64)开发环境:Visual Studio(2010)版本及以上
- 驱动(x64)开发环境:WDK(7600)版本及以上
- 其他工具:CE(7.0)版本及以上;DebugView(4.9.0)版本及以上
Guest Win10配置
- 由于本次学习不涉及到VT,因此可以把VT支持关掉。
- 可以调整蓝屏时产生转储文件的大小
- 转储文件的路径最好也改一下:
- 开启调试模式和测试模式
// 1. 查看当前的启动项信息 bcdedit /enum {current} // 2. 复制一个启动项,并开启调试模式和测试模式 bcdedit /copy {current} /d "Windows Debug Entry" bcdedit /dbgsettings serial baudrate:115200 debugport:1 // ID是第一条命令执行后提供的启动项标识符 bcdedit /debug {ID} ON bcdedit /set {ID} TESTSIGNING on // 3.(可选)添加一个只禁用驱动签名的启动项 bcdedit /copy {current} /d "Windows Nointegritycheck Entry" // ID是上一条命令执行后提供的启动项标识符 bcdedit /set {ID} nointegritychecks on
问题解决
在尝试使用DbgView64监视核心时,可能会报错
解决方法:关闭UAC
- 使用「Command+R」输入「gpedit.msc」,打开本地策略组编辑器。
- 依次展开「计算机配置」-「Windows设置」-「安全设置」-「本地策略」-「安全选项」,在具体策略中找到用于账户控制相关配置
- 将「用户账户控制:以管理员批准模式运行所有管理员」设置为「已禁用」。
好了,接下来进行重启,就能够监视核心了,然后就可以在Host OS使用WinDbg进行双机调试了。
参考资料
- bilibili周壑:x64内核研究系列教程