驱动层hook系统函数的时,如何屏蔽掉只读属性?
2024-08-23 21:32:10
对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向只读页面执行写操作;当该位复位时则反之。因此,在写前把设置该位就可以
- cli
- mov eax, cr0
- and eax, -65537 ; fffeffffH
- mov cr0, eax
写完后,再把该位设置回去:
- mov cr0, eax
- sti
- 主要是设置cr0的WP(Write Protect)位来禁止内存的只读保护。使用以下两个函数设置cr0
- _inline void WPOFF()
- {
- ULONG uAttr;
- _asm
- {
- cli
- push eax
- mov eax, cr0
- mov g_uCr0, eax
- and eax, 0FFFEFFFFh // CR0 16 BIT = 0
- mov cr0, eax
- pop eax
- };
- }
- _inline void WPON()
- {
- _asm
- {
- push eax
- mov eax, g_uCr0 //恢復原有 CR0 屬性
- mov cr0, eax
- pop eax
- sti
- };
- }
但修改的时候要注意:
1.“提升中断请求级”到DPC,屏蔽APC和普通优先级别的中断。更重要的是防止线程调度(CPU调度程序是在DPC级别),因为修改cr0的时候被中断或切换,会造出以外的结果(蓝屏死机)。使用KeRaiseIrqlToDpcLevel提高中断请求级到DPC,KeLowerIrql恢复到原中断级。
2.对于多CPU的系统,为了防止被切换到另一个CPU上运行程序,此时要加内核锁。使用KeAcquireSpinLock函数上锁,KeReleaseSpinLock函数解锁。
最新文章
- 集合(set)-Python3
- class中new与未new的区别 类对象占用空间--转载
- javascript运算符——条件、逗号、赋值、()和void运算符
- #8.10.16总结# 属性选择符 伪对象选择符 CSS的常用样式
- js中各种宽高
- 【原创】14. MYSQL++之SSQLS(原理解析)
- Length of Last Word
- hbase0.96与hive0.12整合高可靠文档及问题总结
- Lua运算符
- HDU_2055——刷题不要使用fflush()
- 关于覆盖Object中的hashCode, equals和toString
- vue-router 中router-view不能渲染
- [array] leetcode - 42. Trapping Rain Water - Hard
- TF之BN:BN算法对多层中的每层神经网络加快学习QuadraticFunction_InputData+Histogram+BN的Error_curve
- 深度学习框架Tensor张量的操作使用
- 【LeetCode每天一题】Substring with Concatenation of All Words(具备列表中所有单词的字串)
- leetcode-algorithms-35 Search Insert Position
- Linux中Postfix邮件接收配置(四)
- 【51nod】1655 染色问题
- 【php】基础学习3
热门文章
- Window10 64bit Tomcat9 安装
- 2019牛客暑期多校训练营(第六场)Palindrome Mouse 回文树+dfs
- Linux --赋予普通用户root 权限
- spark运行任务报错:Container [...] is running beyond physical memory limits. Current usage: 3.0 GB of 3 GB physical memory used; 5.0 GB of 6.3 GB virtual memory used. Killing container.
- 34. Thread类的常用方法
- C#/.NET 实现的多屏联动,多屏共享,显示到指定屏幕上
- delphi Copy函数 和 Pos函数
- 依赖背包变形(经典)——poj1155
- NX二次开发-UFUN单对象选择对话框UF_UI_select_with_single_dialog
- NX二次开发-UFUN拉伸函数UF_MODL_create_extruded2