内核 进程监控 线程监控

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:20   755   0

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

都有点想放弃了 最后还是坚持一下吧 看内核看不懂了 就去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;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP