免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

ObjectHook

  1. #pragma once

  2. typedef struct _OBJECT_DUMP_CONTROL {
  3.     PVOID Stream;
  4.     ULONG Detail;
  5. } OB_DUMP_CONTROL, *POB_DUMP_CONTROL;

  6. typedef VOID (*OB_DUMP_METHOD)(
  7.                                IN PVOID Object,
  8.                                IN POB_DUMP_CONTROL Control OPTIONAL
  9.                                );

  10. typedef enum _OB_OPEN_REASON {
  11.     ObCreateHandle,
  12.     ObOpenHandle,
  13.     ObDuplicateHandle,
  14.     ObInheritHandle,
  15.     ObMaxOpenReason
  16. } OB_OPEN_REASON;


  17. typedef NTSTATUS (*OB_OPEN_METHOD)(
  18.                                    IN OB_OPEN_REASON OpenReason,
  19.                                    IN PEPROCESS Process OPTIONAL,
  20.                                    IN PVOID Object,
  21.                                    IN ACCESS_MASK GrantedAccess,
  22.                                    IN ULONG HandleCount
  23.                                    );

  24. typedef VOID (*OB_CLOSE_METHOD)(
  25.                                 IN PEPROCESS Process OPTIONAL,
  26.                                 IN PVOID Object,
  27.                                 IN ACCESS_MASK GrantedAccess,
  28.                                 IN ULONG_PTR ProcessHandleCount,
  29.                                 IN ULONG_PTR SystemHandleCount
  30.                                 );

  31. typedef VOID (*OB_DELETE_METHOD)(
  32.                                  IN  PVOID   Object
  33.                                  );

  34. typedef NTSTATUS (*OB_SECURITY_METHOD)(
  35.                                        IN PVOID Object,
  36.                                        IN SECURITY_OPERATION_CODE OperationCode,
  37.                                        IN PSECURITY_INFORMATION SecurityInformation,
  38.                                        IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
  39.                                        IN OUT PULONG CapturedLength,
  40.                                        IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
  41.                                        IN POOL_TYPE PoolType,
  42.                                        IN PGENERIC_MAPPING GenericMapping,
  43.                                        IN PVOID unknown
  44.                                        );

  45. typedef NTSTATUS (*OB_PARSE_METHOD)(
  46.                                     IN PVOID ParseObject,
  47.                                     IN PVOID ObjectType,
  48.                                     IN OUT PACCESS_STATE AccessState,
  49.                                     IN KPROCESSOR_MODE AccessMode,
  50.                                     IN ULONG Attributes,
  51.                                     IN OUT PUNICODE_STRING CompleteName,
  52.                                     IN OUT PUNICODE_STRING RemainingName,
  53.                                     IN OUT PVOID Context OPTIONAL,
  54.                                     IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
  55.                                     OUT PVOID *Object
  56.                                     );

  57. typedef BOOLEAN (*OB_OKAYTOCLOSE_METHOD)(
  58.     IN PEPROCESS Process OPTIONAL,
  59.     IN PVOID Object,
  60.     IN HANDLE Handle,
  61.     IN KPROCESSOR_MODE PreviousMode
  62.     );

  63. typedef NTSTATUS (*OB_QUERYNAME_METHOD)(
  64.                                         IN PVOID Object,
  65.                                         IN BOOLEAN HasObjectName,
  66.                                         OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
  67.                                         IN ULONG Length,
  68.                                         OUT PULONG ReturnLength,
  69.                                         IN KPROCESSOR_MODE Mode
  70.                                         );

  71. typedef struct _OBJECT_TYPE_INITIALIZER {
  72.     USHORT Length;
  73.     BOOLEAN UseDefaultObject;
  74.     BOOLEAN CaseInsensitive;
  75.     ULONG InvalidAttributes;
  76.     GENERIC_MAPPING GenericMapping;
  77.     ULONG ValidAccessMask;
  78.     BOOLEAN SecurityRequired;
  79.     BOOLEAN MaintainHandleCount;
  80.     BOOLEAN MaintainTypeList;
  81.     POOL_TYPE PoolType;
  82.     ULONG DefaultPagedPoolCharge;
  83.     ULONG DefaultNonPagedPoolCharge;
  84.     OB_DUMP_METHOD DumpProcedure;
  85.     OB_OPEN_METHOD OpenProcedure;
  86.     OB_CLOSE_METHOD CloseProcedure;
  87.     OB_DELETE_METHOD DeleteProcedure;
  88.     OB_PARSE_METHOD ParseProcedure;
  89.     OB_SECURITY_METHOD SecurityProcedure;
  90.     OB_QUERYNAME_METHOD QueryNameProcedure;
  91.     OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
  92. } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;

  93. #define OBJECT_LOCK_COUNT 4

  94. typedef struct _OBJECT_TYPE {
  95.     ERESOURCE Mutex;
  96.     LIST_ENTRY TypeList;
  97.     UNICODE_STRING Name;            // Copy from object header for convenience
  98.     PVOID DefaultObject;
  99.     ULONG Index;
  100.     ULONG TotalNumberOfObjects;
  101.     ULONG TotalNumberOfHandles;
  102.     ULONG HighWaterNumberOfObjects;
  103.     ULONG HighWaterNumberOfHandles;
  104.     OBJECT_TYPE_INITIALIZER TypeInfo;
  105. #ifdef POOL_TAGGING
  106.     ULONG Key;
  107. #endif //POOL_TAGGING
  108.     ERESOURCE ObjectLocks[ OBJECT_LOCK_COUNT ];
  109. } OBJECT_TYPE, *POBJECT_TYPE;


  110. VOID HandleObjectHook(BOOLEAN bHook);
