进程监控和线程监控

进程监控1

#include <ntifs.h>
#include<ntddk.h>

NTKERNELAPI
PUCHAR
PsGetProcessImageFileName(
IN PEPROCESS Process
);


VOID
ProcessNotifyRoutine(
_In_ HANDLE ParentId,
_In_ HANDLE ProcessId,
_In_ BOOLEAN Create
)
{
	NTSTATUS status = 0;
	PEPROCESS process = NULL;

	if (Create == TRUE)
	{
		//创建进程回调
		status = PsLookupProcessByProcessId(ProcessId, &process);
		if (NT_SUCCESS(status))
		{
			KdPrint(("进程创建:%s\n", PsGetProcessImageFileName(process)));
		}
	}
	else
	{
		
		status=PsLookupProcessByProcessId(ProcessId, &process);
		if (NT_SUCCESS(status))
		{
			//结束进程回调
			if (_stricmp(PsGetProcessImageFileName(process), "qqq.exe") == 0)
			{
				DbgBreakPoint();
				KdPrint(("进程结束:%s\n", PsGetProcessImageFileName(process)));
			}
		}
		
	}

	if (process)
	{
		ObDereferenceObject(process);
		process = NULL;
	}
}

VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
	//移除进程回调
	//PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutine, TRUE);
	PsSetCreateProcessNotifyRoutine(ProcessNotifyRoutine, TRUE);
	KdPrint(("驱动卸载成功\n"));
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
{
	NTSTATUS status =STATUS_SUCCESS;
	pDriverObject->DriverUnload=DriverUnload;
	
	//添加进程回调
	PsSetCreateProcessNotifyRoutine(ProcessNotifyRoutine, FALSE);
	return status;

}

进程监控2

需要在链接器->命令行加上如下命令

/INTEGRITYCHECK 

使用软件CFF Explorer 可以看到Code Integrity Image被加上了

在这里插入图片描述

#include <ntifs.h>
#include<ntddk.h>

NTKERNELAPI
PUCHAR
PsGetProcessImageFileName(
IN PEPROCESS Process
);

VOID
ProcessNotifyRoutineEx(
_Inout_ PEPROCESS Process,
_In_ HANDLE ProcessId,
_Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo
)
{
	if (CreateInfo!=NULL)
	{
		//创建进程回调
		
		KdPrint(("创建进程%wZ 父进程id%d\n",CreateInfo->ImageFileName,CreateInfo->ParentProcessId));
		if (!_stricmp(PsGetProcessImageFileName(Process),"calc.exe")==0)
		{
			CreateInfo->CreationStatus = STATUS_ACCESS_DENIED;
		}
	}
	else
	{
		//结束进程回调
		
		KdPrint(("进程结束:%s\n",PsGetProcessImageFileName(Process)));
	}
}


VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
	//移除进程回调
	//PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutine, TRUE);
	PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutineEx, TRUE);
	KdPrint(("驱动卸载成功\n"));
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
{
	NTSTATUS status =STATUS_SUCCESS;
	pDriverObject->DriverUnload=DriverUnload;
	

	//xp下不能使用  需要WIN7以上
	status=PsSetCreateProcessNotifyRoutineEx(ProcessNotifyRoutineEx, FALSE);
	return status;

}

线程监控

当线程创建和销毁的时候,线程回调是运行在目标线程的线程上下文中的。

#include <ntifs.h>
#include<ntddk.h>

NTKERNELAPI
PUCHAR
PsGetProcessImageFileName(
IN PEPROCESS Process
);

VOID
CreateThreadRoutine(
_In_ HANDLE ProcessId,
_In_ HANDLE ThreadId,
_In_ BOOLEAN Create
)
{
	PEPROCESS pEprocess;
	NTSTATUS status=PsLookupProcessByProcessId(ProcessId,&pEprocess);
		if(!NT_SUCCESS(status))
		{
			KdPrint(("获取进程对象失败%x\n",status));	
			return ;
		}
	if (Create)
	{
		KdPrint(("进程:%s线程创建\n",PsGetProcessImageFileName(pEprocess)));
	} 
	else
	{
		KdPrint(("进程:%s线程销毁\n", PsGetProcessImageFileName(pEprocess)));
	}
}

VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{

	PsRemoveCreateThreadNotifyRoutine(CreateThreadRoutine);
	KdPrint(("驱动卸载成功\n"));
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
{
	NTSTATUS status =STATUS_SUCCESS;
	pDriverObject->DriverUnload=DriverUnload;

	PsSetCreateThreadNotifyRoutine(CreateThreadRoutine);
	return status;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值