阿九的博客

我写的程序很烂 上帝都看不懂

如何在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

 这样就不会出错 

 

 


posted on 2009-04-14 17:35  阿九  阅读(2677)  评论(1编辑  收藏  举报

导航