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

遍历内核对象目录

DriverEntry.c
  1. #include "ntifs.h"

  2. #define PAGEDCODE code_seg("PAGE")
  3. #define LOCKEDCODE code_seg()
  4. #define INITCODE code_seg("INIT")

  5. #define PAGEDDATA data_seg("PAGE")
  6. #define LOCKEDDATA data_seg()
  7. #define INITDATA data_seg("INIT")


  8. #define MAX_TABLE               37
  9. #define MAX_OBJECT_COUNT        0x10000

  10. typedef ULONG DEVICE_MAP;
  11. typedef ULONG EX_PUSH_LOCK;

  12. typedef struct _OBJECT_DIRECTORY_ENTRY{
  13.         struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
  14.         PVOID        Object;
  15.         ULONG        HashValue;
  16. }OBJECT_DIRECTORY_ENTRY,*POBJECT_DIRECTORY_ENTRY;

  17. typedef struct _OBJECT_DIRECTORY{
  18.         POBJECT_DIRECTORY_ENTRY        HashBuckets[MAX_TABLE];
  19.         EX_PUSH_LOCK        Lock;
  20.         DEVICE_MAP                DeviceMap;
  21.         ULONG                        SessionId;
  22.         PVOID                        NamespaceEntry;
  23.         ULONG                        Flags;
  24. }OBJECT_DIRECTORY,*POBJECT_DIRECTORY;

  25. typedef struct _OBJECT_HEADER_NAME_INFO{
  26.         POBJECT_DIRECTORY        Directory;
  27.         UNICODE_STRING                Name;
  28.         ULONG                                ReferenceCount;
  29. }OBJECT_HEADER_NAME_INFO,*POBJEC}OBJECT_HEADER_NAME_INFO,*POBJECT_HEADER_NAME_INFO;


  30. typedef struct _OBJECT_CREATE_INFORMATION {
  31.         ULONG Attributes;
  32.         HANDLE RootDirectory;
  33.         PVOID ParseContext;
  34.         KPROCESSOR_MODE ProbeMode;
  35.         ULONG PagedPoolCharge;
  36.         ULONG NonPagedPoolCharge;
  37.         ULONG SecurityDescriptorCharge;
  38.         PSECURITY_DESCRIPTOR SecurityDescriptor;
  39.         PSECURITY_QUALITY_OF_SERVICE SecurityQos;
  40.         SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
  41. } OBJECT_CREATE_INFORMATION;

  42. typedef struct _OBJECT_CREATE_INFORMATION *POBJECT_CREATE_INFORMATION;;

  43. typedef struct _OBJECT_HEADER {
  44.         LONG_PTR PointerCount;
  45.         union {
  46.                 LONG_PTR HandleCount;
  47.                 PVOID NextToFree;
  48.         };
  49.         POBJECT_TYPE Type;
  50.         UCHAR NameInfoOffset;
  51.         UCHAR HandleInfoOffset;
  52.         UCHAR QuotaInfoOffset;
  53.         UCHAR Flags;

  54.         union {
  55.                 POBJECT_CREATE_INFORMATION ObjectCreateInfo;
  56.                 PVOID QuotaBlockCharged;
  57.         };

  58.         PSECURITY_DESCRIPTOR SecurityDescriptor;
  59.         QUAD Body;
  60. } OBJECT_HEADER, *POBJECT_HEADER;


  61. #define OBJECT_TO_OBJECT_HEADER( o ) \
  62.         CONTAINING_RECORD( (o), OBJECT_HEADER, Body )


  63. #define OBJECT_HEADER_TO_NAME_INFO( oh ) ((POBJECT_HEADER_NAME_INFO) \
  64.         ((oh)->NameInfoOffset == 0 ? NULL : ((PCHAR)(oh) - (oh)->NameInfoOffset)))



  65. typedef struct _OBJECT_TYPE_INITIALIZER {
  66.         USHORT Length;
  67.         BOOLEAN UseDefaultObject;
  68.         BOOLEAN CaseInsensitive;
  69.         ULONG InvalidAttributes;
  70.         GENERIC_MAPPING GenericMapping;
  71.         ULONG ValidAccessMask;
  72.         BOOLEAN SecurityRequired;
  73.         BOOLEAN MaintainHandleCount;
  74.         BOOLEAN MaintainTypeList;
  75.         POOL_TYPE PoolType;
  76.         ULONG DefaultPagedPoolCharge;
  77.         ULONG DefaultNonPagedPoolCharge;
  78.         PVOID DumpProcedure;
  79.         PVOID OpenProcedure;
  80.         PVOID CloseProcedure;
  81.         PVOID DeleteProcedure;
  82.         PVOID ParseProcedure;
  83.         PVOID SecurityProcedure;
  84.         PVOID QueryNameProcedure;
  85.         PVOID OkayToCloseProcedure;
  86. } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;



  87. typedef struct _OBJECT_TYPE {
  88.         ERESOURCE Mutex;
  89.         LIST_ENTRY TypeList;
  90.         UNICODE_STRING Name;            // Copy from object header for convenience
  91.         PVOID DefaultObject;
  92.         ULONG Index;
  93.         ULONG TotalNumberOfObjects;
  94.         ULONG TotalNumberOfHandles;
  95.         ULONG HighWaterNumberOfObjects;
  96.         ULONG HighWaterNumberOfHandles;
  97.         OBJECT_TYPE_INITIALIZER TypeInfo;
  98. #ifdef POOL_TAGGING
  99.         ULONG Key;
  100. #endif //POOL_TAGGING
  101.         ERESOURCE ObjectLocks[4];
  102. } OBJECT_TYPE, *POBJECT_TYPE;


  103. //global

  104. ULONG g_uObpRootDirectoryObjectAddr;




  105. PUNICODE_STRING ObGetObjectName (
  106.                                  IN PVOID Object
  107.                                  )

  108. {
  109.         POBJECT_HEADER ObjectHeader;
  110.         POBJECT_HEADER_NAME_INFO NameInfo;

  111.         ObjectHeader = OBJECT_TO_OBJECT_HEADER( Object );
  112.         NameInfo = OBJECT_HEADER_TO_NAME_INFO( ObjectHeader );


  113.         if ((NameInfo != NULL) && (NameInfo->Name.Length != 0)) {

  114.                 return &NameInfo->Name;

  115.         } else {

  116.                 return NULL;
  117.         }
  118. }


  119. #pragma PAGEDCODE
  120. ULONG GetObpRootDirectoryObjectAddr()
  121. {

  122.         ULONG uAddr = (ULONG)ObQueryNameString;


  123.         PUCHAR p = (PUCHAR)uAddr;
  124.         ULONG i = 0;
  125.         BOOLEAN bFind = FALSE;

  126.         while(i < 0x200)
  127.         {
  128.                 if (*p == 0xa1
  129.                         && *(p + 5) == 0x39
  130.                         && *(p + 8) == 0x0f
  131.                         && *(p - 7) == 0xc7)
  132.                 {
  133.                         bFind = TRUE;
  134.                         break;
  135.                 }
  136.                 i++;
  137.                 p++;
  138.         }

  139.         if (!bFind)
  140.         {
  141.                 KdPrint(("Find faile!\n"));
  142.                 return 0;
  143.         }

  144.         uAddr = *(PULONG)(p + 1);

  145.         return uAddr;
  146. }


  147. VOID EnumObjectDirectory()
  148. {
  149.         ULONG u_index;
  150.         ULONG u_front, u_rear;
  151.         POBJECT_DIRECTORY ObpRootDirectoryObject;
  152.         POBJECT_DIRECTORY_ENTRY *queue;
  153.         PUNICODE_STRING pusObjectName;
  154.         ULONG uType;
  155.         POBJECT_TYPE pObjectType;
  156.        
  157.        

  158.         ObpRootDirectoryObject = (POBJECT_DIRECTORY)(*(PULONG)g_uObpRootDirectoryObjectAddr);

  159.         queue = (POBJECT_DIRECTORY_ENTRY *)ExAllocatePool(NonPagedPool, MAX_OBJECT_COUNT * sizeof(ULONG));

  160.         if (!MmIsAddressValid(queue))
  161.         {
  162.                 KdPrint(("queue is null\n"));
  163.                 return;
  164.         }

  165.         u_front = u_rear = 0;

  166.         for (u_index = 0; u_index < MAX_TABLE; u_index++)
  167.         {
  168.                
  169.                 if (MmIsAddressValid(ObpRootDirectoryObject->HashBuckets[u_index]))
  170.                 {
  171.                         u_rear = (u_rear + 1) % MAX_OBJECT_COUNT;
  172.                         queue[u_rear] = ObpRootDirectoryObject->HashBuckets[u_index];
  173.                 }
  174.         }



  175.         while(u_front != u_rear)
  176.         {
  177.                 u_front = (u_front + 1) % MAX_OBJECT_COUNT;
  178.        
  179.                 pusObjectName = ObGetObjectName(queue[u_front]->Object);
  180.                 if (MmIsAddressValid(pusObjectName))
  181.                 {
  182.                         KdPrint(("%X:%wZ\n", queue[u_front]->Object, pusObjectName));
  183.                 }


  184.                 pObjectType = *(POBJECT_TYPE *)((ULONG)queue[u_front]->Object - 0x10);
  185.                 uType = pObjectType->Index;
  186.                
  187.                 // 2 is Directory;
  188.                 if (uType == 2)
  189.                 {
  190.                         for (u_index = 0; u_index < MAX_TABLE; u_index++)
  191.                         {
  192.                                 if (MmIsAddressValid(((POBJECT_DIRECTORY)queue[u_front]->Object)->HashBuckets[u_index]))
  193.                                 {
  194.                                         u_rear = (u_rear + 1) % MAX_OBJECT_COUNT;
  195.                                         queue[u_rear] = ((POBJECT_DIRECTORY)queue[u_front]->Object)->HashBuckets[u_index];
  196.                                 }
  197.                         }
  198.                 }

  199.                 if (queue[u_front]->ChainLink != NULL)
  200.                 {
  201.                         u_rear = (u_rear + 1) % MAX_OBJECT_COUNT;
  202.                         queue[u_rear] = queue[u_front]->ChainLink;
  203.                 }
  204.                
  205.         }

  206.         ExFreePool(queue);
  207. }





  208. #pragma PAGEDCODE
  209. VOID MyDriverUnload(IN PDRIVER_OBJECT pDriverObject)
  210. {

  211.         KdPrint(("DriverEntry unLoading...\n"));

  212. }



  213. #pragma INITCODE
  214. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
  215. {
  216.         NTSTATUS status = STATUS_SUCCESS;
  217.        
  218.         g_uObpRootDirectoryObjectAddr = GetObpRootDirectoryObjectAddr();
  219.         if (g_uObpRootDirectoryObjectAddr != 0)
  220.         {
  221.                 EnumObjectDirectory();
  222.         }
  223.        

  224.         pDriverObject->DriverUnload = MyDriverUnload;
  225.         return status;
  226. }
复制代码

返回列表