前段时间总结了枚举系统进程的N种方法,属于科普类读物。链接如下:
http://bbs.pediy.com/showthread.php?p=758997#post758997
这几天想针对上面的枚举方法,隐藏进程。首先实现的就是SSDT Hook ZwQuerySystemInfor实现进程隐藏,这已经是一项很老的技术了。
qiweixue 在他的文章里面写的很清楚:
http://bbs.pediy.com/showthread.php?t=36742&highlight=%E9%9A%90%E8%97%8F+%E8%97%8F%E8%BF%9B+%E8%BF%9B%E7%A8%8B
这篇文章有点小错误,在sislcb的【原创】对 Hook 内核ntoskrnl'sZwQuerySystemInformation隐藏任务管理器进程名 的一点完善 文章中进程了完善,链接如下:
http://bbs.pediy.com/showthread.php?t=56830但我在实现的时候,发现sislcb的这篇文章也存在一下小失误。主要是:隐藏进程在信息开头时,未处理好,他的处理代码如下:
 if(prev) 
            { 
              //要删除的信息在中间,则把指针指向下一个节点
              if(curr->NextEntryDelta) 
                prev->NextEntryDelta += curr->NextEntryDelta; 
              else 
                prev->NextEntryDelta = 0; //要删除的信息在末尾,则直接把指针指向0
            } 
            else 
            { 
              if(curr->NextEntryDelta)       //这个地方处理错误
                (char *)SystemInformation += curr->NextEntryDelta; //要删除的信息在开头
         else 
                SystemInformation = NULL; 
            } 
虽然不是什么大错误,也不影响作者想隐藏自己的进程,因为一般信息开头是Idle进程。但为了让程序更加健全,小弟将该处的错误以及更正方式,贴出来。以便大家对这个技术有个全面的掌握。
    错误的原因是,SystemInformation是个指针变量,在内部改变它的值并不影响外部,我们在函数内部只能改变它指向的内容。呵呵,很基本的C知识吧。但却常常被人忽略。所以作者上面的改变方式,对SystemInformation值没任何影响。具体方法应该是:
ULONG len = sizeof( SystemProcessInformation );
ULONG uOffet = ((PSystemProcessInformation)SystemInformation)->NextEntryDelta;
pCur = (PSystemProcessInformation)((ULONG)pCur + pCur->NextEntryDelta);
memcpy( SystemInformation, pCur, len );
((PSystemProcessInformation)SystemInformation)->NextEntryDelta += uOffet;
我实现的代码见附件
HookZwQuerySystemInformation.rar