如何在Hook ZwCreateFile中继续创建文件
这样的说法很奇怪,我可是花了2天时间才找到解决的办法。哎 大牛们都睡觉去了,Google里面很难找到解决方案
先描述问题:
在内核态通过SSDT HOOK了ZwCreateFile,比如Hook后的函数名为Hook_ZwCreateFile 那么我现在在该函数里面想创建其他文件会就会失败,会出现STATUS_ACCESS_VIOLATION或者STATUS_INVALID_PARAMETER的错误,当然我是通过RealZwCreateFile 试图创建文件的。
在bbs.driverdevelop.com上找到办法:
http://bbs.driverdevelop.com/htm_data/16/0809/113576.html
“
由于你HOOK了ZwQueryValueKey,到你的处理函数中,线程上个模式是usermode
然后在调用old_zwxxxx时是直接调用函数地址,也没有做线程模式转换,因此在old_zwxxx中的probeforread就会拒绝你替换的,位于内核地址的参数了,返回访问违例
简单的解决办法是将线程的KThread->PreviousMode该为KernelMode,再调用old_zwxxx,调用完后再改回usermode
其他的解决办法也有,例如,你可以直接调用ZwXXX而不是old_zwxxx,并替换参数,此时上个模式就会从usermode变为kernel mode,但是这里你要在HOOK函数中判断是自己调用的,以免重入
其他的例如分配或者“借用"user mode的内存,也都是可以的了~
”
修改PreviousMode就可以了
调用RealZwCreateFile之前
PsGetCurrentThread()->Tcb.PreviousMode= KernelMode
调用完之后
PsGetCurrentThread()->Tcb.PreviousMode= UserMode
DDK里面没有KTHREAD的结构
参考 http://www.cnblogs.com/jokerfox/archive/2009/04/14/1435692.html
这样就不会出错