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 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;
第二个参数是你用来接收信息的一片内存区域,第三个参数是这边内存的大小,第四个参数返回长度,不是必选的.
当我们第一个参数传入的是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);
NTKERNELAPI
NTSTATUS 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;
}