> Windows Syscalls
ntoskrnl.exeT1529T1485T1106

NtSetSystemPowerState

Versetzt das System in den angeforderten Energiezustand (Schlaf, Ruhezustand, Betrieb).

Prototyp

NTSTATUS NtSetSystemPowerState(
  POWER_ACTION         SystemAction,
  SYSTEM_POWER_STATE   MinSystemState,
  ULONG                Flags
);

Argumente

NameTypeDirDescription
SystemActionPOWER_ACTIONinAktion: PowerActionNone, Reserved, Sleep, Hibernate, Shutdown, ShutdownReset, ShutdownOff, WarmEject, DisplayOff.
MinSystemStateSYSTEM_POWER_STATEinNiedrigster akzeptabler Energiezustand, z. B. PowerSystemSleeping1..3, PowerSystemHibernate, PowerSystemShutdown.
FlagsULONGinPOWER_ACTION_*-Flags: QUERY_ALLOWED, UI_ALLOWED, OVERRIDE_APPS, LIGHTEST_FIRST, DISABLE_WAKES, CRITICAL.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070x18Fwin10-1507
Win10 16070x198win10-1607
Win10 17030x19Ewin10-1703
Win10 17090x1A1win10-1709
Win10 18030x1A3win10-1803
Win10 18090x1A4win10-1809
Win10 19030x1A5win10-1903
Win10 19090x1A5win10-1909
Win10 20040x1ABwin10-2004
Win10 20H20x1ABwin10-20h2
Win10 21H10x1ABwin10-21h1
Win10 21H20x1ADwin10-21h2
Win10 22H20x1ADwin10-22h2
Win11 21H20x1B6win11-21h2
Win11 22H20x1BAwin11-22h2
Win11 23H20x1BAwin11-23h2
Win11 24H20x1BDwin11-24h2
Server 20160x198winserver-2016
Server 20190x1A4winserver-2019
Server 20220x1B3winserver-2022
Server 20250x1BDwinserver-2025

Kernel-Modul

ntoskrnl.exeNtSetSystemPowerState

Verwandte APIs

SetSystemPowerStateInitiatePowerActionWNtInitiatePowerActionExitWindowsExInitiateShutdownWPowerSetActiveScheme

Syscall-Stub

4C 8B D1            mov r10, rcx
B8 BD 01 00 00      mov eax, 0x1BD
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

Low-Level-Cousin von `NtInitiatePowerAction` — `NtSetSystemPowerState` umgeht die Policy-Manager-Arbitrierung und ist die Funktion, die der Kernel selbst aufruft, sobald der Power Manager seine Verhandlungen abgeschlossen hat. Der Win32-Wrapper `SetSystemPowerState` landet hier. Der Aufrufer muss `SeShutdownPrivilege` (interaktive Sitzungen) oder `SeRemoteShutdownPrivilege` (Cross-Machine-Varianten) halten. Die Funktion kehrt erst zurück, wenn das System entweder aus dem Zielzustand resumed hat oder den Übergang abgelehnt hat (z. B. ein Treiber Sleep vetoed). `POWER_ACTION_DISABLE_WAKES | POWER_ACTION_CRITICAL` ist die 'Halt's Maul und tu's'-Kombination, die die meisten App-Level-Sleep-Vetos umgeht.

Häufige Malware-Nutzung

Drei reale Muster. (1) **Wipers**: HermeticWiper, IsaacWiper und CaddyWiper wurden alle dabei beobachtet, am Ende ihres Zerstörungslaufs Reboot-Klasse-Power-Aktionen aufzurufen, um die Maschine zum Hochfahren mit korrupten Boot-Daten zu zwingen — der Nutzer sieht beim nächsten Start einen BSOD oder 'Inaccessible Boot Device'-Bildschirm. (2) **Ransomware-Post-Encryption-Reboot**: Royal, BlackCat/ALPHV und BlackSuit haben über diese Syscall-Familie nach dem Ablegen ihrer Note einen Reboot ausgelöst, sowohl um einen sauberen Zustand auf dem verschlüsselten Volume zu erzwingen als auch um sicherzustellen, dass geöffnete Dateien geschlossen werden. (3) **Sandbox-Evasion**: ein kleiner Satz Red-Team-Loader ruft PowerSystemSleeping3 oder DisplayOff in einer automatisierten Analyse-VM auf, in der Hoffnung, dass der Sandbox-Harness den Übergang als 'Execution Complete' interpretiert und abbaut, bevor die echte Payload läuft. Oft kombiniert mit `NtDelayExecution`, um die Uhren zu verzerren, mit denen der Harness Laufzeit berechnet.

