NtSetSystemPowerState
Versetzt das System in den angeforderten Energiezustand (Schlaf, Ruhezustand, Betrieb).
Prototyp
NTSTATUS NtSetSystemPowerState( POWER_ACTION SystemAction, SYSTEM_POWER_STATE MinSystemState, ULONG Flags );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| SystemAction | POWER_ACTION | in | Aktion: PowerActionNone, Reserved, Sleep, Hibernate, Shutdown, ShutdownReset, ShutdownOff, WarmEject, DisplayOff. |
| MinSystemState | SYSTEM_POWER_STATE | in | Niedrigster akzeptabler Energiezustand, z. B. PowerSystemSleeping1..3, PowerSystemHibernate, PowerSystemShutdown. |
| Flags | ULONG | in | POWER_ACTION_*-Flags: QUERY_ALLOWED, UI_ALLOWED, OVERRIDE_APPS, LIGHTEST_FIRST, DISABLE_WAKES, CRITICAL. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0x18F | win10-1507 |
| Win10 1607 | 0x198 | win10-1607 |
| Win10 1703 | 0x19E | win10-1703 |
| Win10 1709 | 0x1A1 | win10-1709 |
| Win10 1803 | 0x1A3 | win10-1803 |
| Win10 1809 | 0x1A4 | win10-1809 |
| Win10 1903 | 0x1A5 | win10-1903 |
| Win10 1909 | 0x1A5 | win10-1909 |
| Win10 2004 | 0x1AB | win10-2004 |
| Win10 20H2 | 0x1AB | win10-20h2 |
| Win10 21H1 | 0x1AB | win10-21h1 |
| Win10 21H2 | 0x1AD | win10-21h2 |
| Win10 22H2 | 0x1AD | win10-22h2 |
| Win11 21H2 | 0x1B6 | win11-21h2 |
| Win11 22H2 | 0x1BA | win11-22h2 |
| Win11 23H2 | 0x1BA | win11-23h2 |
| Win11 24H2 | 0x1BD | win11-24h2 |
| Server 2016 | 0x198 | winserver-2016 |
| Server 2019 | 0x1A4 | winserver-2019 |
| Server 2022 | 0x1B3 | winserver-2022 |
| Server 2025 | 0x1BD | winserver-2025 |
Kernel-Modul
Verwandte APIs
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.
Erkennungsmö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 ENDPcWiper 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