复制代码
  1. #include "StdAfx.h"
  2. #include "ObjectHook.h"


  3. OB_SECURITY_METHOD g_OB_SECURITY_METHOD = NULL;

  4. extern "C" NTKERNELAPI
  5. UCHAR *
  6. PsGetProcessImageFileName(
  7.                           __in PEPROCESS Process
  8.                           );

  9. NTSTATUS Hook_OB_SECURITY_METHOD(
  10.                                IN PVOID Object,
  11.                                IN SECURITY_OPERATION_CODE OperationCode,
  12.                                IN PSECURITY_INFORMATION SecurityInformation,
  13.                                IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
  14.                                IN OUT PULONG CapturedLength,
  15.                                IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
  16.                                IN POOL_TYPE PoolType,
  17.                                IN PGENERIC_MAPPING GenericMapping,
  18.                                IN PVOID unknown
  19.                                )
  20. {
  21.     UCHAR* szProcName = PsGetProcessImageFileName((PEPROCESS)Object);

  22.     DbgPrint("EPROCESS Addr: 0x08%x\tObject Name: %s\n", IoGetCurrentProcess(), (char*)szProcName);

  23.     if (strcmp("calc.exe", (char*)szProcName) == 0)
  24.     {
  25.         return STATUS_INVALID_PARAMETER;
  26.     }

  27.     return g_OB_SECURITY_METHOD(Object,
  28.                                 OperationCode,
  29.                                 SecurityInformation,
  30.                                 SecurityDescriptor,
  31.                                 CapturedLength,
  32.                                 ObjectsSecurityDescriptor,
  33.                                 PoolType,
  34.                                 GenericMapping,
  35.                                 unknown);
  36. }


  37. VOID HandleObjectHook(BOOLEAN bHook)
  38. {
  39.     OBJECT_TYPE_INITIALIZER* ptypeinfo = &((*PsProcessType)->TypeInfo);

  40.     if (bHook)
  41.     {
  42.         g_OB_SECURITY_METHOD = ptypeinfo->SecurityProcedure;
  43.         ptypeinfo->SecurityProcedure = Hook_OB_SECURITY_METHOD;
  44.     }
  45.     else
  46.     {
  47.         ptypeinfo->SecurityProcedure = g_OB_SECURITY_METHOD;
  48.     }
  49.    
  50. }
复制代码

返回列表