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

通过函数 ExEnumHandleTable 得到进程的 EPROCESS

Driver.h
  1. #ifdef __cplusplus
  2. extern "C"
  3. {
  4. #endif
  5. #include <ntddk.h>
  6. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);

  7. #ifdef __cplusplus
  8. }
  9. #endif

  10. #define PAGEDCODE code_seg("PAGE")
  11. #define LOCKEDCODE code_seg()
  12. #define INITCODE code_seg("INIT")

  13. #define PAGEDDATA data_seg("PAGE")
  14. #define LOCKEDDATA data_seg()
  15. #define INITDATA data_seg("INIT")

  16. #define arraysize(p) (sizeof(p)/sizeof((p)[0]))

  17. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);


  18. #define HANDLE_TRACE_DB_MAX_STACKS 65536
  19. #define HANDLE_TRACE_DB_MIN_STACKS 128
  20. #define HANDLE_TRACE_DB_DEFAULT_STACKS 4096
  21. #define HANDLE_TRACE_DB_STACK_SIZE 16

  22. typedef struct _HANDLE_TRACE_DB_ENTRY {
  23.         CLIENT_ID ClientId;
  24.         HANDLE Handle;
  25. #define HANDLE_TRACE_DB_OPEN    1
  26. #define HANDLE_TRACE_DB_CLOSE   2
  27. #define HANDLE_TRACE_DB_BADREF  3
  28.         ULONG Type;
  29.         PVOID StackTrace[HANDLE_TRACE_DB_STACK_SIZE];
  30. } HANDLE_TRACE_DB_ENTRY, *PHANDLE_TRACE_DB_ENTRY;


  31. typedef struct _HANDLE_TRACE_DEBUG_INFO {

  32.         LONG RefCount;



  33.         ULONG TableSize;


  34. #define HANDLE_TRACE_DEBUG_INFO_CLEAN_DEBUG_INFO        0x1


  35. #define HANDLE_TRACE_DEBUG_INFO_COMPACT_CLOSE_HANDLE    0x2


  36. #define HANDLE_TRACE_DEBUG_INFO_BREAK_ON_WRAP_AROUND    0x4

  37. #define HANDLE_TRACE_DEBUG_INFO_WAS_WRAPPED_AROUND      0x40000000
  38. #define HANDLE_TRACE_DEBUG_INFO_WAS_SOMETIME_CLEANED    0x80000000

  39.         ULONG BitMaskFlags;

  40.         FAST_MUTEX CloseCompactionLock;

  41.         ULONG CurrentStackIndex;

  42.         HANDLE_TRACE_DB_ENTRY TraceDb[1];

  43. } HANDLE_TRACE_DEBUG_INFO, *PHANDLE_TRACE_DEBUG_INFO;

  44. typedef struct _HANDLE_TABLE {

  45.         ULONG_PTR TableCode;

  46.         struct _EPROCESS *QuotaProcess;
  47.         HANDLE UniqueProcessId;

  48. #define HANDLE_TABLE_LOCKS 4

  49.         ULONG HandleTableLock[HANDLE_TABLE_LOCKS];
  50.         LIST_ENTRY HandleTableList;
  51.         ULONG HandleContentionEvent;
  52.         PHANDLE_TRACE_DEBUG_INFO DebugInfo;
  53.         LONG ExtraInfoPages;
  54.         ULONG FirstFree;
  55.         ULONG LastFree;
  56.         ULONG NextHandleNeedingPool;
  57.         LONG HandleCount;
  58.         union {
  59.                 ULONG Flags;
  60.                 BOOLEAN StrictFIFO : 1;
  61.         };

  62. } HANDLE_TABLE, *PHANDLE_TABLE;


  63. typedef struct _HANDLE_TABLE_ENTRY_INFO {

  64.         ACCESS_MASK AuditMask;

  65. } HANDLE_TABLE_ENTRY_INFO, *PHANDLE_TABLE_ENTRY_INFO;


  66. typedef struct _HANDLE_TABLE_ENTRY {


  67.         union {

  68.                 PVOID Object;

  69.                 ULONG ObAttributes;

  70.                 PHANDLE_TABLE_ENTRY_INFO InfoTable;

  71.                 ULONG_PTR Value;
  72.         };

  73.         union {

  74.                 union {

  75.                         ACCESS_MASK GrantedAccess;

  76.                         struct {

  77.                                 USHORT GrantedAccessIndex;
  78.                                 USHORT CreatorBackTraceIndex;
  79.                         };
  80.                 };

  81.                 LONG NextFreeTableEntry;
  82.         };

  83. } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;

  84. typedef BOOLEAN (*EX_ENUMERATE_HANDLE_ROUTINE)(
  85.         IN PHANDLE_TABLE_ENTRY HandleTableEntry,
  86.         IN HANDLE Handle,
  87.         IN PVOID EnumParameter
  88.         );

  89. EXTERN_C NTKERNELAPI BOOLEAN ExEnumHandleTable (
  90.                                    __in PHANDLE_TABLE HandleTable,
  91.                                    __in EX_ENUMERATE_HANDLE_ROUTINE EnumHandleProcedure,
  92.                                    __in PVOID EnumParameter,
  93.                                    __out_opt PHANDLE Handle
  94.                                    );

  95. EXTERN_C NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(
  96.                                                    __in HANDLE ProcessId,
  97.                                                    __deref_out PEPROCESS *Process
  98.                                                    );


  99. typedef struct _OBJECT_CREATE_INFORMATION {
  100.         ULONG Attributes;
  101.         HANDLE RootDirectory;
  102.         PVOID ParseContext;
  103.         KPROCESSOR_MODE ProbeMode;
  104.         ULONG PagedPoolCharge;
  105.         ULONG NonPagedPoolCharge;
  106.         ULONG SecurityDescriptorCharge;
  107.         PSECURITY_DESCRIPTOR SecurityDescriptor;
  108.         PSECURITY_QUALITY_OF_SERVICE SecurityQos;
  109.         SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
  110. } OBJECT_CREATE_INFORMATION;

  111. typedef struct _OBJECT_CREATE_INFORMATION *POBJECT_CREATE_INFORMATION;;

  112. typedef struct _OBJECT_HEADER {
  113.         LONG_PTR PointerCount;
  114.         union {
  115.                 LONG_PTR HandleCount;
  116.                 PVOID NextToFree;
  117.         };
  118.         POBJECT_TYPE Type;
  119.         UCHAR NameInfoOffset;
  120.         UCHAR HandleInfoOffset;
  121.         UCHAR QuotaInfoOffset;
  122.         UCHAR Flags;

  123.         union {
  124.                 POBJECT_CREATE_INFORMATION ObjectCreateInfo;
  125.                 PVOID QuotaBlockCharged;
  126.         };

  127.         PSECURITY_DESCRIPTOR SecurityDescriptor;
  128.         QUAD Body;
  129. } OBJECT_HEADER, *POBJECT_HEADER;


  130. #define OBJECT_TO_OBJECT_HEADER( o ) \
  131.         CONTAINING_RECORD( (o), OBJECT_HEADER, Body )

  132. typedef struct _tagRETENUMHANDLE
  133. {
  134.         PUCHAR pszName;
  135.         PEPROCESS pEprocess;
  136. }RETENUMHANDLE, *PRETENUMHANDLE;
