> Windows Syscalls
ntoskrnl.exeT1529T1485T1497

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

NameTypeDirDescription
SystemActionPOWER_ACTIONinAuszuführende Aktion: Sleep, Hibernate, Shutdown, ShutdownReset, ShutdownOff, WarmEject, DisplayOff.
MinSystemStateSYSTEM_POWER_STATEinMinimaler akzeptabler Zielzustand (PowerSystemWorking..PowerSystemShutdown).
FlagsULONGinPOWER_ACTION_*-Flags zur Policy-Steuerung: QUERY_ALLOWED, UI_ALLOWED, OVERRIDE_APPS, DISABLE_WAKES, CRITICAL.
AsynchronousBOOLEANinTRUE liefert sofort zurück; FALSE blockiert, bis die Aktion vollständig arbitriert ist.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070xF1win10-1507
Win10 16070xF5win10-1607
Win10 17030xF8win10-1703
Win10 17090xF9win10-1709
Win10 18030xFAwin10-1803
Win10 18090xFBwin10-1809
Win10 19030xFCwin10-1903
Win10 19090xFCwin10-1909
Win10 20040x101win10-2004
Win10 20H20x101win10-20h2
Win10 21H10x101win10-21h1
Win10 21H20x102win10-21h2
Win10 22H20x102win10-22h2
Win11 21H20x107win11-21h2
Win11 22H20x108win11-22h2
Win11 23H20x108win11-23h2
Win11 24H20x10Awin11-24h2
Server 20160xF5winserver-2016
Server 20190xFBwinserver-2019
Server 20220x106winserver-2022
Server 20250x10Awinserver-2025

Kernel-Modul

ntoskrnl.exeNtInitiatePowerAction

Verwandte APIs

InitiatePowerActionWSetSuspendStateExitWindowsExInitiateShutdownWNtSetSystemPowerStateSetSystemPowerState

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.

Erkennungs­mö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 ENDP

cRansomware 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