驱动开发-遍历进程

理论来源:http://www.weixianmanbu.com/article/749.html

总结:
!Process 0 0   进程列表
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虚拟机效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值