遍历EPROCESS中的ActiveProcessLinks枚举进程

遍历EPROCESS中的ActiveProcessLinks枚举进程
 

前面对PEB的相关结构和其中的重要成员进行了分析和学习,现在开始真正进入内核,学习内 核中的一些结构.
这个EPROCESS结构在ntddk.h中有定义,但是并未给出具体的结构,因此要得到EPROCESS中一些重要的成员变量,只能通过偏移的方法,比 如PID,ImageName等.这些偏移可以在Windbg中dt _EPROCESS得到,但是不公开感觉还是不爽,而且这东西在不同的系统版本中不一样,如果要兼容的话,就必须先判断操作系统版本.
在此程序中用到的相关偏移如下:
#define EPROCESS_ACTIVELIST_OFFSET 0x88  //活动进程链
#define EPROCESS_PID_OFFSET 0x84                     //PID了
#define EPROCESS_IMAGENAME_OFFSET 0x174    //映像名称
#define EPROCESS_FLINK_OFFSET 0x88                //双链表的前向指针
#define EPROCESS_BLINK_OFFSET 0x8C                //双链表的后向指针

由于是第一次写驱动,有些写法还不太清楚,下面的代码参考了别人的一些.
VOID ShowEPROCESS(void)
{
DWORD EProcess,FirstEProcess;
LIST_ENTRY*     ActiveProcessLinks;
DWORD pid,dwCount=0;
PUCHAR pImage;
PPROCESS_INFO ProcessInfo={0};
EProcess=FirstEProcess=(DWORD)PsGetCurrentProcess();
//pid=*(DWORD*)((char*)EProcess+EPROCESS_PID_OFFSET);
__try {  
        while ( EProcess!= 0)  
        {  
            dwCount++;  
    pid= *( (DWORD*)( EProcess + EPROCESS_PID_OFFSET ) );  
            pImage= (PUCHAR)( EProcess + EPROCESS_IMAGENAME_OFFSET ) ;  
   
            DbgPrint ( "[Pid=%8d] EProcess=0x%08X %s\n", pid, EProcess, pImage) ;  
   
            ActiveProcessLinks = (LIST_ENTRY*) ( EProcess + EPROCESS_FLINK_OFFSET ) ;  
            EProcess = (DWORD)ActiveProcessLinks->Flink - EPROCESS_FLINK_OFFSET ;   
   
            if ( EProcess == FirstEProcess )  
                break ;  
        }  
        DbgPrint ( "ProcessCount = %d\n", dwCount ) ;  
    }
__except ( 1 ) {  
        DbgPrint ( "EnumProcessList exception !" ) ;  
    }


}

上面代码的实现思想很简单,因为系统中所有进程的EPROCESS通过它的一个成员变ActiveProcessLinks这个双向链表连接起来, 遍历链表的操作很简单,每得到一个ActiveProcessLinks,取其地址,再减去它离EPROCESS结构入口处的偏移,就可以得到 EPROCESS的地址了,然后就可以轻松得到想要的成员变量.

下面的结果图:

结果比实际进程数要多,表明其中有一部分其实是僵尸进程,已经死掉却还在进程链上挂着.
由此我感觉到,这个进程链并不是那么严格,因此也就可以把正常进程从链上摘掉,这为下面的隐藏进程实现提供了基础.
至于对抗这种检测方法,很简单,DKOM把想要隐藏的进程从活动进程链上摘掉即可.
实现原理如下图(用画图画的,很粗糙):


图中,着色部分即是LIST_ENTRY结构,绿色指针Flink指向前一个,黄色指针Blink指向后一个.
正常的连接情况如蓝线所示,若要摘要某个结点,修改该结点前后两个结点的指针即可,修改示意如红线所示. 同 时,还要把被隐藏的进程的EPROCESS中的两个指针都修改为NULL.
这样,通过遍历双链表的方法就找不到这个进程了,这就是最简单的DKOM法隐藏进程.
今天搞了不少,困了,明天抽时间把这个隐藏来实现一下.睡觉去了~

你可能感兴趣的:(职场,休闲)