理论来源:http://www.weixianmanbu.com/article/749.html
总结:
!Process 0 0 进程列表
dt _eprocess ----提示无改命令时使用.reload /f nt
dt _eprocess 进程地址 --得到进程详细信息
DDFF进程地址+0x88 --得到下个进程地址结构指针
地址结构指针-0x88 --得到进程地址
dt _eprocess 地址结构指针-0x88 --得到进程详细信息
dt _eprocess ----提示无改命令时使用.reload /f nt
dt _eprocess 进程地址 --得到进程详细信息
DDFF进程地址+0x88 --得到下个进程地址结构指针
地址结构指针-0x88 --得到进程地址
dt _eprocess 地址结构指针-0x88 --得到进程详细信息
注:0x88 为XP所用
代码: --硬编码方式
#pragma once
#include <ntifs.h>
#include <ntstrsafe.h>
//win7x86
#define FLINKOFFSET 0x00b8
#define PEBOFFSET 0x01a8
#define NAMEOFFSET 0x016c
#define PIDOFFSET 0x00b4
VOID EnumProcessInformations()
{
//第一个进程环境块
PEPROCESS eprocess_first = PsGetCurrentProcess();
PLIST_ENTRY pTempList = (PLIST_ENTRY)((PUCHAR)eprocess_first + FLINKOFFSET);
PEPROCESS eprocess = NULL;
PUCHAR lpname = NULL;
ULONG pID = 0;
//用于调试 KdBreakPoint();
while (eprocess != eprocess_first)
{
if (eprocess == NULL)
{
eprocess = (PEPROCESS)((PUCHAR)pTempList - FLINKOFFSET);
}
lpname = (PUCHAR)eprocess + NAMEOFFSET;
pID = *(PULONG *)((ULONG_PTR)eprocess + PIDOFFSET);
KdPrint(("process %s--%d\n", lpname, pID));
pTempList = pTempList->Flink;
eprocess = (PEPROCESS)((PUCHAR)pTempList - FLINKOFFSET);
}
}
//卸载函数很简单
VOID unload(PDRIVER_OBJECT p)
{
DbgPrint("UnloadDriver...");
}
//驱动入口函数
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver_Obj, PUNICODE_STRING pRegisterPath)
{
DbgPrint("DriverEntry...");
pDriver_Obj->DriverUnload = unload;
DbgPrint("DriverName:%wZ RegisterPath:%wZ \n ",
&pDriver_Obj->DriverName,
pRegisterPath);
//这里调用
EnumProcessInformations();
return STATUS_SUCCESS;
}
WIN7虚拟机效果: