Hook内核函数注意点(学习笔记)
2013-08-27 17:17
357 查看
1.注意函数的IRQL等级,有些函数只能运行在PASSIVE_LEVEL,如果级别过高就会蓝屏(至于IRQL级别可查看:http://baike.baidu.com/link?url=RvjyQWQf9bJsEz1Q2Upnotx0K9a_pU8xBvHkq4A1XTGbJ5YE0Nctyg_uGt4Ryg9_)
1)例如查看MSDN 的ZwSetInformationFile 函数:
可知:Callers of ZwSetInformationFile must be running at IRQL = PASSIVE_LEVEL
微软特别指定,这个函数只能运行在PASSIVE_LEVEL级别上,如果你在DISPATCH_LEVEL这个级别下运行ZwSetInformationFile那么,
就会产生蓝屏。
2)预防方法:可适用函数判断
3.函数参数中 Out参数要进行检验:_try{}_except(){}
1)例如查看MSDN 的ZwSetInformationFile 函数:
可知:Callers of ZwSetInformationFile must be running at IRQL = PASSIVE_LEVEL
微软特别指定,这个函数只能运行在PASSIVE_LEVEL级别上,如果你在DISPATCH_LEVEL这个级别下运行ZwSetInformationFile那么,
就会产生蓝屏。
2)预防方法:可适用函数判断
if (KeGetCurrentIrql() > PASSIVE_LEVEL) { return STATUS_UNSUCCESSFUL; }2.函数参数中 in参数要进行检验:检验是否可读(ProcForRead ),可写(ProcForWrite),是否为空 (NULL)
KPROCESSOR_MODE PreMode; //获取当前的MODE PreMode = ExGetPreviousMode(); if(PreMode != KernelMode) //如果非内核模式,就要开始检查IN的这些参数都否可读 { __try { //这里用ProbeForRead来对参数ClientId进行测试,然后加try捕获 ProbeForRead(xxxx, sizeof(HANDLE), sizeof(ULONG)); } __except(EXCEPTION_EXECUTE_HANDLER) { retrun false } }
if(xxxx== NULL && !MmIsAddressValid(xxxx))//是否为空,内存地址是否有效 { return false; }
3.函数参数中 Out参数要进行检验:_try{}_except(){}
相关文章推荐
- Windows内核学习笔记(二)-- IoCallDriver函数与PoCallDriver函数
- Linux netfilter 学习笔记 之二 ip 层netfilter的hook 注册以及执行hook函数的概要分析
- Linux netfilter 学习笔记 之六 ip层netfilter的filter表的创建及其hook函数分析
- Linux netfilter 学习笔记 之二 ip 层netfilter的hook 注册以及执行hook函数的概要分析
- Flask学习笔记之钩子函数(hook)
- opencv学习笔记:特征点匹配函数使用注意
- Linux Kernel 学习笔记10:hook函数
- Linux Kernel 学习笔记10:hook函数
- 内核编程学习笔记(003) SSDT hook 所延伸出来的知识
- Linux netfilter 学习笔记 之六 ip层netfilter的filter表的创建及其hook函数分析
- <寒江独钓>学习笔记 -- 第四章 Hook分发函数 过滤键盘输入
- C++ Template学习笔记之函数模板(1)——函数模板定义
- C++ Template学习笔记之函数模板(6)——模板显式特化
- MySQL学习笔记之常用函数
- Matlab学习笔记(一)基础函数
- 我的内核学习笔记13:x86平台linux系统重启流程跟踪
- 学习笔记PHP字符串处理函数总结
- JS入门学习笔记——函数入门
- C++ Primer 第6章 函数 学习笔记
- Git学习笔记总结和注意事项