ZwQuerySystemInformation的使用

该函数存在于NTDLL.DLL动态链接库中。NTDLL.DLL负责ring3ring0之间的通信。当使用子系统方式进行系统调用的时候,ntdll.dllSSDT会配合使用。关于SSDT技术以后会讲解到。

关于ZwQuerySystemInformation这个函数可以用来查询进程信息、内核信息、硬件信息(例如CPU数目)、句柄信息、时间信息等54个系统信息。

该函数的原型是

NTSTATUS WINAPI ZwQuerySystemInformation(

  __in          SYSTEM_INFORMATION_CLASS SystemInformationClass,

  __in_out     PVOID SystemInformation,

  __in          ULONG SystemInformationLength,

  __out_opt    PULONG ReturnLength

);

至于第一个参数SYSTEM_INFORMATION_CLASS是一个枚举结构。枚举了所有的54个系统信息。该结构在最后将会列举出来。

一、用户模式下的ZwQuerySystemInformation

在用户模式下必须用LoadLibraryGetProcAddress来获取该函数地址。

代码如下,先声明一个函数。

typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(IN SYSTEM_INFORMATION_CLASS,IN OUT PVOID, INULONG, OUTPULONG);

加载NTDLL.DLL,获取函数地址。

NTQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;

ZwQuerySystemInformation =

(NTQUERYSYSTEMINFORMATION)GetProcAddress(ntdll.dll,"ZwQuerySystemInfromation");

 

举例:枚举进程信息

要想获取进程信息,必须使用第二个参数,第二个参数指向一块内存。必须使用参数1中每个系统信息对应的结构体来将该内存进行转换。

假设我们要枚举进程信息,必须使用下列结构,该结构描述了进程名,线程数,指向下一个模块的指针,创建时间等等。结构描述如下:

1 参数2指针指向的结构

        PSYSTEM_PROCESSES psp=NULL

        //先为参数2设为空,dwNeedSize获取保存该结构体的内存大小

        statusZwQuerySystemInformation(SystemProcessesAndThreadsInformation,      NULL, 0, &dwNeedSize); 

       //若用户提供的缓冲//区大小不够,则返回STATUS_INFO_LENGTH_MISMATCH,并返回实际需要的缓冲区大小

        if ( status == STATUS_INFO_LENGTH_MISMATCH ) {   

            pBuffer = new BYTE[dwNeedSize];  

            status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, (PVOID)pBuffer, dwNeedSize, NULL);  

            if ( status == STATUS_SUCCESS )  

            {  

                psp = (PSYSTEM_PROCESSES)pBuffer; //强制转换

                printf("PID  线程数工作集大小进程名\n");

                do {  

                    printf("%-4d", psp->ProcessId);

                    printf(" %3d", psp->ThreadCount);  

                    printf(" %8dKB", psp->VmCounters.WorkingSetSize/1024);

                    wprintf(L" %s\n", psp->ProcessName.Buffer);

                    psp = (PSYSTEM_PROCESSES)((ULONG)psp + psp->NextEntryDelta );  

                } while ( psp->NextEntryDelta != 0 ); //循环遍历

        }

        delete []pBuffer;  

        pBuffer = NULL

  }

二、内核模式下的ZwQuerySystemInformation

内核模式下的ZwQuerySystemInformation的地址的获取没有应用层那么麻烦。直接声明一下该函数即可。详细参见:http://www.2cto.com/kf/200901/31447.html

NTSYSAPI

NTSTATUS

NTAPI ZwQuerySystemInformation(

            IN ULONG SystemInformationClass,

            IN OUT PVOID SystemInformation,

            IN ULONG SystemInformationLength,

            OUT PULONG ReturnLength);

直接使用即可:

ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pBuffer, cbBuffer, NULL);

这是一个C代码程序,该程序是在ring3层写的,主要内容是获取CPU个数,枚举进程,枚举内核模块。该代码是从网上下载的,因为要用到这个函数,所以小小地研究了一下。

 地址:http://nokyo.blogbus.com/logs/33162795.html

SYSTEM_INFORMATION_CLASS枚举结构,大家有兴趣的话可以去好好研究。

 

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;   

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值