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

|