米老鼠和蓝精鼠v 发表于 2024-3-11 13:35:40

内核/驱动遍历进程 GetProcess/OpenProcess

#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通用
我手头上也没有多少隐藏进程的代码也就试验了这些,有不对的地方大家说。。。

页: [1]
查看完整版本: 内核/驱动遍历进程 GetProcess/OpenProcess