首页
社区
课程
招聘
[原创]ring0检测隐藏进程
2007-5-10 13:28 40643

[原创]ring0检测隐藏进程

2007-5-10 13:28
40643
//网上得到一篇好文章 Ring0下搜索内存枚举隐藏进程 ,但是拿里面的代码来使用的时候发现并没有太多效果
//于是修改之,终于实现了最初的目标
//由于直接搜索内存,跟系统调度没什么关系,所以能够枚举到各种方法隐藏的进程 包括断链、抹PspCidTable...
//甚至能枚举到已经"死掉"的进程,本程序通过进程的ExitTime来判断进程是不是已经结束
//除非能够把EProcess结构修改掉,但这个实现难度可能比较大,不知有没有哪位大侠试过(PID我修改过),欢迎讨论
//
//作者:堕落天才
//时间:2007年5月10日
//参考: uty  Ring0下搜索内存枚举隐藏进程 http://www.cnxhacker.net/Article/show/3412.html
//下面代码在XP SP2测试通过

#include<ntddk.h>

///////////////////////////不同的windows版本下面的偏移值不同
#define  EPROCESS_SIZE       0x25C //EPROCESS结构大小

#define  PEB_OFFSET          0x1B0
#define  FILE_NAME_OFFSET    0x174
#define  PROCESS_LINK_OFFSET 0x088
#define  PROCESS_ID_OFFSET   0x084
#define  EXIT_TIME_OFFSET    0x078

#define  OBJECT_HEADER_SIZE  0x018
#define  OBJECT_TYPE_OFFSET  0x008

#define PDE_INVALID 2
#define PTE_INVALID 1
#define VALID 0

ULONG     pebAddress;         //PEB地址的前半部分
PEPROCESS pSystem;            //system进程
ULONG     pObjectTypeProcess; //进程对象类型

ULONG   VALIDpage(ULONG addr) ;  //该函数直接复制自 Ring0下搜索内存枚举隐藏进程
BOOLEAN IsaRealProcess(ULONG i); //该函数复制自 Ring0下搜索内存枚举隐藏进程
VOID    WorkThread(IN PVOID pContext);
ULONG   GetPebAddress();          //得到PEB地址前半部分
VOID    EnumProcess();            //枚举进程
VOID    ShowProcess(ULONG pEProcess); //显示结果

VOID    OnUnload(IN PDRIVER_OBJECT DriverObject)
{
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
        HANDLE hThread;

        DriverObject -> DriverUnload = OnUnload;

        pSystem    = PsGetCurrentProcess();
        pebAddress = GetPebAddress();
        pObjectTypeProcess = *(PULONG)((ULONG)pSystem - OBJECT_HEADER_SIZE +OBJECT_TYPE_OFFSET);       

        PsCreateSystemThread(&hThread,
                (ACCESS_MASK)0,
                NULL,
                (HANDLE)0,
                NULL,
                WorkThread,
                NULL );

        return STATUS_SUCCESS;
}
//////////////////////////////////////////////
VOID WorkThread(IN PVOID pContext)
{
        EnumProcess();
        PsTerminateSystemThread(STATUS_SUCCESS);       
}
////////////////////////////////////////////////////////
ULONG  GetPebAddress()
{
        ULONG Address;
        PEPROCESS pEProcess;

        //由于system进程的peb总是零 我们只有到其他进程去找了
        pEProcess = (PEPROCESS)((ULONG)((PLIST_ENTRY)((ULONG)pSystem + PROCESS_LINK_OFFSET))->Flink - PROCESS_LINK_OFFSET);
        Address   = *(PULONG)((ULONG)pEProcess + PEB_OFFSET);

        return (Address & 0xFFFF0000);       
}
///////////////////////////////////////////////////////
VOID EnumProcess()
{
        ULONG  uSystemAddress = (ULONG)pSystem;
        ULONG  i;
        ULONG  Address;
        ULONG  ret;

        DbgPrint("-------------------------------------------");
        DbgPrint("EProcess    PID    ImageFileName");
        DbgPrint("---------------------------------");
       

        for(i = 0x80000000; i < uSystemAddress; i += 4){//system进程的EPROCESS地址就是最大值了
                ret = VALIDpage(i);
                if (ret == VALID){
                        Address = *(PULONG)i;
                        if (( Address & 0xFFFF0000) == pebAddress){//每个进程的PEB地址都是在差不多的地方,地址前半部分是相同的                        
                                if(IsaRealProcess(i)){
                                        ShowProcess(i - PEB_OFFSET);       
           i += EPROCESS_SIZE;                                                               
                                }
                        }
                }else if(ret == PTE_INVALID){
                        i -=4;
                        i += 0x1000;//4k
                }else{
                        i-=4;
                        i+= 0x400000;//4mb
                }
        }

        ShowProcess(uSystemAddress);//system的PEB总是零 上面的方法是枚举不到的 不过我们用PsGetCurrentProcess就能得到了
        DbgPrint("-------------------------------------------");
       
}
/////////////////////////////////////////////////////////
VOID    ShowProcess(ULONG pEProcess)
{
        PLARGE_INTEGER ExitTime;
        ULONG PID;
        PUCHAR pFileName;
       
        ExitTime = (PLARGE_INTEGER)(pEProcess + EXIT_TIME_OFFSET);       
        if(ExitTime->QuadPart != 0) //已经结束的进程的ExitTime为非零
                return ;

        PID = *(PULONG)(pEProcess + PROCESS_ID_OFFSET);
        pFileName = (PUCHAR)(pEProcess + FILE_NAME_OFFSET);

        DbgPrint("0x%08X  %04d   %s",pEProcess,PID,pFileName);
}
/////////////////////////////////////////////////////////////
ULONG VALIDpage(ULONG addr)
{
        ULONG pte;
        ULONG pde;
       
        pde = 0xc0300000 + (addr>>22)*4;
        if((*(PULONG)pde & 0x1) != 0){
                //large page
                if((*(PULONG)pde & 0x80) != 0){
                        return VALID;
                }
                pte = 0xc0000000 + (addr>>12)*4;
                if((*(PULONG)pte & 0x1) != 0){
                        return VALID;
                }else{
                        return PTE_INVALID;
                }
        }
        return PDE_INVALID;
}
////////////////////////////////////////////////////////////////
BOOLEAN IsaRealProcess(ULONG i)
{
        NTSTATUS STATUS;
        PUNICODE_STRING pUnicode;
        UNICODE_STRING Process;
        ULONG pObjectType;
        ULONG ObjectTypeAddress;
       
        if (VALIDpage(i- PEB_OFFSET) != VALID){
                return FALSE;
        }

        ObjectTypeAddress = i - PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET ;
       
        if (VALIDpage(ObjectTypeAddress) == VALID){
                pObjectType = *(PULONG)ObjectTypeAddress;
        }else{
                return FALSE;
        }
       
        if(pObjectTypeProcess == pObjectType){ //确定ObjectType是Process类型
                return TRUE;
        }
        return FALSE;

}
////////////////////////////////////////////////////////////////////

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞7
打赏
分享
最新回复 (30)
雪    币: 1656
活跃值: (833)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9521 2007-5-10 13:42
2
0
坐下来慢慢学习
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qandzjl 2007-5-10 13:47
3
0
顶堕落地``````````````
雪    币: 311
活跃值: (99)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SkyJack 2007-5-10 15:11
4
0
顶一个,学习ing.
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Losyz 2007-5-10 15:47
5
0
给个ntddk.h 吧
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
林海雪原 6 2007-5-10 16:50
6
0
支持楼主了!!,

