(转)函数ZwQuerySystemInformation小结

http://zhan.renren.com/aczordia?gid=3602888498030659745&checked=true

该函数存在于NTDLL.DLL动态链接库中。NTDLL.DLL负责ring3与ring0之间的通信。当使用子系统方式进行系统调用的时候,ntdll.dll和SSDT会配合使用。关于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

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

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

typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(INSYSTEM_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获取保存该结构体的内存大小

        status = ZwQuerySystemInformation(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;

posted @ 2012-12-26 17:34  himessage  阅读(623)  评论(0编辑  收藏  举报