您的位置:首页 > 其它

暴力枚举进程

2015-09-07 20:38 190 查看
直接上代码:
/***************************************************************************************
* 文件名: EnumProcess.c
* 功  能: 枚举进程的驱动程序
****************************************************************************************/
#include <Ntifs.h>                            // Ntifs.h包含Ntddk.h, 而Ntddk.h又包含Wdm.h

NTKERNELAPI HANDLE PsGetProcessInheritedFromUniqueProcessId(IN PEPROCESS pEProcess);
NTKERNELAPI UCHAR* PsGetProcessImageFileName(IN PEPROCESS pEProcess);

/***************************************************************************************
* 参数一: 驱动程序对象指针
* 功  能: "停止服务"时调用
* 返回值: 无
****************************************************************************************/
void DriverUnload(PDRIVER_OBJECT objDriver)
{
	UNREFERENCED_PARAMETER(objDriver);    // 避免编译器报未引用参数的警告
	DbgPrint("My Driver is unloading...\n");               // 打印一行字符串
}

/***************************************************************************************
* 参数一: 进程ID
* 功  能  : 通过进程ID获取EPROCESS指针
* 返回值: EPROCESS指针
****************************************************************************************/
PEPROCESS LookupProcess(HANDLE hPid)
{
	PEPROCESS pEProcess = NULL;
	if (NT_SUCCESS(PsLookupProcessByProcessId(hPid, &pEProcess)))
		return pEProcess;

	return NULL;
}

/***************************************************************************************
* 功  能: 枚举进程
* 返回值: 无
****************************************************************************************/
void EnumProcess()
{
	PEPROCESS pEProc = NULL;
	ULONG     i      = 0;
	ULONG     j      = 1;

	// 循环遍历进程(假设线程的最大值不超过0x25600)	
	for (i = 4; i < 0x25600; i = i+4)
	{
		// a. 根据PID返回PEPROCESS
		pEProc = LookupProcess((HANDLE)i);
		if (!pEProc)
			continue;

		// b. 打印进程信息
		DbgPrint("Num: %d PEPROCESS=%p PID=%d PPID=%d Name=%s\n", j++, pEProc, 
			(UINT32)PsGetProcessId(pEProc),
			(UINT32)PsGetProcessInheritedFromUniqueProcessId(pEProc),
			PsGetProcessImageFileName(pEProc));

		// c.将进程对象引用计数减1
		ObDereferenceObject(pEProc);
		DbgPrint("\n");
	}
}

/***************************************************************************************
* 参数一: 驱动程序对象指针
* 参数二: 注册表路径
* 功  能 :  驱动程序入口点
* 返回值: 返回状态
****************************************************************************************/
NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath)
{
	UNREFERENCED_PARAMETER(strRegPath);       // 避免编译器报未引用参数的警告	
					
	EnumProcess();
	
	objDriver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: