日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

windows 驱动实现进程枚举

發(fā)布時(shí)間:2023/12/10 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows 驱动实现进程枚举 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

因?yàn)樽罱行枨髮?xiě)windows平臺(tái)下的發(fā)外掛模塊,需要實(shí)現(xiàn)對(duì)進(jìn)程的監(jiān)控,其中一個(gè)線程需要匹配進(jìn)程名,那么問(wèn)題來(lái)了,這就需要獲取所有進(jìn)程名稱。
在用戶層ring3下,枚舉進(jìn)程的方法主要有:

1.CreateToolhelp32Snapshot 通過(guò)快照枚舉,x86和x64,winxp-win10 均可獲取到進(jìn)程名稱。

2.通過(guò) Psapi.dll,LoadLibrary(“PSAPI.DLL”),調(diào)用其EnumProcesses()枚舉進(jìn)程,x86和x64,winxp-win10 均可獲取到進(jìn)程名稱,但是這個(gè)方法會(huì)OpenProcess打開(kāi)進(jìn)程,在ring3層打開(kāi)進(jìn)程,很大概率遇到訪問(wèn)權(quán)限問(wèn)題,所以慎用。

3.通過(guò)Wtsapi32.dll, WTSOpenServer()和WTSEnumerateProcess()函數(shù)來(lái)枚舉進(jìn)程,但是這個(gè)函數(shù)需要首先傳入NetBios名稱,而且要打開(kāi)服務(wù)來(lái)執(zhí)行,就怕遇到獲取不到NetBios名稱或者服務(wù)打開(kāi)失敗的情況,所以定時(shí)枚舉循環(huán)進(jìn)程的話慎用。

4.就是最穩(wěn)定也最常用的方法了,通過(guò)ntdll.dll 導(dǎo)出的ZwQuerySystemInformation實(shí)現(xiàn)進(jìn)程枚舉。當(dāng)然這是在ring3層,需要注意寬字符轉(zhuǎn)換ANSI, 建議使用這種方法。

以上都是ring3層,用戶層枚舉進(jìn)程的方法。

可是我們的游戲保護(hù),不能在用戶層,不然隨便一個(gè)SSDT表修改或者Hook jmp 跳轉(zhuǎn),就可以繞過(guò),必須使用驅(qū)動(dòng)來(lái)保護(hù)游戲,不過(guò)驅(qū)動(dòng)保護(hù)涉及到驅(qū)動(dòng)簽名的問(wèn)題,不過(guò)有國(guó)外的大牛寫(xiě)了驅(qū)動(dòng)偽造簽名的工具,我們偽造微軟的驅(qū)動(dòng)簽名,然后就可以悄無(wú)聲息的保護(hù)游戲了。不廢話 vs2010 vc++ 驅(qū)動(dòng)枚舉進(jìn)程。

DriverProtect.h

#ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endifpragma pack(1) /*SSDT表*/ typedef struct ServiceDescriptorEntry {unsigned int *ServiceTableBase; unsigned int *ServiceCounterTableBase; unsigned int NumberOfServices; unsigned char *ParamTableBase; }ServiceDescriptorEntry_t, *PServiceDescriptorEntry;pragma pack() typedef struct _PROCESS_INFO {ULONG_PTR eprocess; ULONG pid; ULONG ppid; UNICODE_STRING pathName; UNICODE_STRING ImageFileName; }PROCESSINFO,*PPROCESSINFO;typedef struct _SYSTEM_THREADS {LARGE_INTEGER KernelTime;LARGE_INTEGER UserTime;LARGE_INTEGER CreateTime;ULONG WaitTime;PVOID StartAddress;CLIENT_ID ClientID;KPRIORITY Priority;KPRIORITY BasePriority;ULONG ContextSwitchCount;ULONG ThreadState;KWAIT_REASON WaitReason;ULONG Reserved; //Add }SYSTEM_THREADS,*PSYSTEM_THREADS;typedef struct _SYSTEM_PROCESSES {ULONG NextEntryDelta; ULONG ThreadCount; ULONG Reserved[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ProcessName; KPRIORITY BasePriority; ULONG ProcessId; ULONG InheritedFromProcessId; ULONG HandleCount; ULONG Reserved2[2]; VM_COUNTERS VmCounters; IO_COUNTERS IoCounters; } _SYSTEM_PROCESSES,*PSYSTEM_PROCESSES;typedef enum _SYSTEM_INFORMATION_CLASS {SystemBasicInformation, // 0 Y N SystemProcessorInformation, // 1 Y N SystemPerformanceInformation, // 2 Y N SystemTimeOfDayInformation, // 3 Y N SystemNotImplemented1, // 4 Y N SystemProcessesAndThreadsInformation, // 5 Y N SystemCallCounts, // 6 Y N SystemConfigurationInformation, // 7 Y N SystemProcessorTimes, // 8 Y N SystemGlobalFlag, // 9 Y Y SystemNotImplemented2, // 10 Y N SystemModuleInformation, // 11 Y N SystemLockInformation, // 12 Y N SystemNotImplemented3, // 13 Y N SystemNotImplemented4, // 14 Y N SystemNotImplemented5, // 15 Y N SystemHandleInformation, // 16 Y N SystemObjectInformation, // 17 Y N SystemPagefileInformation, // 18 Y N SystemInstructionEmulationCounts, // 19 Y N SystemInvalidInfoClass1, // 20 SystemCacheInformation, // 21 Y Y SystemPoolTagInformation, // 22 Y N SystemProcessorStatistics, // 23 Y N SystemDpcInformation, // 24 Y Y SystemNotImplemented6, // 25 Y N SystemLoadImage, // 26 N Y SystemUnloadImage, // 27 N Y SystemTimeAdjustment, // 28 Y Y SystemNotImplemented7, // 29 Y N SystemNotImplemented8, // 30 Y N SystemNotImplemented9, // 31 Y N SystemCrashDumpInformation, // 32 Y N SystemExceptionInformation, // 33 Y N SystemCrashDumpStateInformation, // 34 Y Y/N SystemKernelDebuggerInformation, // 35 Y N SystemContextSwitchInformation, // 36 Y N SystemRegistryQuotaInformation, // 37 Y Y SystemLoadAndCallImage, // 38 N Y SystemPrioritySeparation, // 39 N Y SystemNotImplemented10, // 40 Y N SystemNotImplemented11, // 41 Y N SystemInvalidInfoClass2, // 42 SystemInvalidInfoClass3, // 43 SystemTimeZoneInformation, // 44 Y N SystemLookasideInformation, // 45 Y N SystemSetTimeSlipEvent, // 46 N Y SystemCreateSession, // 47 N Y SystemDeleteSession, // 48 N Y SystemInvalidInfoClass4, // 49 SystemRangeStartInformation, // 50 Y N SystemVerifierInformation, // 51 Y Y SystemAddVerifier, // 52 N Y SystemSessionProcessesInformation // 53 Y N } SYSTEM_INFORMATION_CLASS;

