天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理VIP详情进入 ←←←←←←←←←←←←
1 x64CE与x64dbg入门基础教程 7课 已完结 2 x64汇编语言基础教程 16课 已完结 3 x64辅助入门基础教程 9课 已完结 4 C++x64内存辅助实战技术教程 149课 已完结
5 C++x64内存检测与过检测技术教程 10课 已完结 6 C+x64二叉树分析遍历与LUA自动登陆教程 19课已完结 7 C++BT功能原理与x64实战教程 29课 已完结 8 C+FPS框透视与自瞄x64实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? 26 64 ? 27 加入2000人交流群637034024 3 28 免责声明?
查看: 1274|回复: 0

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

[复制链接]

10

主题

0

回帖

12

积分

编程入门

Rank: 1

天马币
20
发表于 2024-3-11 13:35:40 | 显示全部楼层 |阅读模式
#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通用
我手头上也没有多少隐藏进程的代码也就试验了这些,有不对的地方大家说。。。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

天马阁|C/C++辅助教程|安卓逆向安全| 论坛导航|免责申明|Archiver||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表天马阁立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表