首页 > CTF, Windows驱动开发 > ISCC2011内核关-打造你自己的进程监控程序

ISCC2011内核关-打造你自己的进程监控程序

这是ISCC2011的内核关的第二题,内核关第一题就是用DebugView查看驱动文件中的输出信息,很简单,略过。本题是内核关第二题,要求使用Notify Routine来监控系统中进程的创建以及退出的信息。本题并不是很难,MSDN一下就知道怎么用了,我倒是觉得,通过EPROCESS结构体来获取进程的全路径需要好好思考一下,不过,Google上搜索一下,就明白了。

题目:监控Windows系统中进程的创建与结束,除了HOOK关键的系统函数之外,还可以设置Notify Routine,系统提供了这样的接口,自己动手写一个吧。最基本的要求就是能够在DgbView中可以显示创建信息。

提示:主要是考察是否知道PsSetCreateProcessNotifyRoutine这个函数(在xp环境下实现)

效果截图:
进程创建和退出监控效果截图ISCC 2011 内核关 第二题:打造你自己的进程监控程序。题目地址:http://www.isclab.org/challenge/2011/kernel/2

我的驱动代码:

// 作者:代码疯子
// Blog: http://www.programlife.net/
// 转载请注明出处,谢谢
#include <ntifs.h>
 
#define MAX_PATH 256
 
// 获取进程路径
VOID GetProcessPath(ULONG eprocess, PUNICODE_STRING pFilePath)
{
	ULONG			object;
	PFILE_OBJECT	FilePointer;
	UNICODE_STRING	name;  //盘符
 
	// EPROCESS -> SectionObject
	if(MmIsAddressValid((PULONG)(eprocess + 0x138)))
	{
		object = (*(PULONG)(eprocess + 0x138));
		// SECTION_OBJECT -> Segment
		if(MmIsAddressValid((PULONG)((ULONG)object + 0x014)))
		{
			object = *(PULONG)((ULONG)object + 0x014);
			// SEGMENT_OBJECT -> ControlArea
			// 不是0x018
			if(MmIsAddressValid((PULONG)((ULONG)object + 0x0)))
			{
				object = *(PULONG)((ULONG_PTR)object + 0x0);
				// CONTROL_AREA -> FilePointer
				if(MmIsAddressValid((PULONG)((ULONG)object + 0x024)))
				{
					object=*(PULONG)((ULONG)object + 0x024);
				}
				else return ;
			}
			else return ;
		}
		else return ;
	}
	else return ;
 
	FilePointer = (PFILE_OBJECT)object;
	ObReferenceObjectByPointer(
		(PVOID)FilePointer,
		0,
		NULL,
		KernelMode);
	RtlVolumeDeviceToDosName(FilePointer->DeviceObject, &name); //获取盘符名
	RtlCopyUnicodeString(pFilePath, &name); //盘符连接
	RtlAppendUnicodeStringToString(pFilePath, &FilePointer->FileName); //路径连接
	ObDereferenceObject(FilePointer);		//关闭对象引用
}
 
VOID ProcessNotifyRoutine(
		IN HANDLE	ParentId,
		IN HANDLE	ProcessId,
		IN BOOLEAN	Create
    )
{
	NTSTATUS		status = STATUS_SUCCESS;
	PEPROCESS		pEprocess = NULL;
	UNICODE_STRING 	uniPath;
 
	uniPath.Length = 0;
	uniPath.MaximumLength = MAX_PATH * 2;
	uniPath.Buffer = (PWSTR)ExAllocatePool(NonPagedPool, uniPath.MaximumLength);
 
	// 创建进程
	if (Create)
	{
		DbgPrint("*******----有----新----进----程----创----建----*******\r\n");
		// 父进程
		// DbgPrint("父进程信息\r\n");
		// DbgPrint("        PID:  %d\r\n", ParentId);
		// status = PsLookupProcessByProcessId(ParentId, &pEprocess);
		// if (NT_SUCCESS(status))
		// {
			// GetProcessPath(pEprocess, &uniPath);
			// DbgPrint("        路径: %wZ\r\n", &uniPath);
		// }
		// 进程
		DbgPrint("创建进程信息\r\n");
		DbgPrint("        PID:  %d\r\n", ProcessId);
		status = PsLookupProcessByProcessId(ProcessId, &pEprocess);
		if (NT_SUCCESS(status))
		{
			GetProcessPath(pEprocess, &uniPath);
			DbgPrint("        路径: %wZ\r\n", &uniPath);
		}
	}
	// 结束进程
	else
	{
		DbgPrint("*******----有----旧----进----程----退----出----*******\r\n");
		// 父进程
		//DbgPrint("父进程信息\r\n");
		//DbgPrint("        PID:  %d\r\n", ParentId);
		//status = PsLookupProcessByProcessId(ParentId, &pEprocess);
		//if (NT_SUCCESS(status))
		//{
		//	GetProcessPath(pEprocess, &uniPath);
		//	DbgPrint("        路径: %wZ\r\n", &uniPath);
		//}
		// 进程
		DbgPrint("退出进程信息\r\n");
		DbgPrint("        PID:  %d\r\n", ProcessId);
		status = PsLookupProcessByProcessId(ProcessId, &pEprocess);
		if (NT_SUCCESS(status))
		{
			GetProcessPath(pEprocess, &uniPath);
			DbgPrint("        路径: %wZ\r\n", &uniPath);
		}
	}
	ExFreePool(uniPath.Buffer);
}
 
VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	NTSTATUS status;
	DbgPrint("Stop Process Create/Delete Mon\r\n");
 
	status = PsSetCreateProcessNotifyRoutine(ProcessNotifyRoutine, TRUE);
    if (!NT_SUCCESS(status))
	{
        DbgPrint("Call PsSetCreateProcessNotifyRoutine Error!\r\n");
		DbgPrint("Status Code: 0x%08X", status);
    }
}
 
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,
					PUNICODE_STRING pRegistryPath)
{
	NTSTATUS status = STATUS_SUCCESS;
	DbgPrint("Start Process Create/Delete Mon\r\n");
	DbgPrint("********** ISCC 2011 **********\r\n");
	DbgPrint("******* 作者:代码疯子 *******\r\n");
	DbgPrint("**** Www.ProgramLife.Net ****\r\n");
 
	pDriverObject->DriverUnload = DriverUnload;
 
	status = PsSetCreateProcessNotifyRoutine(ProcessNotifyRoutine, FALSE);
    if (!NT_SUCCESS(status))
	{
        DbgPrint("Call PsSetCreateProcessNotifyRoutine Error!\r\n");
		DbgPrint("Status Code: 0x%08X", status);
        return status;
    }
 
	return status;
}

觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> ISCC2011内核关-打造你自己的进程监控程序
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2014年4月28日15:47 | #1

    hell

    [回复]