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/zh-tw/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

發表回復

登錄後才能評論