驱动实现遍历系统进程 打印进程并打印进程名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <ntddk.h>
//https://bbs.kanxue.com/thread-263982.htm
//[原创]驱动遍历系统进程
#define pid_offset 0x180
#define list_offset 0x188
#define name_offset 0x2e0

NTSTATUS Get_Name();

VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
UNREFERENCED_PARAMETER(DriverObject);
DbgPrintEx(0, 0, "[%ws] Unload Successful \n", __FUNCTIONW__);
}


NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(RegistryPath);
DbgPrintEx(0, 0, "[%ws] [OK] \n", __FUNCTIONW__);
Get_Name();
DriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
NTSTATUS Get_Name()
{
UINT64 process_pid = 0;
PUCHAR process_name = NULL;
PLIST_ENTRY process_list = NULL;
PEPROCESS process_first = NULL;
PEPROCESS process_address = PsGetCurrentProcess();
//因为双向链表 首节点的位置是0,所以我们要指向第一个节点之前
process_list = (PLIST_ENTRY)((UINT64)process_address + list_offset);
process_first = (PEPROCESS)((UINT64)(process_list->Blink) - list_offset);
if (!process_address)
{
DbgPrint("[ERROR]: NOT ....\n");
return STATUS_SEVERITY_ERROR;
}
while (process_address)
{
process_pid = *(UINT64*)((UINT64)process_address + pid_offset);
process_name = (PUCHAR)((UINT64)process_address + name_offset);
DbgPrintEx(0, 0, "pid = %ld name = %s \n", process_pid, process_name);
process_list = process_list->Flink;
process_address = (PEPROCESS)((UINT64)(process_list)-list_offset);
if (process_first == process_address)
{
DbgPrintEx(0, 0, "END!......\n");
break;
}
}
return STATUS_SUCCESS;
}