驱动实现遍历系统进程 打印进程并打印进程名称123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include <ntddk.h>//https://bbs.kanxue.com/thread-263982.htm//[原创]驱动遍历系统进程 #define pid_offset 0x180#define list_offset 0x188#define name_offset 0x2e0NTSTATUS 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;}