ring0内存遍历。获取函数地址

    技术2025-05-14  55

    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;}     

    最新回复(0)