找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 189|回复: 0

【驱动笔记13】CR0寄存器的使用

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-10-16 23:33:40 | 显示全部楼层 |阅读模式
[bgcolor=#ffffff]整体看来还没有什么需要修改的,只简单修改了部分注释。忽然看到在HOOK SSDT前修改cr0寄存器的代码,想到另外一种方法是通过修改MDL的方式已经基本理解了,但这一种方法还不是特别熟悉,怕到答辩的时候被问起,就复习一下。[/bgcolor]
[bgcolor=#ffffff]为了安全起见,Windows XP及其以后的系统将一些重要的内存页设置为只读属性,这样就算有权力访问该表也不能随意对其修改,例如SSDT、IDT等。但这种方法很容易被绕过,我们只要将这些部分修改为可写属性就可以了,不过当我们的事情做完后记得把它们恢复为只读属性,不然会造成一些很难预料到的后果。[/bgcolor]
[bgcolor=#ffffff]cr0是系统内的控制寄存器之一。控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性。[/bgcolor]
[bgcolor=#ffffff]控制寄存器最初出现于低级的286处理器中,以前称之为机器状态字(machine status word),在386以后它们被重命名为控制寄存器(control register)。cr0寄存器直到486的处理器版本才被加入了“写保护”(Write Protect,WP)位,WP位控制是否允许处理器向标记为只读属性的内存页写入数据,如果我们将WP位设置为0,就可以禁用写保护的功能。[/bgcolor]
[bgcolor=#ffffff]cr0的第16位是WP位,只要将这一位置0就可以禁用写保护,置1则可将其恢复。[/bgcolor]
[bgcolor=#ffffff]禁用和启用写保护的内联汇编代码如下所示:[/bgcolor]
[bgcolor=#ffffff]// 关闭写保护
__asm
{
    cli ;
    mov eax, cr0
    and  eax, ~0x10000
    mov cr0, eax
}
[/bgcolor]
[bgcolor=#ffffff]// 恢复写保护
__asm
{
    mov  eax, cr0
    or     eax, 0x10000
    mov  cr0, eax
    sti ;
}
[/bgcolor]
[bgcolor=#ffffff]需要注意的是,这里的cli和sti都是特权指令,必须在ring0才能使用的。[/bgcolor]
[bgcolor=#ffffff]除了cr0之外,还有4个控制寄存器。cr1未被使用(或者被偷偷使用了,但没有在文档中说明),cr2在处理器处于保护模式时存储上一个导致页故障的地址,cr3存储页目录的地址,cr4在Pentium系列(包括486的后期版本)处理器中才实现,它处理的事务包括诸如何时启用虚拟8086模式等。[/bgcolor]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 05:54 , Processed in 0.148251 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表