首页
社区
课程
招聘
[原创]新枚举隐藏进程(附源码)
发表于: 2012-7-5 18:53 14816

[原创]新枚举隐藏进程(附源码)

2012-7-5 18:53
14816

大概有一年没怎么搞驱动一直搞R3,这些日子被 XXX刺激了一下,重启兴趣接着弄ARK,看看了自己原先的代码有点惨不忍睹,枚举进程用了暴力内存和PspCidTable 枚举发现大量的硬编码,感觉不舒服,我就试验有没有一个新的方法不用硬编码简洁简单而且效果跟现有的差不多呢,呵呵终于弄出来了,以前有前辈说过,不多说了直接代码

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
**  FileName    :    Process.c
**  Version     :    1.00
**  Author      :    房有亮
**  Date        :    2012-07-05
**  Comment     :    枚举隐藏进程
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】【】
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include <ntddk.h>

NTKERNELAPI
PVOID
MmGetSystemRoutineAddress (
    __in PUNICODE_STRING SystemRoutineName
);
NTKERNELAPI
NTSTATUS
PsLookupProcessByProcessId(
    __in HANDLE ProcessId,
    __deref_out PEPROCESS *Process
);

NTKERNELAPI
NTSTATUS
NTAPI
ObOpenObjectByPointer(
    IN PVOID   Object,
    IN ULONG   HandleAttributes,
    IN PACCESS_STATE   PassedAccessState   OPTIONAL,
    IN ACCESS_MASK   DesiredAccess   OPTIONAL,
    IN POBJECT_TYPE   ObjectType   OPTIONAL,
    IN KPROCESSOR_MODE   AccessMode,
    OUT PHANDLE   Handle
);
NTKERNELAPI
UCHAR *
PsGetProcessImageFileName(
    __in PEPROCESS Process
);

#define PsGetCurrentProcessImageFileName() PsGetProcessImageFileName(PsGetCurrentProcess())

NTKERNELAPI
HANDLE
PsGetProcessInheritedFromUniqueProcessId(
    __in PEPROCESS Process
);

NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
);
NTSTATUS DriverUnload(
    IN PDRIVER_OBJECT DriverObject
);

//########################################################################################################################################
//功能:获取进程句柄
//########################################################################################################################################

HANDLE OpenProcess(
    ULONG Processid
)
{
    NTSTATUS status;
    PEPROCESS Process = NULL;
    HANDLE hProcess = NULL;
    UNICODE_STRING Unicode;

    status = PsLookupProcessByProcessId(Processid, &Process);

    if (NT_SUCCESS(status))
    {
        RtlInitUnicodeString(&Unicode, L"PsProcessType");

        PsProcessType = MmGetSystemRoutineAddress(&Unicode);

        if (PsProcessType)
        {
            status = ObOpenObjectByPointer(
                         Process,
                         NULL,
                         NULL,
                         PROCESS_ALL_ACCESS,
                         (PVOID) * PsProcessType,
                         KernelMode,
                         &hProcess
                     );

            if (NT_SUCCESS(status))
            {
                ObfDereferenceObject(Process);

                return hProcess;
            }
        }
        ObfDereferenceObject(Process);
    }
    return 0;
}

//########################################################################################################################################
//功能:获取进程 PEPROCESS
//########################################################################################################################################

PEPROCESS GetProcess(
    ULONG Processid
)
{
    NTSTATUS Status;
    PEPROCESS Process = NULL;
    PEPROCESS Result = NULL;

    if (PsLookupProcessByProcessId((HANDLE)Processid, &Process) == STATUS_SUCCESS)
    {
        Result = Process;

        ObDereferenceObject(Process);
    }
    return Result;
}

//########################################################################################################################################
//功能:枚举进程
//########################################################################################################################################

void EnumProcess()
{
    PEPROCESS Process = NULL;
    HANDLE hProcess = NULL;
    ULONG Count = NULL;
    ULONG ProcessId = NULL;

    for (ProcessId = 0; ProcessId < 9999; ProcessId += 4)
    {
        Process = GetProcess(ProcessId);

        if (Process != 0)
        {
                        if (MmIsAddressValid((PVOID)Process))
                        {
                                DbgPrint("序号:%d 进程ID:%d 父进程ID:%d EPROCESS:0x%08X 进程名称:%s\n",
                                        Count,
                                        ProcessId,
                                        PsGetProcessInheritedFromUniqueProcessId(Process),
                                        Process,
                                        PsGetProcessImageFileName(Process)
                                        );
                                Count++;
                        }
        }
    }
}

NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
)
{
    DriverObject->DriverUnload = DriverUnload;
    EnumProcess();
    return STATUS_SUCCESS;
}
NTSTATUS DriverUnload(
    IN PDRIVER_OBJECT DriverObject
)
{
    return STATUS_SUCCESS;
}

经过试验 用hidetoolz 2.2 隐藏的进程 还有断链都能检测出来,最主要的是没硬编码 xp 2k3 win7通用
我手头上也没有多少隐藏进程的代码也就试验了这些,有不对的地方大家说。。。

EnumProcess.rar


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (13)
雪    币: 220
活跃值: (711)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
现在都是在搞隐藏了
2012-7-5 19:18
0
雪    币: 5147
活跃值: (3367)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这样枚举进程特殊情况下会蓝屏的。
2012-7-6 04:16
0
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
4
沙发。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
2012-7-6 07:00
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错,,,楼主能否留下QQ 研究一下
2012-7-6 11:06
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
6
虚拟机 XP 2K3 WIN7 物理机 XP未出现过蓝屏
2012-7-6 11:24
0
雪    币: 114
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
指定的 附件 无效。如果您来自一个有效链接,请通知管理员。
2012-7-6 12:29
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
8
好了 我当时在修改
2012-7-6 13:08
0
雪    币: 165
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
话说你那个9999会不会小了点。
上传的附件:
  • 1.jpg (64.61kb,326次下载)
2012-7-6 13:30
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
10
你可以改一下,刚才看错了,额 从来没超过 6000
2012-7-6 16:42
0
雪    币: 165
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错了,不过猜测超过了6w以后你这个方法会占用很多cpu时间,应该会卡系统一段时间。我这个机器已经开超过两个星期了,所以pid有点大
2012-7-6 18:11
0
雪    币: 209
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好像还有个地方没处理啊?
已关闭的进程也全都列出来了...
2012-7-6 18:26
0
雪    币: 1895
活跃值: (1622)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
连续开两星期。。。。敢情问一下原因。。。。
2012-7-7 00:01
0
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
14
PsSetCreateProcessNotifyRoutine
NTSTATUS PsSetCreateProcessNotifyRoutine(
  __in  PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
  __in  BOOLEAN Remove
);
VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE) (  
    IN HANDLE  ParentId,
    IN HANDLE  ProcessId,  //有局限!只对新创建的PID 有效 还是
    IN BOOLEAN  Create
    );

做个内核回调
2012-7-7 07:19
0
游客
登录 | 注册 方可回帖
返回
//