您的位置:首页 > 其它

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)预防方法:可适用函数判断

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(){}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: