> Windows Syscalls
ntoskrnl.exeT1057T1014T1003.001

NtQuerySystemInformation

Liest eine systemweite Informationsklasse aus — Prozessliste, Kernel-Handle-Tabelle, geladene Treiberliste, Code-Integritäts-Status und mehr.

Prototyp

NTSTATUS NtQuerySystemInformation(
  SYSTEM_INFORMATION_CLASS SystemInformationClass,
  PVOID                    SystemInformation,
  ULONG                    SystemInformationLength,
  PULONG                   ReturnLength
);

Argumente

NameTypeDirDescription
SystemInformationClassSYSTEM_INFORMATION_CLASSinEnum, der den Datensatz wählt. Bemerkenswert: SystemProcessInformation=5, SystemModuleInformation=11, SystemHandleInformation=16, SystemExtendedHandleInformation=64, SystemBigPoolInformation=66, SystemBootEnvironmentInformation=90, SystemCodeIntegrityInformation=103.
SystemInformationPVOIDoutVom Aufrufer bereitgestellter Puffer, der die zurückgegebenen Daten empfängt. Layout ist klassenspezifisch.
SystemInformationLengthULONGinGröße des SystemInformation-Puffers in Bytes.
ReturnLengthPULONGoutOptionaler Zeiger, der geschriebene Bytes empfängt — oder bei STATUS_INFO_LENGTH_MISMATCH die benötigte Größe (kanonisches Sizing-Loop-Pattern).

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070x36win10-1507
Win10 16070x36win10-1607
Win10 17030x36win10-1703
Win10 17090x36win10-1709
Win10 18030x36win10-1803
Win10 18090x36win10-1809
Win10 19030x36win10-1903
Win10 19090x36win10-1909
Win10 20040x36win10-2004
Win10 20H20x36win10-20h2
Win10 21H10x36win10-21h1
Win10 21H20x36win10-21h2
Win10 22H20x36win10-22h2
Win11 21H20x36win11-21h2
Win11 22H20x36win11-22h2
Win11 23H20x36win11-23h2
Win11 24H20x36win11-24h2
Server 20160x36winserver-2016
Server 20190x36winserver-2019
Server 20220x36winserver-2022
Server 20250x36winserver-2025

Kernel-Modul

ntoskrnl.exeNtQuerySystemInformation

Verwandte APIs

EnumProcessesEnumDeviceDriversGetSystemInfoCreateToolhelp32SnapshotNtQueryInformationProcessNtDuplicateObject

Syscall-Stub

4C 8B D1            mov r10, rcx
B8 36 00 00 00      mov eax, 0x36
F6 04 25 08 03 FE 7F 01   test byte ptr [0x7FFE0308], 1
75 03               jne short +3
0F 05               syscall
C3                  ret
CD 2E               int 2Eh
C3                  ret

Undokumentierte Hinweise

Ein weiteres Schwergewicht mit eingefrorener SSN: 0x36 von Windows 10 1507 bis Windows 11 24H2. Die Klassen-Enumeration ist riesig (200+ Werte in aktuellen Kerneln) und ist die Grundlage nahezu jeder Win32-„Systemzustand enumerieren“-API: EnumProcesses (Klasse 5), GetSystemInfo (Klasse 0), GetNativeSystemInfo, EnumDeviceDrivers (Klasse 11), und das nicht offiziell exponierte NtQuerySystemInformation(SystemHandleInformation=16). Klasse 16 ist das Legacy-16-Bit-Handle-Layout; Klasse 64 (SystemExtendedHandleInformation) ist die moderne breite Variante — moderne Tools sollten letztere verwenden. Das kanonische Aufrufmuster ist eine Sizing-Schleife: mit NULL/0 aufrufen, um die nötige Größe in ReturnLength zu erhalten, allokieren, erneut aufrufen, bei STATUS_INFO_LENGTH_MISMATCH (Race) wiederholen.

Häufige Malware-Nutzung

