> Windows Syscalls
ntoskrnl.exeT1562.001T1106

NtThawRegistry

Libère un gel précédent du registre pour reprendre les écritures ; contrepartie de NtFreezeRegistry.

Prototype

NTSTATUS NtThawRegistry(VOID);

Arguments

NameTypeDirDescription

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x1A4win10-1507
Win10 16070x1ADwin10-1607
Win10 17030x1B3win10-1703
Win10 17090x1B7win10-1709
Win10 18030x1B9win10-1803
Win10 18090x1BAwin10-1809
Win10 19030x1BBwin10-1903
Win10 19090x1BBwin10-1909
Win10 20040x1C1win10-2004
Win10 20H20x1C1win10-20h2
Win10 21H10x1C1win10-21h1
Win10 21H20x1C3win10-21h2
Win10 22H20x1C3win10-22h2
Win11 21H20x1CDwin11-21h2
Win11 22H20x1D1win11-22h2
Win11 23H20x1D1win11-23h2
Win11 24H20x1D4win11-24h2
Server 20160x1ADwinserver-2016
Server 20190x1BAwinserver-2019
Server 20220x1C9winserver-2022
Server 20250x1D4winserver-2025

Module noyau

ntoskrnl.exeNtThawRegistry

APIs liées

NtFreezeRegistryZwThawRegistryVSS IVssWriter::OnThawNtSaveKeyEx

Stub du syscall

4C 8B D1            mov r10, rcx
B8 D4 01 00 00      mov eax, 0x1D4     ; Win11 24H2 SSN
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

Notes non documentées

Contrepartie sans argument de `NtFreezeRegistry`. Appelle `CmpRegistryThaw`, qui libère le verrou global de gel ; les écrivains en attente dans la chaîne `KeWaitForSingleObject` du noyau sont débloqués. Requiert également `SeBackupPrivilege`. Appeler `NtThawRegistry` quand le registre n'est pas gelé retourne `STATUS_INVALID_PARAMETER` — utile pour sonder si un gel est en cours (diagnostic inhabituel qu'un attaquant pourrait utiliser pour confirmer le succès d'un `NtFreezeRegistry` apparié).

Usage courant par les malwares

Même réserve de signal faible que `NtFreezeRegistry` : aucune famille commodity largement rapportée ne l'utilise. Les seuls schémas offensifs réalistes sont l'usage apparié avec un gel (DoS, course TOCTTOU) ou un nettoyage explicite après une tentative de snapshot malveillante pour éviter de laisser le système dans un état dégradé et de déclencher des watchdogs. Notez que le timeout d'auto-dégel du noyau signifie qu'un attaquant qui *ne fait que* geler voit le système se rétablir tout seul ; appeler `NtThawRegistry` est essentiellement une primitive de politesse.

Opportunités de détection

Traitez gel/dégel comme une paire. Un événement `NtThawRegistry` issu d'un processus qui n'a pas lui-même appelé `NtFreezeRegistry` (nettoyant donc le désordre d'un autre) est en soi anormal. Les règles de détection doivent rechercher le *détenteur* de `SeBackupPrivilege` émettant gel→dégel en dehors des writers VSS bien connus (`VSSVC.exe`, `svchost.exe -k swprv`, agents de sauvegarde tiers sur une allowlist).

Exemples de syscalls directs

cPolitely thaw after a freeze

NTSTATUS st = NtFreezeRegistry(30);
if (NT_SUCCESS(st)) {
    do_snapshot_work();
    NtThawRegistry();    // explicit; the 30s timeout would also auto-thaw
}

asmx64 direct stub

; NtThawRegistry direct syscall (Win11 24H2 SSN 0x1D4)
NtThawRegistry PROC
    mov  r10, rcx
    mov  eax, 1D4h
    syscall
    ret
NtThawRegistry ENDP

rustProbe freeze state

// STATUS_INVALID_PARAMETER (0xC000000D) from NtThawRegistry means 'not frozen'.
use windows_sys::Win32::System::LibraryLoader::*;
type NtThawFn = unsafe extern "system" fn() -> i32;
unsafe fn is_frozen() -> bool {
    let nt = GetModuleHandleA(b"ntdll.dll\0".as_ptr());
    let f: NtThawFn = std::mem::transmute(
        GetProcAddress(nt, b"NtThawRegistry\0".as_ptr()).unwrap()
    );
    // Caller must already have stored a prior freeze if they actually want to probe;
    // otherwise this is a destructive test.
    let st = f();
    st == 0 // success means we just thawed an active freeze
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20