驱动层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函数解锁。


posted @ 2013-08-17 16:07  vcerror  阅读(406)  评论(0编辑  收藏  举报