if ( !_stricmp(name,"winlogon.exe") )
{
dbgprint("remove %s \n",name);
removeentrylist(list);
}
list=list->blink;
}
}
首先和上面的程序一样得到psactiveprocesshead 头的后面第一个eprocess块。然后和我们要隐藏的进程名字进行对比,如果不是指针延链下移动。如果是就把eprocess块从活动进程链上摘除。一直到遍历完一次活动进程的双向链表。当摘除指定进程的eprocess块后可以发现任务管理器里面的指定的进程消失了,然后又用上面的基于活动进程链表检测进程的程序一样的发现不到隐藏的进程。
基于线程调度链表的检测和隐藏技术
1. 什么是ethread和kthread块
windows2000是由执行程序线程(ethread)块表示的,ethread成员都是指向的系统空间,进程环境块(teb)除外。ethread块中的第一个结构体就是内核线程(kthread)块。在kthread块中包含了windows2000内核需要访问的信息。这些信息用于执行线程的调度和同步正在运行的线程。
kd> !kthread
struct _kthread (sizeof=432)
+000 struct _dispatcher_header header
+010 struct _list_entry mutantlisthead
+018 void *initialstack
+01c void *stacklimit
+020 void *teb
+024 void *tlsarray
+028 void *kernelstack
+02c byte debugactive
+02d byte state
+02e byte alerted[2]
+030 byte iopl
+031 byte npxstate
+032 char saturation
+033 char priority
+034 struct _kapc_state apcstate
+034 struct _list_entry apclisthead[2]
+044 struct _kprocess *process
+04c uint32 contextswitches
+050 int32 waitstatus
+054 byte waitirql
+055 char waitmode
+056 byte waitnext
+057 byte waitreason
+058 struct _kwait_block *waitblocklist
+05c struct _list_entry waitlistentry
+064 uint32 waittime
+068 char basepriority
+069 byte decrementcount
+06a char prioritydecrement
+06b char quantum
+06c struct _kwait_block waitblock[4]
+0cc void *legodata
+0d0 uint32 kernelapcdisable
+0d4 uint32 useraffinity
+0d8 byte systemaffinityactive
+0d9 byte powerstate
+0da byte npxirql
+0db byte pad[1]
+0dc void *servicetable
+0e0 struct _kqueue *queue
+0e4 uint32 apcqueuelock
+0e8 struct _ktimer timer
+110 struct _list_entry queuelistentry
+118 uint32 affinity
+11c byte preempted
+11d byte processreadyqueue
+11e byte kernelstackresident
+11f byte nextprocessor
+120 void *callbackstack
+124 void *win32thread
+128 struct _ktrap_frame *trapframe
+12c struct _kapc_state *apcstatepointer[2]
+134 char previou
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>