DriverProtect.cpp

#include "ntddk.h" #include "ntdef.h" #include "DriverProtect.h"#define SystemProcessesAndThreadsInformation 5extern "C" NTSTATUS ZwQuerySystemInformation(IN ULONG SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); VOID UnLoadDriver(PDRIVER_OBJECT DriverObject) {KdPrint(("驅(qū)動(dòng)成功卸載!")); }VOID EnmuProcess() {ULONG cbBuffer = 0x8000; PVOID pBuffer = NULL; NTSTATUS rc; LPWSTR pszProcessName; PSYSTEM_PROCESSES pInfo; do{pBuffer = ExAllocatePool (NonPagedPool, cbBuffer); if (pBuffer == NULL){return;}rc = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, pBuffer, cbBuffer, NULL);if ( rc == STATUS_INFO_LENGTH_MISMATCH) //緩沖區(qū)不足{ExFreePool(pBuffer);cbBuffer *= 2;}else if (!NT_SUCCESS(rc)){ExFreePool(pBuffer);return;}}while (rc == STATUS_INFO_LENGTH_MISMATCH);pInfo = (PSYSTEM_PROCESSES)pBuffer;while (1){pszProcessName = pInfo->ProcessName.Buffer;if (pszProcessName == NULL){pszProcessName = L"NULL";}if (pInfo->ProcessId == 0){DbgPrint("PID %5d System Idle Process", pInfo->ProcessId);}else{DbgPrint("PID %5d %ws/r/n", pInfo->ProcessId, pInfo->ProcessName.Buffer);}if (pInfo->NextEntryDelta == 0){break;}pInfo = (PSYSTEM_PROCESSES)(((PUCHAR)pInfo) + pInfo->NextEntryDelta);}ExFreePool(pBuffer); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) {DriverObject->DriverUnload = UnLoadDriver;EnmuProcess();return STATUS_SUCCESS; }

生成了驅(qū)動(dòng),我們跑到虛擬機(jī)上,復(fù)制驅(qū)動(dòng)文件和符號(hào)到虛擬機(jī)


我們使用的 visualDDK + windbg 通過(guò)虛擬機(jī)調(diào)試
內(nèi)核映射


打開(kāi)windbg , 然后遠(yuǎn)程連接虛擬機(jī)。


如果windbg 顯示 Debuggee is running…,表示沒(méi)有斷點(diǎn),內(nèi)核是跑起來(lái)的,此時(shí)我們加載剛才生成的驅(qū)動(dòng),instdrv,加載,啟動(dòng)。


此時(shí)觀察windbg, DbgPrint打印信息就是枚舉驅(qū)動(dòng)的pid和進(jìn)程名。


既然已經(jīng)進(jìn)入內(nèi)核了,而且也獲取到進(jìn)程名稱和PID了,此時(shí)操作內(nèi)核和殺軟是在同一個(gè)級(jí)別,所以殺軟沒(méi)有任何提示的,當(dāng)然你就可以進(jìn)行模塊枚舉或者h(yuǎn)ook 內(nèi)存讀寫(xiě)函數(shù)或者進(jìn)程打開(kāi)函數(shù),然后保護(hù)你想保護(hù)的進(jìn)程。

總結(jié)

以上是生活随笔為你收集整理的windows 驱动实现进程枚举的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。