NtInitiatePowerAction
Fordert den Power Manager auf, eine systemweite Energieaktion auszuführen (Schlaf, Ruhezustand, Shutdown, Reboot).
Prototyp
NTSTATUS NtInitiatePowerAction( POWER_ACTION SystemAction, SYSTEM_POWER_STATE MinSystemState, ULONG Flags, BOOLEAN Asynchronous );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| SystemAction | POWER_ACTION | in | Auszuführende Aktion: Sleep, Hibernate, Shutdown, ShutdownReset, ShutdownOff, WarmEject, DisplayOff. |
| MinSystemState | SYSTEM_POWER_STATE | in | Minimaler akzeptabler Zielzustand (PowerSystemWorking..PowerSystemShutdown). |
| Flags | ULONG | in | POWER_ACTION_*-Flags zur Policy-Steuerung: QUERY_ALLOWED, UI_ALLOWED, OVERRIDE_APPS, DISABLE_WAKES, CRITICAL. |
| Asynchronous | BOOLEAN | in | TRUE liefert sofort zurück; FALSE blockiert, bis die Aktion vollständig arbitriert ist. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0xF1 | win10-1507 |
| Win10 1607 | 0xF5 | win10-1607 |
| Win10 1703 | 0xF8 | win10-1703 |
| Win10 1709 | 0xF9 | win10-1709 |
| Win10 1803 | 0xFA | win10-1803 |
| Win10 1809 | 0xFB | win10-1809 |
| Win10 1903 | 0xFC | win10-1903 |
| Win10 1909 | 0xFC | win10-1909 |
| Win10 2004 | 0x101 | win10-2004 |
| Win10 20H2 | 0x101 | win10-20h2 |
| Win10 21H1 | 0x101 | win10-21h1 |
| Win10 21H2 | 0x102 | win10-21h2 |
| Win10 22H2 | 0x102 | win10-22h2 |
| Win11 21H2 | 0x107 | win11-21h2 |
| Win11 22H2 | 0x108 | win11-22h2 |
| Win11 23H2 | 0x108 | win11-23h2 |
| Win11 24H2 | 0x10A | win11-24h2 |
| Server 2016 | 0xF5 | winserver-2016 |
| Server 2019 | 0xFB | winserver-2019 |
| Server 2022 | 0x106 | winserver-2022 |
| Server 2025 | 0x10A | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 0A 01 00 00 mov eax, 0x10A 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
High-Level-Einstiegspunkt für Power-Aktionen: `InitiatePowerActionW`, `SetSuspendState` (über powrprof.dll), `ExitWindowsEx` (für Shutdown/Reboot-Varianten) und die Modern-Standby-Fastpaths laufen alle hierher. Im Gegensatz zu `NtSetSystemPowerState` geht diese Funktion durch den **Power-Policy-Manager**: sie broadcastet WM_POWERBROADCAST / PBT_APMQUERYSUSPEND an laufende Prozesse, beachtet `QUERY_ALLOWED` (Apps können ablehnen) und delegiert erst dann an `NtSetSystemPowerState`, wenn die Policy es zulässt. Erfordert `SeShutdownPrivilege`. Der `Asynchronous`-Parameter ist die kritische Stellschraube — async kehrt sofort zurück und der Aufrufer kann Ablehnung nicht erkennen; sync blockiert bis Resume oder Treiber/App-Veto.
Häufige Malware-Nutzung
**Ransomware-Post-Encryption-Reboot** ist der dominierende Missbrauch. Royal, BlackCat/ALPHV, Conti, LockBit 3.0 und BlackSuit setzen alle nach dem Schreiben der Ransom-Note einen Reboot der Klasse InitiatePowerAction ab — Ziel ist, Nutzer in den Recovery-Prompt oder Windows-RE-Screen zu zwingen, was die Ransom-Note zuverlässig auf den Bildschirm bringt und einen schnellen Rollback über noch im Speicher liegende Volume Shadow Copies verhindert. **Wipers** (HermeticWiper, IsaacWiper, WhisperGate, CaddyWiper) lösen analog ein ShutdownReset aus, um die Maschine mit korrupten Boot-Daten hochfahren zu lassen. Eine kleinere Klasse Red-Team-Loader ruft PowerActionSleep mit `DISABLE_WAKES | CRITICAL` auf, um kurzlebige Sandbox-Sessions zu unterlaufen. Die Privilege-Anforderung (SeShutdownPrivilege) ist trivial für Malware als Admin oder LocalSystem, bei niedrig privilegiertem User-Code scheitert der Check — die meisten Ransomware-Familien bringen eine separate Elevation-Primitive davor mit.
Erkennungsmöglichkeiten
Der ETW-Provider Microsoft-Windows-Kernel-Power emittiert strukturierte Events pro initiate-power-action: Quell-PID, Aktion, Flags, Erfolg/Fehler. Event-Log: das System-Log registriert Event ID 1074 für den initiierenden Prozess jedes nutzerinitiierten Shutdowns/Reboots (sauber), 6005/6006 für Service-Pack-Init, 6008 für Dirty Shutdowns. Die aktionable Verhaltensregel: ein Prozess, der in den letzten 60 Sekunden >N Datei-Writes/Modifikationen vorgenommen hat und dann eine Shutdown/Reset-Klasse-Power-Aktion aufruft — das ist ein nahezu perfekter Ransomware-Indikator. Eine SeShutdownPrivilege-Anpassung aus einem nicht-interaktiven Token ist für sich genommen ungewöhnlich und alarmwürdig. EDRs, die ntdll hooken, sehen diesen Aufruf direkt; Direct-Syscall-Varianten umgehen ntdll, hinterlassen aber dennoch die ETW-Spur.
Direkte Syscall-Beispiele
asmx64 direct stub (Win11 24H2)
; Direct syscall stub for NtInitiatePowerAction (SSN 0x10A on Win11 24H2)
NtInitiatePowerAction PROC
mov r10, rcx ; syscall convention
mov eax, 10Ah ; SSN — varies per build
syscall
ret
NtInitiatePowerAction ENDPcRansomware post-encryption reboot
// Final step after the encryption pass and ransom-note drop.
// PowerActionShutdownReset = 6 (reboot), PowerSystemShutdown = 6.
// Flags = POWER_ACTION_DISABLE_WAKES | POWER_ACTION_CRITICAL
// | POWER_ACTION_OVERRIDE_APPS bypass app refusal.
#include <windows.h>
#include <winternl.h>
typedef NTSTATUS (NTAPI *pNtInitiatePowerAction)(ULONG, ULONG, ULONG, BOOLEAN);
VOID PostEncryptReboot(VOID) {
pNtInitiatePowerAction NtInitiatePowerAction = (pNtInitiatePowerAction)
GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtInitiatePowerAction");
// SeShutdownPrivilege assumed already enabled
NtInitiatePowerAction(
/* SystemAction */ 6,
/* MinSystemState */ 6,
/* Flags */ 0xC0010000, // CRITICAL | DISABLE_WAKES | OVERRIDE_APPS
/* Asynchronous */ FALSE);
}rustSandbox evasion via critical sleep
// Cargo: windows-sys = "0.59"
// Try to put the analysis VM into S3 sleep before the loader's real work runs.
// Async + DISABLE_WAKES prevents most sandbox harnesses from resuming it cleanly.
use windows_sys::Win32::Security::*;
use windows_sys::Win32::System::Threading::*;
use windows_sys::Win32::Foundation::*;
extern "system" {
fn NtInitiatePowerAction(action: u32, min_state: u32, flags: u32, asynch: u8) -> i32;
}
pub unsafe fn evade_via_sleep() -> i32 {
let mut tok: HANDLE = std::mem::zeroed();
OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &mut tok);
// (omitted: LookupPrivilegeValueW + AdjustTokenPrivileges for SeShutdownPrivilege)
// PowerActionSleep = 2, PowerSystemSleeping3 = 5
NtInitiatePowerAction(2, 5, 0x40000000 /* DISABLE_WAKES */, 1)
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20