看流星社区

 找回密码
 注册账号
查看: 2039|回复: 0

内核枚举进程总结

[复制链接]

该用户从未签到

发表于 2017-6-1 13:32:52 | 显示全部楼层 |阅读模式
我知道的有三种方法
这里的第三种和第二种是一样的 隐藏进程也可以在这么做手脚
但需要注意多线程,在操作前,理应加锁
可以参考这篇文章
41813747



1.暴力枚举进程 通过PsLookupProcessByProcessId获得EPROCESS
第一个参数我们使用循环 填入0~65535
for (ULONG i = 0; i < 65535; i += 4)  
{  
     SearchProcessPID(i);  
}  
return STATUS_SUCCESS;  [/code]

2.通过ZwQuerySystemInformation


3.通过进程活动连来枚举


代码如下:

#include "ntddk.h"


typedef struct  _PROCESS_INFO
{
        ULONG_PTR eprocess;
        ULONG pid;
        ULONG ppid;
        UNICODE_STRING pathName;
        UNICODE_STRING ImageFileName;
}PROCESSINFO,*PPROCESSINFO;

typedef struct _SYSTEM_THREADS
{
         LARGE_INTEGER  KernelTime;
         LARGE_INTEGER  UserTime;
         LARGE_INTEGER  CreateTime;
         ULONG    WaitTime;
         PVOID    StartAddress;
         CLIENT_ID   ClientID;
         KPRIORITY   Priority;
         KPRIORITY   BasePriority;
         ULONG    ContextSwitchCount;
         ULONG    ThreadState;
         KWAIT_REASON  WaitReason;
         ULONG    Reserved; //Add
}SYSTEM_THREADS,*PSYSTEM_THREADS;
  
typedef struct _SYSTEM_PROCESS_INFORMATION {  
    ULONG                   NextEntryOffset;  
    ULONG                   NumberOfThreads;  
    LARGE_INTEGER           Reserved[3];  
    LARGE_INTEGER           CreateTime;  
    LARGE_INTEGER           UserTime;  
    LARGE_INTEGER           KernelTime;  
    UNICODE_STRING          ImageName;  
    KPRIORITY               BasePriority;  
    HANDLE                  ProcessId;  
    HANDLE                  InheritedFromProcessId;  
    ULONG                   HandleCount;  
    ULONG                   Reserved2[2];  
    ULONG                   PrivatePageCount;  
    VM_COUNTERS             VirtualMemoryCounters;  
    IO_COUNTERS             IoCounters;  
    SYSTEM_THREADS           Threads[0];  
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;


typedef enum _SYSTEM_INFORMATION_CLASS   
{   
    SystemBasicInformation,                 //  0 Y N   
    SystemProcessorInformation,             //  1 Y N   
    SystemPerformanceInformation,           //  2 Y N   
    SystemTimeOfDayInformation,             //  3 Y N   
    SystemNotImplemented1,                  //  4 Y N   
    SystemProcessesAndThreadsInformation,   //  5 Y N   
    SystemCallCounts,                       //  6 Y N   
    SystemConfigurationInformation,         //  7 Y N   
    SystemProcessorTimes,                   //  8 Y N   
    SystemGlobalFlag,                       //  9 Y Y   
    SystemNotImplemented2,                  // 10 Y N   
    SystemModuleInformation,                // 11 Y N   
    SystemLockInformation,                  // 12 Y N   
    SystemNotImplemented3,                  // 13 Y N   
    SystemNotImplemented4,                  // 14 Y N   
    SystemNotImplemented5,                  // 15 Y N   
    SystemHandleInformation,                // 16 Y N   
    SystemObjectInformation,                // 17 Y N   
    SystemPagefileInformation,              // 18 Y N   
    SystemInstructionEmulationCounts,       // 19 Y N   
    SystemInvalidInfoClass1,                // 20   
    SystemCacheInformation,                 // 21 Y Y   
    SystemPoolTagInformation,               // 22 Y N   
    SystemProcessorStatistics,              // 23 Y N   
    SystemDpcInformation,                   // 24 Y Y   
    SystemNotImplemented6,                  // 25 Y N   
    SystemLoadImage,                        // 26 N Y   
    SystemUnloadImage,                      // 27 N Y   
    SystemTimeAdjustment,                   // 28 Y Y   
    SystemNotImplemented7,                  // 29 Y N   
    SystemNotImplemented8,                  // 30 Y N   
    SystemNotImplemented9,                  // 31 Y N   
    SystemCrashDumpInformation,             // 32 Y N   
    SystemExceptionInformation,             // 33 Y N   
    SystemCrashDumpStateInformation,        // 34 Y Y/N   
    SystemKernelDebuggerInformation,        // 35 Y N   
    SystemContextSwitchInformation,         // 36 Y N   
    SystemRegistryQuotaInformation,         // 37 Y Y   
    SystemLoadAndCallImage,                 // 38 N Y   
    SystemPrioritySeparation,               // 39 N Y   
    SystemNotImplemented10,                 // 40 Y N   
    SystemNotImplemented11,                 // 41 Y N   
    SystemInvalidInfoClass2,                // 42   
    SystemInvalidInfoClass3,                // 43   
    SystemTimeZoneInformation,              // 44 Y N   
    SystemLookasideInformation,             // 45 Y N   
    SystemSetTimeSlipEvent,                 // 46 N Y   
    SystemCreateSession,                    // 47 N Y   
    SystemDeleteSession,                    // 48 N Y   
    SystemInvalidInfoClass4,                // 49   
    SystemRangeStartInformation,            // 50 Y N   
    SystemVerifierInformation,              // 51 Y Y   
    SystemAddVerifier,                      // 52 N Y   
    SystemSessionProcessesInformation       // 53 Y N   
} SYSTEM_INFORMATION_CLASS;  

typedef  NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
  _In_      SYSTEM_INFORMATION_CLASS SystemInformationClass,
  _Inout_   PVOID                    SystemInformation,
  _In_      ULONG                    SystemInformationLength,
  _Out_opt_ PULONG                   ReturnLength
);