Erkennungs­möglichkeiten

`SetSystemPowerState` und der zugrundeliegende Syscall werden vom ETW-Provider Microsoft-Windows-Kernel-Power getrackt — jeder Sleep/Hibernate/Shutdown-Übergang emittiert wohldefinierte Events inklusive des initiierenden Prozesses. Sysmon hat kein dediziertes Event, aber das System-Log meldet 1074 (sauber initiiertes Shutdown) und 6008 (unerwartetes Shutdown), beide nützlich zur retrospektiven Rekonstruktion. Die stärkste Einzelregel: ein Nicht-System-Prozess, der eine Shutdown-Klasse-POWER_ACTION aufruft und in der letzten Minute viele Dateien geschrieben hat, ist im Wesentlichen ein Wiper- oder Ransomware-Fingerabdruck. SeShutdownPrivilege sollte für die meisten Service-Accounts deaktiviert sein — auf die Privilege-Anpassung alarmieren, die dem Aufruf unmittelbar vorausgeht.

Direkte Syscall-Beispiele

asmx64 direct stub (Win11 24H2)

; Direct syscall stub for NtSetSystemPowerState (SSN 0x1BD on Win11 24H2)
NtSetSystemPowerState PROC
    mov  r10, rcx          ; syscall convention
    mov  eax, 1BDh         ; SSN — varies per build
    syscall
    ret
NtSetSystemPowerState ENDP

cWiper finale — force reboot into corrupted boot

// Final stage of a destructive payload: enable shutdown privilege then
// request an immediate Shutdown-Reset, bypassing user prompts.
#include <windows.h>
#include <winternl.h>

static VOID EnableShutdownPriv(VOID) {
    HANDLE hTok; LUID luid; TOKEN_PRIVILEGES tp = { 0 };
    OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTok);
    LookupPrivilegeValueW(NULL, SE_SHUTDOWN_NAME, &luid);
    tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hTok, FALSE, &tp, sizeof(tp), NULL, NULL);
    CloseHandle(hTok);
}

typedef NTSTATUS (NTAPI *pNtSetSystemPowerState)(ULONG, ULONG, ULONG);

VOID WiperReboot(VOID) {
    EnableShutdownPriv();
    pNtSetSystemPowerState NtSetSystemPowerState = (pNtSetSystemPowerState)
        GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtSetSystemPowerState");
    // PowerActionShutdownReset = 6, PowerSystemShutdown = 6,
    // DISABLE_WAKES | CRITICAL = 0x40000000 | 0x80000000
    NtSetSystemPowerState(6, 6, 0xC0000000);
}

rustDirect-syscall sleep request (sandbox evasion attempt)

// Cargo: windows-sys = "0.59"
use std::arch::asm;

#[unsafe(naked)]
unsafe extern "system" fn nt_set_system_power_state_stub(
    _action: u32, _min_state: u32, _flags: u32) -> i32 {
    asm!(
        "mov r10, rcx",
        "mov eax, 0x1BD", // Win11 24H2 SSN
        "syscall",
        "ret",
        options(noreturn),
    );
}

fn try_sleep_evasion() {
    // PowerActionSleep = 2, PowerSystemSleeping3 = 5, UI_ALLOWED=4
    let _ = unsafe { nt_set_system_power_state_stub(2, 5, 4) };
}

MITRE ATT&CK-Mappings

Last verified: 2026-05-20