内核 进程监控 线程监控

唉  最近学习感觉有点学不懂了 有点头蒙 

都有点想放弃了 最后还是坚持一下吧 看内核看不懂了 就去pwn     昨天确实有点瞎想了  有些东西未来再说 现在 为时太早 

然后 今天 搞得是  内核进程监控 

然后还是根据看雪分享的教程 写的 作者是 Tesla.Angela

然后 

这里 并非是 HOOKSSDT 而是 用的 

 VOID CreateProcessNotifyEx( 
  __inout   PEPROCESS Process,    //新进程 EPROCESS 
  __in      HANDLE ProcessId,     //新进程 PID 
  __in_opt  PPS_CREATE_NOTIFY_INFO CreateInfo    //新进程详细信息(仅在创建进程时有效) );

然后 这里就能看得出来 获取了很多信息  然后那个结构体 是

typedef struct _PS_CREATE_NOTIFY_INFO { 
  SIZE_T              Size; 
  union { 
    ULONG  Flags; 
    struct { 
      ULONG FileOpenNameAvailable  :1; 
      ULONG Reserved  :31; 
    }; 
  }; 
  HANDLE              ParentProcessId; 
  CLIENT_ID           CreatingThreadId; 
  struct _FILE_OBJECT  *FileObject; 
  PCUNICODE_STRING    ImageFileName; 
  PCUNICODE_STRING    CommandLine; 
  NTSTATUS            CreationStatus; } PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO

如果想阻止创建进程 那么直接,直接把 此结构体的 CreationStatus 成员改为 STATUS_UNSUCCESSFUL 就行 

比较可惜的是 阻止线程的话 很容易失败 这里引用 作者原话把 

 

在通知回调函数 的时候,线程尚未初始化完毕,使用 PsLookupThreadByThreadId 获得 ETHREAD 有时会失败,即使侥幸成功,也不能调用 PspTerminateThreadByPointer 来结束 新线程,否则会蓝屏

 

然后下面是代码 

#include <ntddk.h>
NTKERNELAPI PCHAR PsGetProcessImageFileName(PEPROCESS Process);
NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);
PCHAR GetProcessByProcessId(HANDLE hProcess)
{
	NTSTATUS status = STATUS_SUCCESS;
	PEPROCESS Processobj = NULL;
	PCHAR string = NULL;
	status = PsLookupProcessByProcessId(hProcess, &Processobj);
	if (!NT_SUCCESS(status))
	{
		string = PsGetProcessImageFileName(Processobj);
		ObfDereferenceObject(Processobj);
	}
	return string;
}
VOID LookCreateProcess(
	__inout   PEPROCESS Process,
	__in      HANDLE ProcessId,
	__in_opt  PPS_CREATE_NOTIFY_INFO CreateInfo
	)
{
	NTSTATUS status;
	HANDLE hProcess; 
	OBJECT_ATTRIBUTES ob = { 0 };
	CLIENT_ID CilendID = { 0 };
	char ProcessName[16] = { 0 };
	if (CreateInfo != NULL)
	{
		KdPrint(("%ld %s 创建进程 %wZ",
		CreateInfo->ParentProcessId,
		GetProcessByProcessId(CreateInfo->ParentProcessId),
		CreateInfo->ImageFileName
		));
		strcpy(ProcessName, PsGetProcessImageFileName(Process));
		if (_stricmp(ProcessName, "calc.exe"))
		{
			KdPrint(("听说你是计算器??\n"));
			CreateInfo->CreationStatus = STATUS_UNSUCCESSFUL;
		}
	}
	else
	{
		KdPrint(("进程退出: %s", PsGetProcessImageFileName(Process)));
	}

}
VOID LookCreateThread(
	IN HANDLE  ProcessId,
	IN HANDLE  ThreadId,
	IN BOOLEAN  Create
	)
{
	if (Create)
		KdPrint(("线程创建! PID=%ld;TID=%ld", ProcessId, ThreadId));
	else
		KdPrint(("线程退出! PID=%ld;TID=%ld", ProcessId, ThreadId));
}
VOID Unload(PDRIVER_OBJECT pDriverObj)
{
	KdPrint(("拜拜!\n"));
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{ 
	NTSTATUS status;
	status = PsSetCreateProcessNotifyRoutineEx((PCREATE_PROCESS_NOTIFY_ROUTINE_EX)LookCreateProcess, FALSE);
	KdPrint(("%x",status));
	status = PsSetCreateThreadNotifyRoutine(LookCreateThread);
	KdPrint(("%x", status));
	return STATUS_SUCCESS;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值