枚舉進程句柄File,Section,Mutant,Timer關閉Mutex句柄實現游戲多開


標 題: 枚舉進程句柄File,Section,Mutant,Timer關閉Mutex句柄實現游戲多開
作 者: Y4ng
時 間: 2012-09-06 19:50:32 星期四
鏈 接: http://www.cnblogs.com/Y4ng/archive/2012/09/06/EnumProcessHandle_EnumMutex.html

 

   相信做過游戲多開的朋友就會發現,很多游戲普遍使用互斥mutex來防止程序多開,說實話這種方式已經非常OUT了。但是由於時間和技術的沉淀關系,留下來的游戲依然會存在這種方式。 最近接觸到一款游戲是N前非常火熱的對戰游戲,可以稱為經典之作;它就是用的Mutant來實現游戲防止多開的,一般咱們測試的時候都是用Xuetr來關閉游戲,但是要作為成品發布不可能要求客戶拿Xuetr來列進程對象句柄,關句柄吧~

   網上搜索了半天都沒有找到枚舉進程句柄的例子,經過群里的大牛提點指到 ZwQuerySystemInformation SystemHandleInformation 可以實現句柄枚舉功能;經過一番搜索編碼測試 於是有了本文代碼;

  1 /*頭文件聲明*/
  2 typedef LONG NTSTATUS;
  3 #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
  4 #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
  5 
  6 typedef enum _SYSTEM_INFORMATION_CLASS {
  7     SystemBasicInformation,              // 0        Y        N
  8     SystemProcessorInformation,          // 1        Y        N
  9     SystemPerformanceInformation,        // 2        Y        N
 10     SystemTimeOfDayInformation,          // 3        Y        N
 11     SystemNotImplemented1,               // 4        Y        N
 12     SystemProcessesAndThreadsInformation, // 5       Y        N
 13     SystemCallCounts,                    // 6        Y        N
 14     SystemConfigurationInformation,      // 7        Y        N
 15     SystemProcessorTimes,                // 8        Y        N
 16     SystemGlobalFlag,                    // 9        Y        Y
 17     SystemNotImplemented2,               // 10       Y        N
 18     SystemModuleInformation,             // 11       Y        N
 19     SystemLockInformation,               // 12       Y        N
 20     SystemNotImplemented3,               // 13       Y        N
 21     SystemNotImplemented4,               // 14       Y        N
 22     SystemNotImplemented5,               // 15       Y        N
 23     SystemHandleInformation,             // 16       Y        N
 24     SystemObjectInformation,             // 17       Y        N
 25     SystemPagefileInformation,           // 18       Y        N
 26     SystemInstructionEmulationCounts,    // 19       Y        N
 27     SystemInvalidInfoClass1,             // 20
 28     SystemCacheInformation,              // 21       Y        Y
 29     SystemPoolTagInformation,            // 22       Y        N
 30     SystemProcessorStatistics,           // 23       Y        N
 31     SystemDpcInformation,                // 24       Y        Y
 32     SystemNotImplemented6,               // 25       Y        N
 33     SystemLoadImage,                     // 26       N        Y
 34     SystemUnloadImage,                   // 27       N        Y
 35     SystemTimeAdjustment,                // 28       Y        Y
 36     SystemNotImplemented7,               // 29       Y        N
 37     SystemNotImplemented8,               // 30       Y        N
 38     SystemNotImplemented9,               // 31       Y        N
 39     SystemCrashDumpInformation,          // 32       Y        N
 40     SystemExceptionInformation,          // 33       Y        N
 41     SystemCrashDumpStateInformation,     // 34       Y        Y/N
 42     SystemKernelDebuggerInformation,     // 35       Y        N
 43     SystemContextSwitchInformation,      // 36       Y        N
 44     SystemRegistryQuotaInformation,      // 37       Y        Y
 45     SystemLoadAndCallImage,              // 38       N        Y
 46     SystemPrioritySeparation,            // 39       N        Y
 47     SystemNotImplemented10,              // 40       Y        N
 48     SystemNotImplemented11,              // 41       Y        N
 49     SystemInvalidInfoClass2,             // 42
 50     SystemInvalidInfoClass3,             // 43
 51     SystemTimeZoneInformation,           // 44       Y        N
 52     SystemLookasideInformation,          // 45       Y        N
 53     SystemSetTimeSlipEvent,              // 46       N        Y
 54     SystemCreateSession,                 // 47       N        Y
 55     SystemDeleteSession,                 // 48       N        Y
 56     SystemInvalidInfoClass4,             // 49
 57     SystemRangeStartInformation,         // 50       Y        N
 58     SystemVerifierInformation,           // 51       Y        Y
 59     SystemAddVerifier,                   // 52       N        Y
 60     SystemSessionProcessesInformation    // 53       Y        N
 61 } SYSTEM_INFORMATION_CLASS;
 62 
 63 typedef struct _CLIENT_ID
 64 {
 65     HANDLE UniqueProcess;
 66     HANDLE UniqueThread;
 67 }CLIENT_ID,*PCLIENT_ID;
 68 
 69 typedef struct
 70 {
 71     USHORT Length;
 72     USHORT MaxLen;
 73     USHORT *Buffer;
 74 }UNICODE_STRING, *PUNICODE_STRING;
 75 
 76 typedef struct _OBJECT_ATTRIBUTES 
 77 {
 78     ULONG Length;
 79     HANDLE RootDirectory;
 80     PUNICODE_STRING ObjectName;
 81     ULONG Attributes;
 82     PVOID SecurityDescriptor;
 83     PVOID SecurityQualityOfService;
 84 } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; 
 85 
 86 typedef struct _IO_COUNTERSEX {
 87     LARGE_INTEGER ReadOperationCount;
 88     LARGE_INTEGER WriteOperationCount;
 89     LARGE_INTEGER OtherOperationCount;
 90     LARGE_INTEGER ReadTransferCount;
 91     LARGE_INTEGER WriteTransferCount;
 92     LARGE_INTEGER OtherTransferCount;
 93 } IO_COUNTERSEX, *PIO_COUNTERSEX;
 94 
 95 typedef enum {
 96     StateInitialized,
 97     StateReady,
 98     StateRunning,
 99     StateStandby,
100     StateTerminated,
101     StateWait,
102     StateTransition,
103     StateUnknown
104 } THREAD_STATE;
105 
106 typedef struct _VM_COUNTERS {
107     SIZE_T PeakVirtualSize;
108     SIZE_T VirtualSize;
109     ULONG PageFaultCount;
110     SIZE_T PeakWorkingSetSize;
111     SIZE_T WorkingSetSize;
112     SIZE_T QuotaPeakPagedPoolUsage;
113     SIZE_T QuotaPagedPoolUsage;
114     SIZE_T QuotaPeakNonPagedPoolUsage;
115     SIZE_T QuotaNonPagedPoolUsage;
116     SIZE_T PagefileUsage;
117     SIZE_T PeakPagefileUsage;
118 } VM_COUNTERS;
119 typedef VM_COUNTERS *PVM_COUNTERS;
120 
121 typedef struct _SYSTEM_THREADS {
122     LARGE_INTEGER KernelTime;
123     LARGE_INTEGER UserTime;
124     LARGE_INTEGER CreateTime;
125     ULONG WaitTime;
126     PVOID StartAddress;
127     CLIENT_ID ClientId;
128     ULONG Priority;
129     ULONG BasePriority;
130     ULONG ContextSwitchCount;
131     THREAD_STATE State;
132     ULONG WaitReason;
133 } SYSTEM_THREADS, *PSYSTEM_THREADS;
134 
135 typedef struct _SYSTEM_PROCESSES { // Information Class 5
136     ULONG NextEntryDelta;
137     ULONG ThreadCount;
138     ULONG Reserved1[6];
139     LARGE_INTEGER CreateTime;
140     LARGE_INTEGER UserTime;
141     LARGE_INTEGER KernelTime;
142     UNICODE_STRING ProcessName;
143     ULONG BasePriority;
144     ULONG ProcessId;
145     ULONG InheritedFromProcessId;
146     ULONG HandleCount;
147     ULONG Reserved2[2];
148     VM_COUNTERS VmCounters;
149     IO_COUNTERSEX IoCounters;  // Windows 2000 only
150     SYSTEM_THREADS Threads[1];
151 } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
152 
153 typedef struct _SYSTEM_HANDLE_INFORMATION
154 {
155     ULONG            ProcessId;
156     UCHAR            ObjectTypeNumber;
157     UCHAR            Flags;
158     USHORT            Handle;
159     PVOID            Object;
160     ACCESS_MASK        GrantedAccess;
161 } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
162 
163 typedef enum _OBJECT_INFORMATION_CLASS {
164     ObjectBasicInformation,
165     ObjectNameInformation,
166     ObjectTypeInformation,
167     ObjectAllInformation,
168     ObjectDataInformation
169 } OBJECT_INFORMATION_CLASS;
170 
171 typedef struct _OBJECT_NAME_INFORMATION {
172     UNICODE_STRING Name;
173 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
174 
175 typedef NTSTATUS (NTAPI *NTQUERYOBJECT)(
176                        _In_opt_   HANDLE Handle,
177                        _In_       OBJECT_INFORMATION_CLASS ObjectInformationClass,
178                        _Out_opt_  PVOID ObjectInformation,
179                        _In_       ULONG ObjectInformationLength,
180                        _Out_opt_  PULONG ReturnLength
181                        );
182 
183 
184 typedef NTSTATUS
185 (NTAPI *ZWQUERYSYSTEMINFORMATION)(
186                                   IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
187                                   OUT PVOID SystemInformation,
188                                   IN ULONG SystemInformationLength,
189                                   OUT PULONG ReturnLength OPTIONAL
190                                   );
191 ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
192 NTQUERYOBJECT    NtQueryObject = (NTQUERYOBJECT)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtQueryObject");

 

  1 /*功能函數體*/
  2 int _tmain(int argc, _TCHAR* argv[])
  3 {
  4     DWORD dwSize = 0;
  5     PSYSTEM_HANDLE_INFORMATION pmodule = NULL;
  6     POBJECT_NAME_INFORMATION pNameInfo;
  7     POBJECT_NAME_INFORMATION pNameType;
  8     PVOID pbuffer = NULL;
  9     NTSTATUS Status;
 10     int nIndex = 0;
 11     DWORD dwFlags = 0;
 12     char szType[128] = {0};
 13     char szName[512] = {0};
 14 
 15     if(!ZwQuerySystemInformation)
 16     {
 17         goto Exit0;
 18     }
 19 
 20     pbuffer = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
 21 
 22     if(!pbuffer)
 23     {
 24         goto Exit0;
 25     }
 26 
 27     Status = ZwQuerySystemInformation(SystemHandleInformation, pbuffer, 0x1000, &dwSize);
 28 
 29     if(!NT_SUCCESS(Status))
 30     {
 31         if (STATUS_INFO_LENGTH_MISMATCH != Status)
 32         {
 33             goto Exit0;
 34         }
 35         else
 36         {
 37             // 這里大家可以保證程序的正確性使用循環分配稍好
 38             if (NULL != pbuffer)
 39             {
 40                 VirtualFree(pbuffer, 0, MEM_RELEASE);
 41             }
 42 
 43             if (dwSize*2 > 0x4000000)  // MAXSIZE
 44             {
 45                 goto Exit0;
 46             }
 47 
 48             pbuffer = VirtualAlloc(NULL, dwSize*2, MEM_COMMIT, PAGE_READWRITE);
 49 
 50             if(!pbuffer)
 51             {
 52                 goto Exit0;
 53             }
 54 
 55             Status = ZwQuerySystemInformation(SystemHandleInformation, pbuffer, dwSize*2, NULL);
 56 
 57             if(!NT_SUCCESS(Status))
 58             {
 59                 goto Exit0;    
 60             }
 61         }
 62     }
 63 
 64     pmodule = (PSYSTEM_HANDLE_INFORMATION)((PULONG)pbuffer+1);
 65     dwSize = *((PULONG)pbuffer);
 66 
 67     for(nIndex = 0; nIndex < dwSize; nIndex++)
 68     {
 69         
 70         Status = NtQueryObject((HANDLE)pmodule[nIndex].Handle, ObjectNameInformation, szName, 512, &dwFlags);
 71 
 72         if (!NT_SUCCESS(Status))
 73         {
 74             goto Exit0;
 75         }
 76 
 77         Status = NtQueryObject((HANDLE)pmodule[nIndex].Handle, ObjectTypeInformation, szType, 128, &dwFlags);
 78 
 79         if (!NT_SUCCESS(Status))
 80         {
 81             goto Exit0;
 82         }
 83 
 84         pNameInfo = (POBJECT_NAME_INFORMATION)szName;
 85         pNameType = (POBJECT_NAME_INFORMATION)szType;
 86 
 87         printf("%wZ   %wZ\n", pNameType, pNameInfo);
 88 
 89         // 匹配是否為需要關閉的句柄名稱
 90         if (0 == wcscmp((wchar_t *)pNameType->Name.Buffer, L"Mutant"))
 91         {
 92             if (wcsstr((wchar_t *)pNameInfo->Name.Buffer, CLOSEMUTEXNAME))
 93             {
 94                 CloseHandle((HANDLE)pmodule[nIndex].Handle);
 95                 goto Exit0;
 96             }
 97         }
 98     }
 99 
100 Exit0:
101     if (NULL != pbuffer)
102     {
103         VirtualFree(pbuffer, 0, MEM_RELEASE);
104     }
105 
106     return 0;
107 }

 

CLOSEMUTEXNAME 為互斥的句柄名稱,需要為寬字節;

程序執行結果如下:

 

為了測試方便直接把程序寫入了main函數中,大家使用的時候稍微修改便可, 不過!得理解程序意思才行啊。 copy代碼不做思考的程序員不是好裁縫!

參考文章列表:

ZwQuerySystemInformation枚舉內核模塊及簡單應用 http://hi.baidu.com/_achillis/item/8b33ead8ccac28ea3cc2cb17


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM