Windows系统信息获取函数:zwquerysysteminformation的用法与实现

一、zwquerysysteminformation的介绍

zwquerysysteminformation是一种Windows系统API函数,用于获取系统的各种信息,例如进程、线程、堆、模块、驱动程序等信息。zwquerysysteminformation具有很高的灵活性和可扩展性,可以用于开发各种系统监控、信息管理和分析工具。

二、zwquerysysteminformation的使用方法

使用zwquerysysteminformation需要传入不同的参数来获取不同类型的系统信息,下面以获取所有进程信息为例:

NTSTATUS GetProcessList()
{
    PSYSTEM_PROCESS_INFO pProcessInfo = NULL;
    PVOID pCurr = NULL;
    ULONG uRetSize = 0;
    NTSTATUS Status = ZwQuerySystemInformation(SystemProcessInformation, pProcessInfo, 0, &uRetSize);

    if (Status == STATUS_INFO_LENGTH_MISMATCH)
    {
        pProcessInfo = (PSYSTEM_PROCESS_INFO)ExAllocatePoolWithTag(NonPagedPool, uRetSize, 'Proc');
        if (pProcessInfo == NULL)
        {
            return STATUS_NO_MEMORY;
        }
        Status = ZwQuerySystemInformation(SystemProcessInformation, pProcessInfo, uRetSize, &uRetSize);
        if (!NT_SUCCESS(Status))
        {
            ExFreePool(pProcessInfo);
            return Status;
        }
        pCurr = pProcessInfo;
        do
        {
            DbgPrint("[%lu] [%S]\n", ((PSYSTEM_PROCESS_INFO)pCurr)->UniqueProcessId, \
              ((PSYSTEM_PROCESS_INFO)pCurr)->ImageName.Buffer);
            pCurr = ((PSYSTEM_PROCESS_INFO)pCurr)->NextEntryOffset + pCurr;
        } while (((PSYSTEM_PROCESS_INFO)pCurr)->NextEntryOffset);
        ExFreePool(pProcessInfo);
        return STATUS_SUCCESS;
    }
    return Status;
}

首先调用ZwQuerySystemInformation函数获取所需信息的大小,如果大小不够,需要重新分配内存并重新调用ZwQuerySystemInformation函数。接着遍历所有进程信息,输出进程ID和进程名。

三、zwquerysysteminformation的实现

zwquerysysteminformation的实现需要使用系统调用机制,在编程上需要注意以下几点:

1.使用双重调用,第一次获取所需缓冲区大小,第二次获取实际数据。

2.遍历缓冲区的每个节点,根据节点的偏移量可以找到下一个节点,直到遍历完所有的数据。

3.释放分配的缓冲区。

下面是ZwQuerySystemInformation的实现代码:

NTSYSCALLAPI NTSTATUS NTAPI ZwQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL)
{
    ULONG_PTR ServiceTable = (ULONG_PTR)KeServiceDescriptorTable->ServiceTableBase;
    ULONG_PTR CounterTable = (ULONG_PTR)KeServiceDescriptorTable->CounterTableBase;
    PULONG ServiceTableBase = (PULONG)(ServiceTable + 4);
    PULONG CounterTableBase = (PULONG)(CounterTable + 4);
    PULONG RegistryTableBase = (PULONG)(ServiceTable + 8);
    ULONG_PTR FunctionAddress = ServiceTableBase[SystemInformationClass];
    ULONG_PTR OldServiceDescriptor = 0;
    KIRQL OldIrql;
    NTSTATUS Status;

    __asm {
        cli
        mov eax, cr0
        push eax
        and eax, 0xFFFEFFFF
        mov cr0, eax
        sti
    }

    OldServiceDescriptor = ServiceTableBase[SystemInformationClass];

    KeRaiseIrql(HIGH_LEVEL, &OldIrql);

    ServiceTableBase[SystemInformationClass] = (ULONG)NewSystemCallHandler;

    Status = ZwQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);

    ServiceTableBase[SystemInformationClass] = OldServiceDescriptor;

    KeLowerIrql(OldIrql);

    __asm {
        cli
        mov eax, cr0
        pop ecx
        or eax, ecx
        mov cr0, eax
        sti
    }

    return Status;
}

此处为了演示原理,省略了实现中未使用到的代码,具体实现还应该考虑安全和效率等因素。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/269882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-16 13:34
下一篇 2024-12-16 13:34

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • Deepin系统分区设置教程

    本教程将会详细介绍Deepin系统如何进行分区设置,分享多种方式让您了解如何规划您的硬盘。 一、分区的基本知识 在进行Deepin系统分区设置之前,我们需要了解一些基本分区概念。 …

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • 如何在树莓派上安装Windows 7系统?

    随着树莓派的普及,许多用户想在树莓派上安装Windows 7操作系统。 一、准备工作 在开始之前,需要准备以下材料: 1.树莓派4B一台; 2.一张8GB以上的SD卡; 3.下载并…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29

发表回复

登录后才能评论