EnumProcessThread(枚举进程线程)

原文地址: https://blog.csdn.net/qq125096885/article/details/75045032

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq125096885/article/details/75045032

 

 
  1. #pragma once

  2.  
  3.  
  4. #ifndef MAX_PATH

  5. #define MAX_PATH 260

  6. #endif

  7.  
  8.  
  9. typedef enum _SYSTEM_INFORMATION_CLASS {

  10. SystemBasicInformation,

  11. SystemProcessorInformation, // obsolete...delete

  12. SystemPerformanceInformation,

  13. SystemTimeOfDayInformation,

  14. SystemPathInformation,

  15. SystemProcessInformation,

  16. SystemCallCountInformation,

  17. SystemDeviceInformation,

  18. SystemProcessorPerformanceInformation,

  19. SystemFlagsInformation,

  20. SystemCallTimeInformation,

  21. SystemModuleInformation,

  22. SystemLocksInformation,

  23. SystemStackTraceInformation,

  24. SystemPagedPoolInformation,

  25. SystemNonPagedPoolInformation,

  26. SystemHandleInformation,

  27. SystemObjectInformation,

  28. SystemPageFileInformation,

  29. SystemVdmInstemulInformation,

  30. SystemVdmBopInformation,

  31. SystemFileCacheInformation,

  32. SystemPoolTagInformation,

  33. SystemInterruptInformation,

  34. SystemDpcBehaviorInformation,

  35. SystemFullMemoryInformation,

  36. SystemLoadGdiDriverInformation,

  37. SystemUnloadGdiDriverInformation,

  38. SystemTimeAdjustmentInformation,

  39. SystemSummaryMemoryInformation,

  40. SystemMirrorMemoryInformation,

  41. SystemPerformanceTraceInformation,

  42. SystemObsolete0,

  43. SystemExceptionInformation,

  44. SystemCrashDumpStateInformation,

  45. SystemKernelDebuggerInformation,

  46. SystemContextSwitchInformation,

  47. SystemRegistryQuotaInformation,

  48. SystemExtendServiceTableInformation,

  49. SystemPrioritySeperation,

  50. SystemVerifierAddDriverInformation,

  51. SystemVerifierRemoveDriverInformation,

  52. SystemProcessorIdleInformation,

  53. SystemLegacyDriverInformation,

  54. SystemCurrentTimeZoneInformation,

  55. SystemLookasideInformation,

  56. SystemTimeSlipNotification,

  57. SystemSessionCreate,

  58. SystemSessionDetach,

  59. SystemSessionInformation,

  60. SystemRangeStartInformation,

  61. SystemVerifierInformation,

  62. SystemVerifierThunkExtend,

  63. SystemSessionProcessInformation,

  64. SystemLoadGdiDriverInSystemSpace,

  65. SystemNumaProcessorMap,

  66. SystemPrefetcherInformation,

  67. SystemExtendedProcessInformation,

  68. SystemRecommendedSharedDataAlignment,

  69. SystemComPlusPackage,

  70. SystemNumaAvailableMemory,

  71. SystemProcessorPowerInformation,

  72. SystemEmulationBasicInformation,

  73. SystemEmulationProcessorInformation,

  74. SystemExtendedHandleInformation,

  75. SystemLostDelayedWriteInformation,

  76. SystemBigPoolInformation,

  77. SystemSessionPoolTagInformation,

  78. SystemSessionMappedViewInformation,

  79. SystemHotpatchInformation,

  80. SystemObjectSecurityMode,

  81. SystemWatchdogTimerHandler,

  82. SystemWatchdogTimerInformation,

  83. SystemLogicalProcessorInformation,

  84. SystemWow64SharedInformation,

  85. SystemRegisterFirmwareTableInformationHandler,

  86. SystemFirmwareTableInformation,

  87. SystemModuleInformationEx,

  88. SystemVerifierTriageInformation,

  89. SystemSuperfetchInformation,

  90. SystemMemoryListInformation,

  91. SystemFileCacheInformationEx,

  92. MaxSystemInfoClass // MaxSystemInfoClass should always be the last enum

  93. } SYSTEM_INFORMATION_CLASS;

  94.  
  95.  
  96. typedef struct _SYSTEM_THREAD_INFORMATION

  97. {

  98. LARGE_INTEGER KernelTime;

  99. LARGE_INTEGER UserTime;

  100. LARGE_INTEGER CreateTime;

  101. ULONG WaitTime;

  102. PVOID StartAddress;

  103. CLIENT_ID ClientId;

  104. KPRIORITY Priority;

  105. LONG BasePriority;

  106. ULONG ContextSwitches;

  107. ULONG ThreadState;

  108. KWAIT_REASON WaitReason;

  109. }SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;

  110.  
  111. typedef struct _SYSTEM_PROCESS_INFO

  112. {

  113. ULONG NextEntryOffset;

  114. ULONG NumberOfThreads;

  115. LARGE_INTEGER WorkingSetPrivateSize;

  116. ULONG HardFaultCount;

  117. ULONG NumberOfThreadsHighWatermark;

  118. ULONGLONG CycleTime;

  119. LARGE_INTEGER CreateTime;

  120. LARGE_INTEGER UserTime;

  121. LARGE_INTEGER KernelTime;

  122. UNICODE_STRING ImageName;

  123. KPRIORITY BasePriority;

  124. HANDLE UniqueProcessId;

  125. HANDLE InheritedFromUniqueProcessId;

  126. ULONG HandleCount;

  127. ULONG SessionId;

  128. ULONG_PTR UniqueProcessKey;

  129. SIZE_T PeakVirtualSize;

  130. SIZE_T VirtualSize;

  131. ULONG PageFaultCount;

  132. SIZE_T PeakWorkingSetSize;

  133. SIZE_T WorkingSetSize;

  134. SIZE_T QuotaPeakPagedPoolUsage;

  135. SIZE_T QuotaPagedPoolUsage;

  136. SIZE_T QuotaPeakNonPagedPoolUsage;

  137. SIZE_T QuotaNonPagedPoolUsage;

  138. SIZE_T PagefileUsage;

  139. SIZE_T PeakPagefileUsage;

  140. SIZE_T PrivatePageCount;

  141. LARGE_INTEGER ReadOperationCount;

  142. LARGE_INTEGER WriteOperationCount;

  143. LARGE_INTEGER OtherOperationCount;

  144. LARGE_INTEGER ReadTransferCount;

  145. LARGE_INTEGER WriteTransferCount;

  146. LARGE_INTEGER OtherTransferCount;

  147. SYSTEM_THREAD_INFORMATION Threads[1];

  148. }SYSTEM_PROCESS_INFO, *PSYSTEM_PROCESS_INFO;

  149.  
  150.  
  151.  
  152.  
  153.  
  154. typedef struct _RTL_PROCESS_MODULE_INFORMATION {

  155. HANDLE Section; // Not filled in

  156. PVOID MappedBase;

  157. PVOID ImageBase;

  158. ULONG ImageSize;

  159. ULONG Flags;

  160. USHORT LoadOrderIndex;

  161. USHORT InitOrderIndex;

  162. USHORT LoadCount;

  163. USHORT OffsetToFileName;

  164. UCHAR ImageName[MAXIMUM_FILENAME_LENGTH];

  165. } RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION;

  166.  
  167. typedef struct _RTL_PROCESS_MODULES {

  168. ULONG NumberOfModules;

  169. RTL_PROCESS_MODULE_INFORMATION Modules[1];

  170. } RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES;


 

 

 

 
  1. #include <ntifs.h>

  2. #include <ntddk.h>

  3. #include <ntintsafe.h>

  4. #include "Header.h"

  5.  
  6.  
  7. //删除指针

  8. #define SafeFreeDelete(pData) { if(pData){ExFreePool(pData);pData=NULL;} }

  9.  
  10. NTSTATUS ZwQueryInformationThread(HANDLE ThreadHandle,THREADINFOCLASS ThreadInformationClass,PVOID ThreadInformation,ULONG ThreadInformationLength,PULONG ReturnLength);

  11.  
  12. NTSTATUS ZwQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);

  13.  
  14. PETHREAD GetThread(HANDLE ThreadId)

  15. {

  16. PETHREAD Thread = NULL;

  17. PETHREAD Result = NULL;

  18.  
  19. if (PsLookupThreadByThreadId(ThreadId, &Thread) == STATUS_SUCCESS)

  20. {

  21. Result = Thread;

  22. ObDereferenceObject(Thread);

  23. }

  24. return Result;

  25. }

  26.  
  27.  
  28. HANDLE OpenThread(ULONG ThreadId)

  29. {

  30. NTSTATUS status;

  31. PETHREAD Thread = NULL;

  32. HANDLE hThread = NULL;

  33. UNICODE_STRING Unicode;

  34.  
  35. status = PsLookupThreadByThreadId(ThreadId, &Thread);

  36.  
  37. if (NT_SUCCESS(status))

  38. {

  39. if (PsThreadType)

  40. {

  41. status = ObOpenObjectByPointer(Thread,NULL,NULL,THREAD_ALL_ACCESS,(PVOID)*PsThreadType,KernelMode,&hThread);

  42. if (NT_SUCCESS(status))

  43. {

  44. ObDereferenceObject(Thread);

  45. return hThread;

  46. }

  47. }

  48. }

  49.  
  50. return 0;

  51. }

  52.  
  53. void GetModuleName(PVOID dwBase,PCHAR strName, PCHAR strPath)

  54. {

  55.  
  56. NTSTATUS status;

  57. ULONG size = 0, index = 0;

  58. PRTL_PROCESS_MODULES ProcessModules = NULL;

  59. PRTL_PROCESS_MODULE_INFORMATION pModuleInformation = NULL;

  60.  
  61.  
  62. do

  63. {

  64. status = ZwQuerySystemInformation(SystemModuleInformation, NULL, NULL, &size);

  65. if (STATUS_INFO_LENGTH_MISMATCH != status || size <= 0)

  66. {

  67. ASSERT(FALSE);

  68. break;

  69. }

  70.  
  71. size *= 4;

  72. if ((ProcessModules = (PULONG_PTR)ExAllocatePool(NonPagedPool, size)) == NULL)

  73. {

  74. ASSERT(FALSE);

  75. break;

  76. }

  77.  
  78. RtlZeroMemory(ProcessModules, size);

  79. status = ZwQuerySystemInformation(SystemModuleInformation, ProcessModules, size, NULL);

  80. if (!NT_SUCCESS(status))

  81. {

  82. ASSERT(FALSE);

  83. break;

  84. }

  85.  
  86.  
  87. pModuleInformation = (PRTL_PROCESS_MODULE_INFORMATION)(ProcessModules->Modules);

  88. for (index = 0; index < ProcessModules->NumberOfModules; index++)

  89. {

  90. PVOID ImageBaseAddress;

  91. ULONG_PTR ImageSize;

  92. ULONG_PTR ImageEnd;

  93.  
  94. ImageBaseAddress = pModuleInformation[index].ImageBase;

  95. ImageSize = pModuleInformation[index].ImageSize;

  96. ImageEnd = ImageSize + (ULONG_PTR)ImageBaseAddress;

  97.  
  98. if (ImageBaseAddress <= dwBase && dwBase <= ImageEnd)

  99. {

  100. strcpy(strName, pModuleInformation[index].ImageName + pModuleInformation[index].OffsetToFileName);

  101. strcpy(strPath, pModuleInformation[index].ImageName);

  102. break;

  103. }

  104. }

  105.  
  106.  
  107.  
  108. } while (FALSE);

  109.  
  110. SafeFreeDelete(ProcessModules);

  111. return;

  112. }

  113.  
  114.  
  115. void EnumProcessThread(ULONG ProcessId)

  116. {

  117. NTSTATUS Status;

  118. PSYSTEM_PROCESS_INFO ProcessInfo = NULL;

  119. PVOID pBuffer = NULL;

  120. ULONG size = 0;

  121.  
  122.  
  123.  
  124. //切换当前模式为内核模式

  125.  
  126. do

  127. {

  128. Status = ZwQuerySystemInformation(SystemProcessInformation, NULL, 0, &size);

  129. if (Status != STATUS_INFO_LENGTH_MISMATCH || size <= 0)

  130. {

  131. ASSERT(FALSE);

  132. break;

  133. }

  134.  
  135. size *= 2;

  136. pBuffer = ExAllocatePool(NonPagedPool, size); //分配内存缓冲区

  137. if (pBuffer==NULL)

  138. {

  139. ASSERT(FALSE);

  140. break;

  141. }

  142.  
  143. RtlZeroMemory(pBuffer, size);

  144. Status = ZwQuerySystemInformation(SystemProcessInformation, pBuffer, size, &size);

  145. if (!NT_SUCCESS(Status))

  146. {

  147. ASSERT(FALSE);

  148. break;

  149. }

  150.  
  151. ProcessInfo = (PSYSTEM_PROCESS_INFO)pBuffer;

  152.  
  153. while (TRUE)

  154. {

  155. if (ProcessInfo->UniqueProcessId == ProcessId)

  156. {

  157.  
  158. for (ULONG_PTR i = 0; i < ProcessInfo->NumberOfThreads; i++)

  159. {

  160. HANDLE hThread = NULL;

  161. PVOID Win32StartAddress = 0;

  162. PETHREAD Thread;

  163. HANDLE ThreadId;

  164. ULONG Priority;

  165. ULONG ContextSwitches;

  166. ULONG ThreadState;

  167. ULONG WaitReason;

  168. char* pModuleName = ExAllocatePool(NonPagedPool, MAX_PATH);

  169. char* pImagePath = ExAllocatePool(NonPagedPool, MAX_PATH);

  170. ASSERT(pModuleName);

  171. ASSERT(pImagePath);

  172. RtlZeroMemory(pModuleName, MAX_PATH);

  173. RtlZeroMemory(pImagePath, MAX_PATH);

  174.  
  175. ThreadId = ProcessInfo->Threads[i].ClientId.UniqueThread; // 进程ID 与 线程ID

  176. Thread = GetThread(ThreadId); // 线程 PETHREAD

  177. Priority= (ULONG)ProcessInfo->Threads[i].Priority; // 线程优先级

  178. ContextSwitches = ProcessInfo->Threads[i].ContextSwitches; // 切换数

  179. ThreadState = ProcessInfo->Threads[i].ThreadState; // 当前状态

  180. WaitReason = ProcessInfo->Threads[i].WaitReason; //等待原因

  181. //Suspended

  182.  
  183. hThread = OpenThread(ProcessInfo->Threads[i].ClientId.UniqueThread);

  184. if (hThread)

  185. {

  186. Status = ZwQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, (PVOID)Win32StartAddress, sizeof(PVOID), NULL);

  187. ZwClose(hThread);

  188. if (!NT_SUCCESS(Status))

  189. {

  190. Win32StartAddress = ProcessInfo->Threads[i].StartAddress;

  191. }

  192. GetModuleName(Win32StartAddress, pModuleName, pImagePath);

  193. }

  194.  
  195. KdPrint(("ThreadId=%d Thread=%p Priority=%d ContextSwitches=%d ThreadState=%d WaitReason=%d Win32StartAddress=%p ModuleName=%s ImagePath=%s\n", ThreadId, Thread, Priority, ContextSwitches, ThreadState, WaitReason,Win32StartAddress, pModuleName, pImagePath));

  196. SafeFreeDelete(pModuleName);

  197. SafeFreeDelete(pImagePath);

  198. }

  199. break;

  200. }

  201.  
  202. if (ProcessInfo==NULL)

  203. {

  204. break;

  205. }

  206.  
  207. if (ProcessInfo->NextEntryOffset == 0)

  208. {

  209. break;

  210. }

  211. ProcessInfo = (PSYSTEM_PROCESS_INFO)(((PUCHAR)ProcessInfo) + ProcessInfo->NextEntryOffset);

  212.  
  213. }

  214.  
  215.  
  216. } while (FALSE);

  217.  
  218.  
  219. SafeFreeDelete(pBuffer);

  220. return;

  221. }

  222.  
  223.  
  224.  
  225. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)

  226. {

  227. return;

  228. }

  229.  
  230.  
  231. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

  232. {

  233.  
  234. DriverObject->DriverUnload = DriverUnload;

  235.  
  236. DbgBreakPoint();

  237. EnumProcessThread(PsGetCurrentProcessId());

  238. return STATUS_SUCCESS;

  239. }


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值