NTSTATUS
  PsLookupProcessByProcessId(
    IN HANDLE ProcessId,
    OUT PEPROCESS *Process
    );

NTKERNELAPI UCHAR* PsGetProcessImageFileName(PEPROCESS Process);


void EnumProcessByZw()
{
        NTSTATUS                                                            status;
        //ULONG                                                                        i = 0;
        ULONG                                                                        retusize;
        UNICODE_STRING                                                        ZwFunName;
        PVOID                                                                        AllSize=0;
        ZWQUERYSYSTEMINFORMATION                                ZwQuerySystemInformation;
        SYSTEM_PROCESS_INFORMATION*                                ProcessInfo;
        RtlInitUnicodeString(&ZwFunName,L"ZwQuerySystemInformation");

        ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)MmGetSystemRoutineAddress(&ZwFunName);

        if(ZwQuerySystemInformation==0)
        {
                KdPrint(("Get Fun Addr Faile!"));
                return;
        }

        status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,0,0,&retusize);

        if(retusize==0)
        {
                KdPrint(("retu size is null"));
                return;
        }

        AllSize = ExAllocatePool(NonPagedPool,retusize);
        if(AllSize==0)
        {
                return;
        }

        status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,AllSize,(ULONG)retusize,&retusize);
       
        if(!NT_SUCCESS(status))
        {
                KdPrint(("ZwQuerySystemInformation is faild!"));
                ExFreePool(AllSize);
                return;
        }

        ProcessInfo = (SYSTEM_PROCESS_INFORMATION*)AllSize;
        while (ProcessInfo->NextEntryOffset)
        {
                KdPrint((&quotrocessId:%d------ProcessName:%wZ",ProcessInfo-&gtrocessId,&amprocessInfo->ImageName));
                /*for (i = 0; i < ProcessInfo->NumberOfThreads;i++)
                {
                        KdPrint(("      CliendId: %x-------StartAddress:0x%llx",ProcessInfo->Threads.ClientID.UniqueThread,ProcessInfo->Threads.StartAddress));
                }*/
                ProcessInfo = (SYSTEM_PROCESS_INFORMATION*)((ULONGLONG)ProcessInfo + ProcessInfo->NextEntryOffset);
        }

        ExFreePool(AllSize);
}


//暴力枚举PID,枚举进程  
NTSTATUS SearchProcessPID(ULONG pid)  
{  
    NTSTATUS status = STATUS_SUCCESS;  
    PEPROCESS process = NULL;  
    PUCHAR processName;  
    status = PsLookupProcessByProcessId((HANDLE)pid, &process);  
    processName = ExAllocatePool(NonPagedPool, sizeof(process));  
    if (NT_SUCCESS(status))  
    {  
        processName = PsGetProcessImageFileName(process);  
        DbgPrint(&quotID:%d,processName:%s\n", pid, processName);  /*这里使用完后要ObdefObject,<span style="font-family: Arial, Helvetica, sans-serif;"&gtsLookupProcessByProcessId会增加引用计数 这里的内存也没有释放*/</span>

    }
}

void EnumProcessByLink()
{
        ULONGLONG   eprocess;
        PLIST_ENTRY p_head,p_list;
        ULONGLONG   offset = 0x16f8;
        ULONG                processnum =1;
        PPROCESSINFO pProcessInfo = {0};
        eprocess = (ULONGLONG)PsGetCurrentProcess();
        p_head = (PLIST_ENTRY)(eprocess+0x188);
        p_list = p_head;
        while (p_list->Flink!=p_head)
        {
                processnum++;
                eprocess = (ULONGLONG)(p_list - 0x188)+offset;
                KdPrint((&quotrocessName:%s",eprocess+0x2e0));
                p_list = p_list->Flink;
        }
        KdPrint((&quotrocessNum:%d",processnum));
}

#define ACTIVE_PROCESS_LINK 0x188

//通过EPROCESS枚举进程  
NTSTATUS SearchProcessEPROCESS()  
{  
    PEPROCESS process=NULL,firstProcess=NULL;  
    NTSTATUS status = STATUS_SUCCESS;  
    PLIST_ENTRY plist;  
    process = firstProcess = PsGetCurrentProcess();  
    do  
    {  
        PUCHAR ProcessNmae = NULL;  
        ProcessNmae = PsGetProcessImageFileName(process);  
        DbgPrint(&quotID:%d,ProcessName:%s\n", (HANDLE)PsGetProcessId(process), ProcessNmae);  
        plist = (PLIST_ENTRY)((ULONG)process + ACTIVE_PROCESS_LINK);  
        process = (PEPROCESS)((ULONG)plist->Flink - ACTIVE_PROCESS_LINK);  
        if (process == firstProcess)  
        {  
            break;  
        }  
    } while (process != NULL);  
  
    return status;  
}  

void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
        KdPrint(("DriverUnload"));
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pUnicodeString)
{
        KdPrint(("DriverEntry"));
        //EnumProcessByZw();
        EnumProcessByLink();
        pDriverObject->DriverUnload = DriverUnload;
        return STATUS_SUCCESS;
}[/code]

测试平台:win7 x64 build 7601
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 16:27

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表