没想到今儿被毒叮上了 (VBS代理下载器变种Q(Trojan.DL.VBS.Agent.q  Hack.SuspiciousAni),google了下,原是机子有MS06-014漏洞,,现在终于清静了...真好!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
其其 2007-5-10 22:50
7
0
学习咯.
支持咯
雪    币: 2307
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2007-5-11 15:36
8
0
微软 EPROCESS 就是每个版本不同,使大家不能好好用它

雪    币: 222
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
WinDbg 2007-5-11 17:34
9
0
ntddk.h在windows development kits中,要下载Windows DDK
雪    币: 191
活跃值: (41)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
小喂 5 2007-5-11 20:02
10
0
你的昵称强啊,小心微软告你!
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
xPLK 3 2007-5-11 21:05
11
0
顶下~学习。。
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
仙剑太郎 2 2007-5-12 16:24
12
0
学习学习...
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
其其 2007-5-12 23:17
13
0
请问直接修改EPRODESS结构的Object,求有没有问题
雪    币: 538
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Saver 2007-5-13 08:26
14
0
学习学习
雪    币: 375
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gegon 2007-5-13 10:16
15
0
收藏慢慢看 ,虽然现在还看不太懂
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zzwl 2007-5-14 10:53
16
0
疯狂的学习中
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Losyz 2007-5-15 08:50
17
0
那位哥哥给份编译过的源码给偶吧
雪    币: 8820
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2007-5-15 11:41
18
0
这个方法不够好~
经常会造成卡死~

呵呵~一般我们都是搜索整个non page pool区域~
不光可以找process,还可以找thread,driverobject,deviceobject,fileobject等等

不过特征应该采用pooltag和typeobject的hash来~
雪    币: 8820
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2007-5-15 11:43
19
0
另外还有pe imgae搜索大法等呵呵~
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NaX 2007-5-15 12:20
20
0
为什么会卡死呢?我发现所有进程的EProcess结构都是是位于System Idle Process 跟System两个EProcess结构之间(上面程序没有从System Idle Process开始),这样搜索范围已经很小了,速度应该没什么问题吧?
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NaX 2007-5-15 12:22
21
0
请指教,能说详细点么
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ljseven 2007-5-15 12:37
22
0
认真学习
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Losyz 2007-5-16 09:49
23
0
晕哦  就是没人传个编译过了的源码,我这编译不过
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NaX 2007-5-16 10:33
24
0
楼主贴出来的代码就是已经编译通过的,你没安装DDK 当然是编译不了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Losyz 2007-5-16 11:51
25
0
晕 XP DDK和2K DDK我都试过了不行
游客
登录 | 注册 方可回帖
返回