> Windows Syscalls
ntoskrnl.exeT1055.013T1106

NtOpenTransaction

Ouvre un objet de transaction KTM existant par nom ou par GUID d'unité de travail.

Prototype

NTSTATUS NtOpenTransaction(
  PHANDLE            TransactionHandle,
  ACCESS_MASK        DesiredAccess,
  POBJECT_ATTRIBUTES ObjectAttributes,
  LPGUID             Uow,
  HANDLE             TmHandle
);

Arguments

NameTypeDirDescription
TransactionHandlePHANDLEoutReçoit un handle vers la transaction ouverte.
DesiredAccessACCESS_MASKinDroits d'accès demandés (TRANSACTION_QUERY_INFORMATION, TRANSACTION_COMMIT, TRANSACTION_ROLLBACK, …).
ObjectAttributesPOBJECT_ATTRIBUTESinAttributs d'objet contenant le nom de l'objet transaction (ouverture par nom).
UowLPGUIDinGUID d'unité de travail optionnel utilisé lorsque ObjectAttributes->ObjectName est NULL.
TmHandleHANDLEinHandle optionnel vers le Transaction Manager qui héberge la transaction. NULL = TM par défaut.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x11Bwin10-1507
Win10 16070x121win10-1607
Win10 17030x125win10-1703
Win10 17090x127win10-1709
Win10 18030x129win10-1803
Win10 18090x12Awin10-1809
Win10 19030x12Bwin10-1903
Win10 19090x12Bwin10-1909
Win10 20040x130win10-2004
Win10 20H20x130win10-20h2
Win10 21H10x130win10-21h1
Win10 21H20x131win10-21h2
Win10 22H20x131win10-22h2
Win11 21H20x137win11-21h2
Win11 22H20x139win11-22h2
Win11 23H20x139win11-23h2
Win11 24H20x13Bwin11-24h2
Server 20160x121winserver-2016
Server 20190x12Awinserver-2019
Server 20220x136winserver-2022
Server 20250x13Bwinserver-2025

Module noyau

ntoskrnl.exeNtOpenTransaction

APIs liées

OpenTransactionNtCreateTransactionNtCommitTransactionNtRollbackTransactionNtQueryInformationTransaction

Stub du syscall

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

Pendant de `NtCreateTransaction`. La transaction peut être ouverte par nom (si le créateur l'a placée dans `\BaseNamedObjects` ou autre répertoire) ou par GUID d'unité de travail — chaque transaction KTM possède un GUID UoW globalement unique enregistré auprès du Transaction Manager. Une fois ouvert, le handle permet d'enrôler d'autres resource managers, d'interroger l'état via `NtQueryInformationTransaction` ou de commit/rollback si l'accès a été demandé.

Usage courant par les malwares

Moins central que `NtCreateTransaction` pour le Process Doppelgänging, mais utile dans les chaînes multi-étapes où un composant crée la transaction (ex. loader en contexte service) et une autre étape l'ouvre par GUID UoW pour effectuer le rollback après la création de section dans un autre processus. Apparaît aussi dans des variantes inter-processus de Doppelgänging où le dropper transmet le GUID UoW à un enfant via IPC, l'enfant ré-ouvre la transaction, puis déclenche seulement alors le rollback — cela répartit la séquence suspecte sur deux PID et défait les détections per-process simples.

Opportunités de détection

Même surface de télémétrie que `NtCreateTransaction` — providers ETW `Microsoft-Windows-Kernel-File` et `Microsoft-Windows-TxF`. Surveiller particulièrement les processus non liés qui ouvrent le *même* GUID UoW dans une courte fenêtre : les applications transactionnelles légitimes (SQL Server, journalisation NTFS) ne répartissent presque jamais la séquence create-open-rollback sur des PID non liés. Lister `\BaseNamedObjects` avec WinObj révèle les transactions nommées, mais la plupart des transactions attaquantes sont anonymes et reposent sur les GUID UoW.

Exemples de syscalls directs

cOpen by UoW GUID

// Open an existing transaction by its unit-of-work GUID.
GUID uow = { /* received via IPC from the creator */ };
HANDLE hTx = NULL;
OBJECT_ATTRIBUTES oa = { sizeof(oa) };

NTSTATUS s = NtOpenTransaction(
    &hTx,
    TRANSACTION_COMMIT | TRANSACTION_ROLLBACK,
    &oa,
    &uow,
    NULL);

if (NT_SUCCESS(s)) {
    // Take ownership of the transaction — commit or rollback as needed.
    NtRollbackTransaction(hTx, TRUE);
    NtClose(hTx);
}

asmx64 direct stub (Win11 24H2)

; NtOpenTransaction direct stub — SSN 0x13B on Win11 24H2
NtOpenTransaction PROC
    mov  r10, rcx
    mov  eax, 13Bh
    syscall
    ret
NtOpenTransaction ENDP

rustOpen via ntapi crate

use ntapi::ntxcapi::NtOpenTransaction;
use winapi::shared::guiddef::GUID;
use winapi::shared::ntdef::{HANDLE, OBJECT_ATTRIBUTES};
use std::{mem, ptr::null_mut};

unsafe fn open_by_uow(mut uow: GUID) -> HANDLE {
    let mut h: HANDLE = null_mut();
    let mut oa: OBJECT_ATTRIBUTES = mem::zeroed();
    oa.Length = mem::size_of::<OBJECT_ATTRIBUTES>() as u32;
    let s = NtOpenTransaction(&mut h, 0x0008 | 0x0010, &mut oa, &mut uow, null_mut());
    assert!(s >= 0);
    h
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20