本文为看雪论坛优秀文章
看雪论坛作者ID:1900
1
简介
2
对象监控
NTSTATUSObRegisterCallbacks(IN POB_CALLBACK_REGISTRATION CallBackRegistration,OUT PVOID *RegistrationHandle);
typedef struct _OB_CALLBACK_REGISTRATION {__in USHORT Version;__in USHORT OperationRegistrationCount;__in UNICODE_STRING Altitude;__in PVOID RegistrationContext;__in OB_OPERATION_REGISTRATION *OperationRegistration;} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
typedef struct _OB_OPERATION_REGISTRATION {__in POBJECT_TYPE *ObjectType;__in OB_OPERATION Operations;__in POB_PRE_OPERATION_CALLBACK PreOperation;__in POB_POST_OPERATION_CALLBACK PostOperation;} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;
OB_PREOP_CALLBACK_STATUSObjectPreCallback(__in PVOID RegistrationContext,__in POB_PRE_OPERATION_INFORMATION OperationInformation);VOIDObjectPostCallback(__in PVOID RegistrationContext,__in POB_POST_OPERATION_INFORMATION OperationInformation );
PEPROCESSIoThreadToProcess(IN PETHREAD Thread);
#include <ntifs.h>#define PROCESS_NAME "demo.exe" // 要保护的进程名#define PROCESS_TERMINATE 0x0001typedef struct _KLDR_DATA_TABLE_ENTRY{LIST_ENTRY InLoadOrderModuleList;LIST_ENTRY InMemoryOrderModuleList;LIST_ENTRY InInitializationOrderModuleList;PVOID DllBase;PVOID EntryPoint;UINT32 SizeOfImage;UNICODE_STRING FullDllName;UNICODE_STRING BaseDllName;UINT32 Flags;USHORT LoadCount;USHORT TlsIndex;LIST_ENTRY HashLinks;PVOID SectionPointer;UINT32 CheckSum;UINT32 TimeDateStamp;PVOID LoadedImports;PVOID EntryPointActivationContext;PVOID PatchInformation;} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;// 未导出函数声明PUCHAR PsGetProcessImageFileName(PEPROCESS pEProcess);VOID DriverUnload(IN PDRIVER_OBJECT driverObject);BOOLEAN IsProtectProcess(PEPROCESS pEProcess); // 判断是否是要保护的进程NTSTATUS SetProcessCallback(); // 设置进程回调函数NTSTATUS SetThreadCallback(); // 设置线程回调函数OB_PREOP_CALLBACK_STATUS ProcessPreCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pObPreOperationInfo); // 进程回调函数OB_PREOP_CALLBACK_STATUS ThreadPreCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pObPreOperationInfo); // 线程回调函数// 进程回调对象句柄HANDLE g_obProcessHandle;// 线程回调对象句柄HANDLE g_obThreadHandle;NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject, IN PUNICODE_STRING registryPath){NTSTATUS status = STATUS_SUCCESS;PKLDR_DATA_TABLE_ENTRY pLdrData = NULL;DbgPrint("驱动加载完成rn");pLdrData = (PKLDR_DATA_TABLE_ENTRY)driverObject->DriverSection;pLdrData->Flags = pLdrData->Flags | 0x20;if (NT_SUCCESS(SetProcessCallback())){DbgPrint("进程回调函数设置完成rn");}if (NT_SUCCESS(SetThreadCallback())){DbgPrint("线程回调函数设置完成rn");}exit:driverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;}NTSTATUS SetProcessCallback(){NTSTATUS status = STATUS_SUCCESS;OB_CALLBACK_REGISTRATION obCallbackReg = { 0 };OB_OPERATION_REGISTRATION obOperationReg = { 0 };RtlZeroMemory(&obCallbackReg, sizeof(obCallbackReg));RtlZeroMemory(&obOperationReg, sizeof(obOperationReg));//设置OB_OPERATION_REGISTRATIONobOperationReg.ObjectType = PsProcessType;obOperationReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;obOperationReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)(&ProcessPreCall);//设置OB_CALLBACK_REGISTRATIONobCallbackReg.Version = ObGetFilterVersion();obCallbackReg.OperationRegistrationCount = 1;obCallbackReg.RegistrationContext = NULL;RtlInitUnicodeString(&obCallbackReg.Altitude, L"1900");obCallbackReg.OperationRegistration = &obOperationReg;status = ObRegisterCallbacks(&obCallbackReg, &g_obProcessHandle);if (!NT_SUCCESS(status)){DbgPrint("ObRegisterCallbacks Error 0x%Xrn", status);}return status;}OB_PREOP_CALLBACK_STATUS ProcessPreCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pObPreOperationInfo){PEPROCESS pEProcess = NULL;// 判断对象类型if (*PsProcessType != pObPreOperationInfo->ObjectType){goto exit;}// 获取进程结构体对象pEProcess = (PEPROCESS)pObPreOperationInfo->Object;if (IsProtectProcess(pEProcess)) // 是否是要保护的进程{// 判断操作类型是创建句柄还是复制句柄if (pObPreOperationInfo->Operation == OB_OPERATION_HANDLE_CREATE){//是否具有关闭进程的权限,有的话删掉它if (pObPreOperationInfo->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_TERMINATE){pObPreOperationInfo->Parameters->CreateHandleInformation.DesiredAccess &= ~PROCESS_TERMINATE;}}else if (pObPreOperationInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE){//是否具有关闭进程的权限,有的话删掉它if (pObPreOperationInfo->Parameters->DuplicateHandleInformation.DesiredAccess & PROCESS_TERMINATE){pObPreOperationInfo->Parameters->DuplicateHandleInformation.DesiredAccess &= ~PROCESS_TERMINATE;}}}exit:return OB_PREOP_SUCCESS;}NTSTATUS SetThreadCallback(){NTSTATUS status = STATUS_SUCCESS;OB_CALLBACK_REGISTRATION obCallbackReg = { 0 };OB_OPERATION_REGISTRATION obOperationReg = { 0 };RtlZeroMemory(&obCallbackReg, sizeof(OB_CALLBACK_REGISTRATION));RtlZeroMemory(&obOperationReg, sizeof(OB_OPERATION_REGISTRATION));// 设置 OB_OPERATION_REGISTRATIONobOperationReg.ObjectType = PsThreadType;obOperationReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;obOperationReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)(&ThreadPreCall);// 设置 OB_CALLBACK_REGISTRATIONobCallbackReg.Version = ObGetFilterVersion();obCallbackReg.OperationRegistrationCount = 1;obCallbackReg.RegistrationContext = NULL;RtlInitUnicodeString(&obCallbackReg.Altitude, L"1900");obCallbackReg.OperationRegistration = &obOperationReg;// 注册回调函数status = ObRegisterCallbacks(&obCallbackReg, &g_obThreadHandle);if (!NT_SUCCESS(status)){DbgPrint("ObRegisterCallbacks Error[0x%X]n", status);return status;}return status;}// 线程回调函数OB_PREOP_CALLBACK_STATUS ThreadPreCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pObPreOperationInfo){PEPROCESS pEProcess = NULL;// 判断对象类型if (*PsThreadType != pObPreOperationInfo->ObjectType){return OB_PREOP_SUCCESS;}// 获取线程对应的进程 PEPROCESSpEProcess = IoThreadToProcess((PETHREAD)pObPreOperationInfo->Object);// 判断是否是要保护的进程, 若是, 则拒绝结束线程if (IsProtectProcess(pEProcess)){// 判断操作类型是创建句柄还是复制句柄if (pObPreOperationInfo->Operation == OB_OPERATION_HANDLE_CREATE){//是否具有关闭线程的权限,有的话删掉它if (pObPreOperationInfo->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_TERMINATE){pObPreOperationInfo->Parameters->CreateHandleInformation.DesiredAccess &= ~PROCESS_TERMINATE;}}else if (pObPreOperationInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE){//是否具有关闭线程的权限,有的话删掉它if (pObPreOperationInfo->Parameters->DuplicateHandleInformation.DesiredAccess & PROCESS_TERMINATE){pObPreOperationInfo->Parameters->DuplicateHandleInformation.DesiredAccess &= ~PROCESS_TERMINATE;}}}return OB_PREOP_SUCCESS;}BOOLEAN IsProtectProcess(PEPROCESS pEProcess){BOOLEAN bRet = FALSE;PUCHAR pProcName = PsGetProcessImageFileName(pEProcess); // 获取要保护的进程名if (pProcName){if (strcmp(pProcName, PROCESS_NAME) == 0){bRet = TRUE;}}return bRet;}VOID DriverUnload(IN PDRIVER_OBJECT driverObject){// 删除进程回调if (g_obProcessHandle){ObUnRegisterCallbacks(g_obProcessHandle);g_obProcessHandle = NULL;}// 卸载线程回调if (NULL != g_obThreadHandle){ObUnRegisterCallbacks(g_obThreadHandle);g_obThreadHandle = NULL;}DbgPrint("驱动卸载完成rn");}
3
反对象监控
#pragma pack(1)typedef struct _OB_CALLBACK{LIST_ENTRY ListEntry;ULONGLONG Unknown;HANDLE ObHandle;PVOID ObTypeAddr;PVOID PreCall;PVOID PostCall;}OB_CALLBACK, *POB_CALLBACK;#pragma pack()
typedef struct _OBJECT_TYPE{LIST_ENTRY TypeList; // _LIST_ENTRYUNICODE_STRING Name; // _UNICODE_STRINGPVOID DefaultObject; // Ptr64 VoidUCHAR Index; // UCharULONG TotalNumberOfObjects; // Uint4BULONG TotalNumberOfHandles; // Uint4BULONG HighWaterNumberOfObjects; // Uint4BULONG HighWaterNumberOfHandles; // Uint4BOBJECT_TYPE_INITIALIZER TypeInfo; // _OBJECT_TYPE_INITIALIZEREX_PUSH_LOCK TypeLock; // _EX_PUSH_LOCKULONG Key; // Uint4BLIST_ENTRY CallbackList; // _LIST_ENTRY}OBJECT_TYPE, *POBJECT_TYPE;
typedef struct _OBJECT_TYPE_INITIALIZER{USHORT Length; // Uint2BUCHAR ObjectTypeFlags; // UCharULONG ObjectTypeCode; // Uint4BULONG InvalidAttributes; // Uint4BGENERIC_MAPPING GenericMapping; // _GENERIC_MAPPINGULONG ValidAccessMask; // Uint4BULONG RetainAccess; // Uint4BPOOL_TYPE PoolType; // _POOL_TYPEULONG DefaultPagedPoolCharge; // Uint4BULONG DefaultNonPagedPoolCharge; // Uint4BPVOID DumpProcedure; // Ptr64 voidPVOID OpenProcedure; // Ptr64 longPVOID CloseProcedure; // Ptr64 voidPVOID DeleteProcedure; // Ptr64 voidPVOID ParseProcedure; // Ptr64 longPVOID SecurityProcedure; // Ptr64 longPVOID QueryNameProcedure; // Ptr64 longPVOID OkayToCloseProcedure; // Ptr64 unsigned charULONG WaitObjectFlagMask; // Uint4BUSHORT WaitObjectFlagOffset; // Uint2BUSHORT WaitObjectPointerOffset; // Uint2B}OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
typedef struct _OBJECT_TYPE_INITIALIZER{USHORT Length; // Uint2BUCHAR ObjectTypeFlags; // UCharULONG ObjectTypeCode; // Uint4BULONG InvalidAttributes; // Uint4BGENERIC_MAPPING GenericMapping; // _GENERIC_MAPPINGULONG ValidAccessMask; // Uint4BULONG RetainAccess; // Uint4BPOOL_TYPE PoolType; // _POOL_TYPEULONG DefaultPagedPoolCharge; // Uint4BULONG DefaultNonPagedPoolCharge; // Uint4BPVOID DumpProcedure; // Ptr64 voidPVOID OpenProcedure; // Ptr64 longPVOID CloseProcedure; // Ptr64 voidPVOID DeleteProcedure; // Ptr64 voidPVOID ParseProcedure; // Ptr64 longPVOID SecurityProcedure; // Ptr64 longPVOID QueryNameProcedure; // Ptr64 longPVOID OkayToCloseProcedure; // Ptr64 unsigned charULONG WaitObjectFlagMask; // Uint4BUSHORT WaitObjectFlagOffset; // Uint2BUSHORT WaitObjectPointerOffset; // Uint2B}OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;typedef struct _OBJECT_TYPE{LIST_ENTRY TypeList; // _LIST_ENTRYUNICODE_STRING Name; // _UNICODE_STRINGPVOID DefaultObject; // Ptr64 VoidUCHAR Index; // UCharULONG TotalNumberOfObjects; // Uint4BULONG TotalNumberOfHandles; // Uint4BULONG HighWaterNumberOfObjects; // Uint4BULONG HighWaterNumberOfHandles; // Uint4BOBJECT_TYPE_INITIALIZER TypeInfo; // _OBJECT_TYPE_INITIALIZEREX_PUSH_LOCK TypeLock; // _EX_PUSH_LOCKULONG Key; // Uint4BLIST_ENTRY CallbackList; // _LIST_ENTRY}OBJECT_TYPE, *POBJECT_TYPE;typedef struct _OB_CALLBACK{LIST_ENTRY ListEntry;ULONGLONG Unknown;HANDLE ObHandle;PVOID ObTypeAddr;PVOID PreCall;PVOID PostCall;}OB_CALLBACK, *POB_CALLBACK;VOID DriverUnload(IN PDRIVER_OBJECT driverObject);BOOLEAN RemoveProcessObCallback();BOOLEAN RemoveThreadObCallback();NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject, IN PUNICODE_STRING registryPath){NTSTATUS status = STATUS_SUCCESS;if (RemoveProcessObCallback()){DbgPrint("删除进程回调成功rn");}else{DbgPrint("删除进程回调失败rn");}if (RemoveThreadObCallback()){DbgPrint("删除线程回调成功rn");}else{DbgPrint("删除线程回调失败rn");}exit:driverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;}BOOLEAN RemoveThreadObCallback(){BOOLEAN bRet = TRUE;LIST_ENTRY CallbackList = ((POBJECT_TYPE)(*PsProcessType))->CallbackList; // 获取线程表头POB_CALLBACK pObCallback = NULL;pObCallback = (POB_CALLBACK)CallbackList.Flink;do{if (!MmIsAddressValid(pObCallback)){bRet = FALSE;break;}if (pObCallback->ObHandle){ObUnRegisterCallbacks(pObCallback->ObHandle);DbgPrint("删除回调函数成功,函数地址:0x%Xrn", pObCallback->PreCall);}} while (CallbackList.Flink != (PLIST_ENTRY)pObCallback);return bRet;}BOOLEAN RemoveProcessObCallback(){BOOLEAN bRet = TRUE;POB_CALLBACK pObCallback = NULL;LIST_ENTRY CallbackList = ((POBJECT_TYPE)(*PsProcessType))->CallbackList; // 获取设置进程对象回调函数的双向链表表头pObCallback = (POB_CALLBACK)CallbackList.Flink;do{if (!MmIsAddressValid(pObCallback)){bRet = FALSE;break;}if (pObCallback->ObHandle){ObUnRegisterCallbacks(pObCallback->ObHandle);DbgPrint("删除回调成功,函数地址为:0x%Xrn", pObCallback->PreCall);}pObCallback = (POB_CALLBACK)pObCallback->ListEntry.Flink;}while (CallbackList.Flink != (PLIST_ENTRY)pObCallback);return bRet;}VOID DriverUnload(IN PDRIVER_OBJECT driverObject){DbgPrint("驱动卸载完成rn");}
4
运行结果
看雪ID:1900
https://bbs.pediy.com/user-home-835440.htm
#
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……




还没有评论,来说两句吧...