• ring0 关于SSDTHook使用的绕过页面写保护的原理与实现


    原博:http://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html

    为了安全起见,Windows XP及其以后的系统将一些重要的内存页设置为只读属性,这样就算有权力访问该表也不能随意对其修改,例如SSDT、IDT等。但这种方法很容易被绕过,我们只要将这些部分修改为可写属性就可以了,不过当我们的事情做完后记得把它们恢复为只读属性,不然会造成一些很难预料到的后果。
      cr0是系统内的控制寄存器之一。控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性。
      控制寄存器最初出现于低级的286处理器中,以前称之为机器状态字(machine status word),在386以后它们被重命名为控制寄存器(control register)。
      cr0寄存器直到486的处理器版本才被加入了“写保护”(Write Protect,WP)位,WP位控制是否允许处理器向标记为只读属性的内存页写入数据。
      WP位0:禁用写保护的功能
      WP位1:开启写保护的功能
    cr0的第16位是WP位,只要将这一位置0就可以禁用写保护,置1则可将其恢复。
    禁用写保护的操作步骤:
    1 shl 16(1左移16位)//结果:10000000000000000
    对结果取反 not (1 shl 16)//结果:FFFEFFFF=01111111111111111
    对cr0的值进行“逻辑与”运算:and cr0,  01111111111111111 //即将第17位置0,其余位不变
    启用写保护的操作步骤:
    直接对CR0的值进行“逻辑或”运算:or cr0,10000000000000000//即将第17位置1,其余位不变
    禁用和启用写保护的内联汇编代码如下所示:
    // 关闭写保护
    __asm
    {
        cli ;//将处理器标志寄存器的中断标志位清0,不允许中断
        mov eax, cr0
        and  eax, ~0x10000 // 0x10000 = 10000000000000000
        mov cr0, eax
    }
    // 恢复写保护
    __asm
    {
        mov  eax, cr0
        or     eax, 0x10000
        mov  cr0, eax
        sti ;//将处理器标志寄存器的中断标志置1,允许中断
    }
    注意:cli和sti都是特权指令,必须在ring0才能使用的。

    关于PTE的结构,微软没有公开,除了写保护,对于写实拷贝的关闭,也时通过修改PTE的第九项实现,具体的原理和操作,还需要研究

  • 相关阅读:
    跨浏览器 JavaScript判断窗口是否最小化
    .net 5 获取用户真实IP(nginx)
    C# EF 字符串模糊查询完整实例 lambda
    (zt)过程生成
    (zt)IOS开发常用的开源类库和一些示例
    wp7 生命周期及多任务 详解
    Js中concat()与push()的区别
    Ruby中p、print和puts的区别
    jquery Bug:当表单中包含name为nodeType的input时jquery选择器失效的bug 与您分享我的快乐
    Openlaszlo学习(一)Demo "Applying Constraints"的修改 与您分享我的快乐
  • 原文地址:https://www.cnblogs.com/HsinTsao/p/7427891.html
Copyright © 2020-2023  润新知