• 驱动层hook系统函数的时,如何屏蔽掉只读属性?


    对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向只读页面执行写操作;当该位复位时则反之。因此,在写前把设置该位就可以

    1. cli
    2. mov eax, cr0
    3. and eax, -65537             ; fffeffffH
    4. mov cr0, eax

    写完后,再把该位设置回去:

    1. mov cr0, eax
    2. sti
    1. 主要是设置cr0WP(Write Protect)位来禁止内存的只读保护。使用以下两个函数设置cr0
    2. _inline void WPOFF()
    3. {
    4. ULONG uAttr;
    5. _asm
    6. {
    7.         cli
    8.     push eax
    9. mov eax, cr0
    10. mov g_uCr0, eax
    11. and eax, 0FFFEFFFFh // CR0 16 BIT = 0
    12. mov cr0, eax
    13. pop eax
    14. };
    15. }
    16. _inline void WPON()
    17. {
    18. _asm
    19.     {
    20.     push eax
    21. mov eax, g_uCr0 //恢復原有 CR0 屬性
    22. mov cr0, eax
    23.         pop eax
    24.     sti
    25. };
    26. }

    但修改的时候要注意:
    1.“提升中断请求级”到DPC,屏蔽APC和普通优先级别的中断。更重要的是防止线程调度(CPU调度程序是在DPC级别),因为修改cr0的时候被中断或切换,会造出以外的结果(蓝屏死机)。使用KeRaiseIrqlToDpcLevel提高中断请求级到DPC,KeLowerIrql恢复到原中断级。
    2.对于多CPU的系统,为了防止被切换到另一个CPU上运行程序,此时要加内核锁。使用KeAcquireSpinLock函数上锁,KeReleaseSpinLock函数解锁。


  • 相关阅读:
    JDBC---bai
    下拉列表---demo---bai
    智能提示框---bai
    国际化---demo1---bai
    自定义数据校验(4)---demo3---bai
    数据校验(3)--demo2---bai
    json概述
    redis持久化
    MyBatis中动态SQL语句完成多条件查询
    Jedis连接redis的一些基本操作
  • 原文地址:https://www.cnblogs.com/vcerror/p/4289218.html
Copyright © 2020-2023  润新知