x64驱动 关闭&开启 写时保护
2023-09-11 14:13:59 时间
背景
在内核里想要写入“别人的”内存(一般指 NTOS 等系统模块的内存空间),需要遵守一个规则 : IRQL和内存保护。
- IRQL称为中断请求级别,从0~31 共32个级别
- 内存保护可以打开和关闭,如果在内存处于保护状态时写入,会导致蓝屏
一般来说,要写入“别人的”内核内存,必须关闭内存写保护,并把 IRQL提升到 2 才行(绝大多数候时候 IRQL 都为 0 ,当IRQL=2时,会阻断大部分线程执行,防止执行出错)。
内存是否处于写保护的状态记录在 CR0 寄存器上,因此直接修改CR0寄存器的值即可。而提升或降低IRQL则使用KeRaiseIrqlToDpcLevel和KeLowerIrql实现(WIN64的IRQL值记录在CR8寄存器上,而WIN32的IRQL值记录在KPCR上)。
代码示例
// 需要 #include <intrin.h>
// write protect off
KIRQL WPOFFx64()
{
// 提高中断请求优先级到 DISPATCH_LEVEL 级别
KIRQL irql = KeRaiseIrqlToDpcLevel();
// 获取 cr0 寄存器中的值(cr0 控制 cpu 的操作模式)
UINT64 cr0 = __readcr0();
// 修改写保护
cr0 &= 0xfffffffffffeffff;
__writecr0(cr0);
// 禁用中断
_disable();
return irql;
}
// write protect on
void WPONx64(KIRQL irql)
{
// 获取 cr0 中的值
UINT64 cr0 = __readcr0();
// 恢复写保护
cr0 |= 0x10000;
__writecr0(cr0);
// 恢复中断
_enable();
// 恢复 IRQL 到原始值
KeLowerIrql(irql);
}
相关文章
- STM32L431驱动带UC1698芯片调试记录
- PHP 5.3以上版本推荐使用mysqlnd驱动
- neo4j 未修改jdbc驱动中的连接用户名与密码错识
- 大数据在企业中发挥的作用,以及如何驱动企业创新
- 批量查看设备驱动版本和制造商
- android移植wifi驱动流程
- Mock服务设计与实现:MySQL驱动字节码修改增强
- 【华为云技术分享】小熊派华为物联网操作系统LiteOS裸机驱动移植02-LCD驱动移植及使用
- ubuntu安装 显卡驱动和cuda
- 测试驱动开发?
- 测试开发 | Junit5 + YAML 轻松实现参数化和数据驱动,让 App 自动化测试更高效(一)
- 一文8个步骤从0到1教你基于数据驱动的接口自动化框架封装
- 第三代电力电子半导体:SiC MOSFET学习笔记(四)SiC MOSFET传统驱动电路保护