ZwQuerySystemInformation 函数的声明
NTKERNELAPI //不知道为什么 据说DDK 里面有这个宏定义NTSTATUS
ZwQuerySystemInformation( ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength );
我是这样声明的
extern NTSTATUS ZwQuerySystemInformation(ULONG SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength); //编译通过了,实际还没有测试。
第一个参数是一个枚举类型,传入的是你需要查询的信息的类型,如果你要查询进程的相关信息,则你需要传入SystemProcessesAndThreadsInformation,要是查询系统模块信息,传入SystemInformationClass
以下是这个enmu类型的定义。
typedef enum _SYSTEM_INFORMATION_CLASS {SystemBasicInformation, // 0 Y NSystemProcessorInformation, // 1 Y NSystemPerformanceInformation, // 2 Y NSystemTimeOfDayInformation, // 3 Y NSystemNotImplemented1, // 4 Y NSystemProcessesAndThreadsInformation, // 5 Y NSystemCallCounts, // 6 Y NSystemConfigurationInformation, // 7 Y NSystemProcessorTimes, // 8 Y NSystemGlobalFlag, // 9 Y YSystemNotImplemented2, // 10 Y NSystemModuleInformation, // 11 Y NSystemLockInformation, // 12 Y NSystemNotImplemented3, // 13 Y NSystemNotImplemented4, // 14 Y NSystemNotImplemented5, // 15 Y NSystemHandleInformation, // 16 Y NSystemObjectInformation, // 17 Y NSystemPagefileInformation, // 18 Y NSystemInstructionEmulationCounts, // 19 Y NSystemInvalidInfoClass1, // 20SystemCacheInformation, // 21 Y YSystemPoolTagInformation, // 22 Y NSystemProcessorStatistics, // 23 Y NSystemDpcInformation, // 24 Y YSystemNotImplemented6, // 25 Y NSystemLoadImage, // 26 N YSystemUnloadImage, // 27 N YSystemTimeAdjustment, // 28 Y YSystemNotImplemented7, // 29 Y NSystemNotImplemented8, // 30 Y NSystemNotImplemented9, // 31 Y NSystemCrashDumpInformation, // 32 Y NSystemExceptionInformation, // 33 Y NSystemCrashDumpStateInformation, // 34 Y Y/NSystemKernelDebuggerInformation, // 35 Y NSystemContextSwitchInformation, // 36 Y NSystemRegistryQuotaInformation, // 37 Y YSystemLoadAndCallImage, // 38 N YSystemPrioritySeparation, // 39 N YSystemNotImplemented10, // 40 Y NSystemNotImplemented11, // 41 Y NSystemInvalidInfoClass2, // 42SystemInvalidInfoClass3, // 43SystemTimeZoneInformation, // 44 Y NSystemLookasideInformation, // 45 Y NSystemSetTimeSlipEvent, // 46 N YSystemCreateSession, // 47 N YSystemDeleteSession, // 48 N YSystemInvalidInfoClass4, // 49SystemRangeStartInformation, // 50 Y NSystemVerifierInformation, // 51 Y YSystemAddVerifier, // 52 N YSystemSessionProcessesInformation // 53 Y N}SYSTEM_INFORMATION_CLASS;
第二个参数是你用来接收信息的一片内存区域,第三个参数是这边内存的大小,第四个参数返回长度,不是必选的.
当我们第一个参数传入的是SystemProcessesAndThreadsInformation则返回的一片内存空间一个PSYSTEM_PROCESSES的结构。
当我们第一个参数传入的是SystemModuleInformation则返回的一片内存空间一个SYSTEM_MODULE_INFORMATION的结构
typedef struct _SYSTEM_MODULE_INFORMATION { // Information Class 11 ULONG Reserved[2]; PVOID Base; ULONG Size; ULONG Flags; USHORT Index; USHORT Unknown; USHORT LoadCount; USHORT ModuleNameOffset; CHAR ImageName[256];} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
PVOID ExAllocatePool( //还是用的这个分配内存的。。。用下面的返回值定义PULONG 报错。 __in POOL_TYPE PoolType, __in SIZE_T NumberOfBytes);
PVOID ExAllocatePoolWithTag( //分配内存函数 __in POOL_TYPE PoolType, //内存的参数 见下个枚举类型 __in SIZE_T NumberOfBytes, //内存的大小 PAGE_SIZE __in ULONG Tag //感觉是这个内存区域的描述类的东西,就是给它起个名字。"tag1" 引号别少了);typedef enum _POOL_TYPE { NonPagedPool = 0, 一页的大小是PAGE_SIZE 大小在PAGE_SIZE上 必须是PAGE_SIZE的整倍数 PagedPool = 1, NonPagedPoolMustSucceed = 2, DontUseThisType = 3, NonPagedPoolCacheAligned = 4, PagedPoolCacheAligned = 5, NonPagedPoolCacheAlignedMustS = 6 } POOL_TYPE;
代码还没完善 目前问题很大 有空在修改
ULONG getFunAdd(ULONG feature1, ULONG feature2, ULONG feature3, ULONG feature4) //获取函数原始地址{// extern NTSTATUS ZwQuerySystemInformation(ULONG SystemInformationClass,PVOID SystemInformation,ULONG SystemInformationLength,PULONG ReturnLength);NTKERNELAPINTSTATUS ZwQuerySystemInformation( IN ULONG SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL);typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY{ ULONG Unknown1; ULONG Unknown2;#ifdef _WIN64 ULONG Unknown3; ULONG Unknown4;#endif PVOID Base; ULONG Size; ULONG Flags; USHORT Index; USHORT NameLength; USHORT LoadCount; USHORT PathLength; CHAR ImageName[256];} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
typedef struct _SYSTEM_MODULE_INFORMATION{ ULONG Count; SYSTEM_MODULE_INFORMATION_ENTRY Module[1];} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
ULONG i=0; ULONG j=0; ULONG m=0; PULONG p; NTSTATUS ntStatus; PSYSTEM_MODULE_INFORMATION pp; p=ExAllocatePool(NonPagedPool,PAGE_SIZE); if(!p) { return 0; } ntStatus = ZwQuerySystemInformation(11,p,sizeof(p),NULL); //11是SystemModuleInformation if ( !NT_SUCCESS( ntStatus ) ) { KdPrint(( "ZwQuerySystemInformation Error!/n" )); ExFreePool(p); return 0; } pp=(PSYSTEM_MODULE_INFORMATION)p; m=pp->Count; for(i=0;i<m;i++) { KdPrint(( "111SystemMode,Base: %x/n", pp->Module[i].Base )); KdPrint(( "111SystemMode, ImageName,: %s/n",pp->Module[i].ImageName )); KdPrint(( "111SystemMode, Size: %d/n",pp->Module[i].Size ));
//关键码比较 } ExFreePool(p); return 0;}