复制代码
Driver.cpp
  1. #include "Driver.h"

  2. ULONG SearchPspCidTable()
  3. {
  4.         PUCHAR p = (PUCHAR)PsLookupProcessByProcessId;
  5.         ULONG i = 0;
  6.         BOOLEAN bFind = FALSE;

  7.         while(i < 0x100)
  8.         {
  9.                 if (*p == 0xff
  10.                         && *(p + 1) == 0x35
  11.                         && *(p + 6) == 0xe8
  12.                         && *(p - 1) == 0x53)
  13.                 {
  14.                         bFind = TRUE;
  15.                         break;
  16.                 }
  17.                 i++;
  18.                 p++;
  19.         }

  20.         if (!bFind)
  21.         {
  22.                 KdPrint(("Find faile!\n"));
  23.                 return 0;
  24.         }


  25.         ULONG uFindAddr = *(PULONG)*(PULONG)(p + 2);

  26.         return uFindAddr;
  27. }

  28. BOOLEAN IsProcess(PVOID Object)
  29. {
  30.         if (Object == NULL)
  31.         {
  32.                 return FALSE;
  33.         }
  34.         if (!MmIsAddressValid(Object))
  35.         {
  36.                 return FALSE;
  37.         }

  38.         POBJECT_TYPE ObjectType = ((POBJECT_HEADER)(OBJECT_TO_OBJECT_HEADER(Object)))->Type;

  39.         if (!MmIsAddressValid(Object) || ObjectType == NULL)
  40.         {
  41.                 return FALSE;
  42.         }

  43.         if (ObjectType != *PsProcessType)
  44.         {
  45.                 return FALSE;
  46.         }

  47.         return TRUE;
  48. }

  49. BOOLEAN EnumHandleCallBack(IN PHANDLE_TABLE_ENTRY HandleTableEntry,
  50.                                                                            IN HANDLE Handle,
  51.                                                                            IN PVOID EnumParameter
  52.                                                                            )
  53. {
  54.         PRETENUMHANDLE pRetEnumHandle = (PRETENUMHANDLE)EnumParameter;
  55.         if (pRetEnumHandle == NULL || pRetEnumHandle->pszName == NULL)
  56.         {
  57.                 return TRUE;
  58.         }

  59.         PVOID Object = HandleTableEntry->Object;
  60.         if (Object == NULL)
  61.         {
  62.                 return TRUE;
  63.         }

  64.         if (IsProcess(Object))
  65.         {
  66.                 UCHAR szProcessName[16] = {0};
  67.                 memcpy(szProcessName, (PVOID)((ULONG)Object + 0x174), 16);

  68.                 if (strstr((char *)szProcessName, (char *)pRetEnumHandle->pszName) != 0)
  69.                 {
  70.                         KdPrint(("%s\n", szProcessName));
  71.                         pRetEnumHandle->pEprocess = (PEPROCESS)Object;
  72.                         return TRUE;
  73.                 }
  74.         }

  75.         return FALSE;
  76. }


  77. PEPROCESS GetEprocessByName(PUCHAR pszProcessName)
  78. {
  79.         if (pszProcessName == NULL)
  80.         {
  81.                 return NULL;
  82.         }

  83.         PHANDLE_TABLE PspCidTable = (PHANDLE_TABLE)SearchPspCidTable();
  84.         HANDLE rhandle = 0;

  85.         RETENUMHANDLE RetEnumHandle = {0};
  86.         RetEnumHandle.pszName = pszProcessName;

  87.         ExEnumHandleTable(PspCidTable, EnumHandleCallBack, &RetEnumHandle, &rhandle);

  88.         if (RetEnumHandle.pEprocess != NULL)
  89.         {
  90.                 return RetEnumHandle.pEprocess;
  91.         }

  92.         return NULL;
  93. }

  94. #pragma INITCODE
  95. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
  96. {
  97.     NTSTATUS status = STATUS_SUCCESS;


  98.         PEPROCESS pEprocess = GetEprocessByName((PUCHAR)"csrss.exe");
  99.         KdPrint(("%x\n", pEprocess));

  100.     DriverObject->DriverUnload = DriverUnload;
  101.     return status;
  102. }

  103. #pragma PAGEDCODE
  104. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
  105. {
  106.   
  107.     KdPrint(("DriverEntry unLoading...\n"));
  108.   
  109. }
复制代码

返回列表