Drei wirkungsstarke OPSEC- und Recon-Anwendungen. (1) SystemProcessInformation (5) liefert eine zusammenhängende Liste jedes Prozesses und *aller seiner Threads* — genutzt, um Injection-Ziele zu finden, ohne den lauten CreateToolhelp32Snapshot-Pfad anzufassen; auch die Discovery-Primitive hinter „lsass.exe-TID mit ALERTABLE Wait finden“ für Early-Bird-APC. (2) SystemHandleInformation / SystemExtendedHandleInformation (16/64) enumeriert jedes Handle in jedem Prozess — genutzt von verdeckten Credential-Dumping-Tools (HandleKatz, NanoDump-Varianten), um ein existierendes PROCESS_VM_READ-Handle auf lsass.exe in einem anderen Prozess zu finden und es per NtDuplicateObject zu *duplizieren*, womit NtOpenProcess auf lsass komplett umgangen wird. (3) SystemModuleInformation (11) enumeriert geladene Kernel-Module mit Basisadressen — schlägt KASLR für jeden Nicht-LowIL-Aufrufer und wird von BYOVD-Angriffen genutzt, um In-Memory-Offsets von Ziel-Treiberfunktionen zu berechnen, und von Rootkit-Detektoren. SystemCodeIntegrityInformation (103) erlaubt einem Payload zu erkennen, ob HVCI / DSE erzwungen wird, bevor er versucht, einen unsignierten Treiber zu laden. SystemBootEnvironmentInformation (90) verrät, ob der Boot-Pfad BIOS oder UEFI Secure Boot ist, und wird von Bootkits abgefragt, um ihre Persistenzstrategie zu steuern.

Erkennungs­möglichkeiten

Das Volumen der Klasse 5 (SystemProcessInformation) ist im Normalbetrieb riesig — so enumerieren Task Manager, Process Explorer, jeder Monitoring-Agent und die Runtime selbst. Der Diskriminator ist die Klassennummer plus das Vertrauen des Aufrufprozesses: die Klassen 16/64 (Handle-Enum) und 11 (Modul-Enum) aus einem Nicht-System-, nicht von Microsoft signierten Prozess sind verdächtig. Microsoft-Windows-Threat-Intelligence-ETW exponiert diesen Syscall NICHT granular; man muss per ntdll-seitigem ETW (Microsoft-Windows-Win32k-Threat-Intelligence) oder einem Kernel-Callback instrumentieren. Das stärkste Signal ist das Nach-Aufruf-Verhalten: ein Prozess, der NtQuerySystemInformation(64) aufruft und innerhalb von Millisekunden NtDuplicateObject mit einem Quell-Handle aufruft, dessen PID lsass.exe ist, betreibt mit hoher Wahrscheinlichkeit Credential-Dumping.

Direkte Syscall-Beispiele

cSizing loop for SystemExtendedHandleInformation

// Classic two-step: ask for size, allocate, ask for data.
ULONG len = 0x10000;
PVOID buf = NULL;
NTSTATUS st;
for (;;) {
    buf = HeapAlloc(GetProcessHeap(), 0, len);
    st = NtQuerySystemInformation(SystemExtendedHandleInformation /*64*/,
                                  buf, len, &len);
    if (st != STATUS_INFO_LENGTH_MISMATCH) break;
    HeapFree(GetProcessHeap(), 0, buf);
    len *= 2;
}
// buf now holds SYSTEM_HANDLE_INFORMATION_EX with NumberOfHandles + entries
// Iterate and find an entry with UniqueProcessId == lsass_pid and
// GrantedAccess == PROCESS_VM_READ | PROCESS_QUERY_INFORMATION -> dup it.

cKASLR defeat via SystemModuleInformation

// Discloses every loaded kernel module's base address from medium-IL or higher.
// Used by BYOVD attacks to compute target driver function offsets.
RTL_PROCESS_MODULES *mods = HeapAlloc(GetProcessHeap(), 0, 0x10000);
ULONG ret = 0;
NtQuerySystemInformation(SystemModuleInformation /*11*/,
                         mods, 0x10000, &ret);
for (ULONG i = 0; i < mods->NumberOfModules; i++) {
    if (strstr((char*)mods->Modules[i].FullPathName, "ntoskrnl.exe")) {
        // mods->Modules[i].ImageBase = current ntoskrnl base — KASLR defeated.
    }
}

rustDetect HVCI / Code Integrity

// Returns SYSTEM_CODEINTEGRITY_INFORMATION { Length, CodeIntegrityOptions }.
// Check options for CODEINTEGRITY_OPTION_ENABLED | HVCI_ENABLED before
// even attempting an unsigned-driver load.
use windows_sys::Wdk::System::SystemInformation::*;

#[repr(C)] struct CodeIntegrityInfo { length: u32, options: u32 }
let mut ci = CodeIntegrityInfo { length: 8, options: 0 };
let mut ret = 0u32;
unsafe {
    nt_query_system_information(103 /*SystemCodeIntegrityInformation*/,
        &mut ci as *mut _ as *mut _, 8, &mut ret);
}
let hvci_on = ci.options & 0x400 != 0;

MITRE ATT&CK-Mappings

Last verified: 2026-05-20