#include <ntddk.h> #include <string.h>
PVOID obHandle;
typedef struct _OBJECT_TYPE_INITIALIZER { UINT16 Length; union { UINT8 ObjectTypeFlags; struct { UINT8 CaseInsensitive : 1; UINT8 UnnamedObjectsOnly : 1; UINT8 UseDefaultObject : 1; UINT8 SecurityRequired : 1; UINT8 MaintainHandleCount : 1; UINT8 MaintainTypeList : 1; UINT8 SupportsObjectCallbacks : 1; }; }; ULONG32 ObjectTypeCode; ULONG32 InvalidAttributes; struct _GENERIC_MAPPING GenericMapping; ULONG32 ValidAccessMask; ULONG32 RetainAccess; enum _POOL_TYPE PoolType; ULONG32 DefaultPagedPoolCharge; ULONG32 DefaultNonPagedPoolCharge; PVOID DumpProcedure; PVOID OpenProcedure; PVOID CloseProcedure; PVOID DeleteProcedure; PVOID ParseProcedure; PVOID SecurityProcedure; PVOID QueryNameProcedure; PVOID OkayToCloseProcedure; }OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
typedef struct _EX_PUSH_LOCK // 7 elements, 0x8 bytes (sizeof) { union // 3 elements, 0x8 bytes (sizeof) { struct // 5 elements, 0x8 bytes (sizeof) { UINT64 Locked : 1; UINT64 Waiting : 1; UINT64 Waking : 1; UINT64 MultipleShared : 1; UINT64 Shared : 60; }; UINT64 Value; VOID* Ptr; }; }EX_PUSH_LOCK, *PEX_PUSH_LOCK;
typedef struct _MY_OBJECT_TYPE { struct _LIST_ENTRY TypeList; struct _UNICODE_STRING Name; VOID* DefaultObject; UINT8 Index; UINT8 _PADDING0_[0x3]; ULONG32 TotalNumberOfObjects; ULONG32 TotalNumberOfHandles; ULONG32 HighWaterNumberOfObjects; ULONG32 HighWaterNumberOfHandles; UINT8 _PADDING1_[0x4]; struct _OBJECT_TYPE_INITIALIZER TypeInfo; struct _EX_PUSH_LOCK TypeLock; ULONG32 Key; UINT8 _PADDING2_[0x4]; struct _LIST_ENTRY CallbackList; }MY_OBJECT_TYPE, *PMY_OBJECT_TYPE;
VOID EnableObType(POBJECT_TYPE ObjectType) { PMY_OBJECT_TYPE myobtype = (PMY_OBJECT_TYPE)ObjectType; myobtype->TypeInfo.SupportsObjectCallbacks = 1; }
OB_PREOP_CALLBACK_STATUS preFileCallBack(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION OperationInformation) { UNICODE_STRING DosName; PFILE_OBJECT fileo = OperationInformation->Object; HANDLE CurrentProcessId = PsGetCurrentProcessId(); UNREFERENCED_PARAMETER(RegistrationContext);
if (OperationInformation->ObjectType != *IoFileObjectType) { return OB_PREOP_SUCCESS; } if (fileo->FileName.Buffer == NULL || !MmIsAddressValid(fileo->FileName.Buffer) || fileo->DeviceObject == NULL || !MmIsAddressValid(fileo->DeviceObject)) return OB_PREOP_SUCCESS;
if (!_wcsicmp(fileo->FileName.Buffer, L"\\Endpoint") || !_wcsicmp(fileo->FileName.Buffer, L"?") || !_wcsicmp(fileo->FileName.Buffer, L"\\.\\.") || !_wcsicmp(fileo->FileName.Buffer, L"\\")) return OB_PREOP_SUCCESS;
if (wcsstr(_wcslwr(fileo->FileName.Buffer), L".exe")) { DbgPrint("当前ID= %ld ---> 路径= %wZ", (ULONG64)CurrentProcessId, &fileo->FileName); } return OB_PREOP_SUCCESS; }
VOID UnDriver(PDRIVER_OBJECT driver) { UNREFERENCED_PARAMETER(driver); ObUnRegisterCallbacks(obHandle); }
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) { NTSTATUS status = STATUS_SUCCESS; OB_CALLBACK_REGISTRATION obReg; OB_OPERATION_REGISTRATION opReg;
EnableObType(*IoFileObjectType); memset(&obReg, 0, sizeof(obReg)); obReg.Version = ObGetFilterVersion(); obReg.OperationRegistrationCount = 1; obReg.RegistrationContext = NULL; RtlInitUnicodeString(&obReg.Altitude, L"321000"); obReg.OperationRegistration = &opReg; memset(&opReg, 0, sizeof(opReg)); opReg.ObjectType = IoFileObjectType; opReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE; opReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)&preFileCallBack; status = ObRegisterCallbacks(&obReg, &obHandle); if (!NT_SUCCESS(status)) status = STATUS_UNSUCCESSFUL; Driver->DriverUnload = UnDriver; return status; }
|