> Windows Syscalls
ntoskrnl.exeT1564.001T1547.001T1137.001

NtCreateFile

Crée ou ouvre un fichier, répertoire, périphérique ou pipe nommé — premier appel disque de tout dropper.

Prototype

NTSTATUS NtCreateFile(
  PHANDLE            FileHandle,
  ACCESS_MASK        DesiredAccess,
  POBJECT_ATTRIBUTES ObjectAttributes,
  PIO_STATUS_BLOCK   IoStatusBlock,
  PLARGE_INTEGER     AllocationSize,
  ULONG              FileAttributes,
  ULONG              ShareAccess,
  ULONG              CreateDisposition,
  ULONG              CreateOptions,
  PVOID              EaBuffer,
  ULONG              EaLength
);

Arguments

NameTypeDirDescription
FileHandlePHANDLEoutReçoit le handle vers le fichier créé ou ouvert.
DesiredAccessACCESS_MASKinMasque d'accès, ex. GENERIC_WRITE | SYNCHRONIZE, FILE_GENERIC_READ, DELETE.
ObjectAttributesPOBJECT_ATTRIBUTESinOBJECT_ATTRIBUTES contenant le chemin NT (ex. \??\C:\Windows\Temp\a.exe).
IoStatusBlockPIO_STATUS_BLOCKoutReçoit le NTSTATUS final et le champ Information (FILE_CREATED, FILE_OPENED, FILE_OVERWRITTEN…).
AllocationSizePLARGE_INTEGERinTaille initiale optionnelle. NULL laisse le système de fichiers décider.
FileAttributesULONGinAttributs pour les fichiers créés : FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_SYSTEM.
ShareAccessULONGinMode de partage : FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ou 0 pour exclusif.
CreateDispositionULONGinQue faire si le fichier existe : FILE_CREATE, FILE_OPEN, FILE_OPEN_IF, FILE_OVERWRITE, FILE_OVERWRITE_IF, FILE_SUPERSEDE.
CreateOptionsULONGinOptions : FILE_SYNCHRONOUS_IO_NONALERT, FILE_NON_DIRECTORY_FILE, FILE_DELETE_ON_CLOSE…
EaBufferPVOIDinTampon d'Extended Attributes. Habituellement NULL.
EaLengthULONGinTaille en octets d'EaBuffer. 0 si EaBuffer est NULL.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x55win10-1507
Win10 16070x55win10-1607
Win10 17030x55win10-1703
Win10 17090x55win10-1709
Win10 18030x55win10-1803
Win10 18090x55win10-1809
Win10 19030x55win10-1903
Win10 19090x55win10-1909
Win10 20040x55win10-2004
Win10 20H20x55win10-20h2
Win10 21H10x55win10-21h1
Win10 21H20x55win10-21h2
Win10 22H20x55win10-22h2
Win11 21H20x55win11-21h2
Win11 22H20x55win11-22h2
Win11 23H20x55win11-23h2
Win11 24H20x55win11-24h2
Server 20160x55winserver-2016
Server 20190x55winserver-2019
Server 20220x55winserver-2022
Server 20250x55winserver-2025

Module noyau

ntoskrnl.exeNtCreateFile

APIs liées

CreateFileWCreateFile2NtOpenFileNtWriteFileNtReadFileNtSetInformationFileZwCreateFile

Stub du syscall

4C 8B D1            mov r10, rcx
B8 55 00 00 00      mov eax, 0x55
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

NtCreateFile prend 11 paramètres — plus que tout autre syscall couramment abusé — et constitue le point d'entrée sous `CreateFileW`, `OpenFile`, `_open` et la plupart des helpers CRT touchant au disque. Le SSN `0x55` n'a pas bougé depuis Windows 7. Le chemin utilise l'espace de noms NT (`\??\C:\path` ou `\Device\HarddiskVolume3\path`) ; fournir un chemin non-Win32 est une astuce courante pour brouiller les règles de minifilter basées sur les chemins DOS. En x64, seuls les quatre premiers paramètres passent par les registres (RCX, RDX, R8, R9) — les autres sur la pile au-delà des 32 octets de home space, ce qui compte pour qui écrit un stub à la main.

Usage courant par les malwares

La primitive universelle des droppers : écrire les stages secondaires dans `%PROGRAMDATA%`, `%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\`, `%APPDATA%\Microsoft\Templates\Normal.dotm` (persistance via modèle Office, T1137.001), ou `C:\Users\Public\` pour éviter les profils itinérants. Combiné à `FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM` et un nom commençant par `.`, le fichier disparaît de la vue par défaut de l'Explorateur. `FILE_FLAG_DELETE_ON_CLOSE` (via l'option `FILE_DELETE_ON_CLOSE`) sert aux droppers auto-suppressifs, et l'accès à `\\.\PHYSICALDRIVE0` est le point d'entrée des wipers réécrivant le MBR (Petya, HermeticWiper).

Opportunités de détection

Sysmon Event ID 11 (FileCreate) est la pierre angulaire — déclenché avec le chemin image du créateur et le chemin cible complet. Event ID 23 (FileDelete) et 26 (FileDeleteDetected) attrapent l'auto-suppression. ETW Microsoft-Windows-Kernel-File (`{EDD08927-9CC4-4E65-B970-C2560FB5C289}`) fournit les mêmes données sans Sysmon. Les drivers minifilter (FltMgr) enregistrés par les EDR voient chaque NtCreateFile avec son contexte complet, callbacks pre-create et post-create inclus — la plupart des EDR utilisent cette voie plutôt que des hooks user-mode, donc les syscalls directs *ne cachent pas* les dépôts de fichiers. Chasser sur les écritures dans les dossiers Startup, `Templates\Normal.dotm`, à proximité d'IFEO, et les ouvertures de `\Device\PhysicalDriveN` par des processus non-système.

Exemples de syscalls directs

cDrop a hidden payload to %PROGRAMDATA%

// Create C:\ProgramData\impl.bin hidden+system, overwrite if exists.
UNICODE_STRING path;
RtlInitUnicodeString(&path, L"\\??\\C:\\ProgramData\\impl.bin");

OBJECT_ATTRIBUTES oa;
InitializeObjectAttributes(&oa, &path, OBJ_CASE_INSENSITIVE, NULL, NULL);

IO_STATUS_BLOCK iosb = {0};
HANDLE hFile = NULL;
NTSTATUS s = NtCreateFile(
    &hFile,
    GENERIC_WRITE | SYNCHRONIZE,
    &oa,
    &iosb,
    NULL,                                   // AllocationSize
    FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM,
    FILE_SHARE_READ,
    FILE_OVERWRITE_IF,
    FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE,
    NULL, 0);

asmDirect stub (SSN 0x55) — stack args

; NtCreateFile has 11 args. Caller pushes args 5..11 on the stack;
; the syscall stub itself is the canonical 4-instr form.
NtCreateFile PROC
    mov  r10, rcx
    mov  eax, 55h
    syscall
    ret
NtCreateFile ENDP

rustSelf-deleting marker file

// Sets FILE_DELETE_ON_CLOSE so the file vanishes when the handle is closed.
use ntapi::ntioapi::{NtCreateFile, IO_STATUS_BLOCK};
use ntapi::ntrtl::RtlInitUnicodeString;
use winapi::shared::ntdef::{OBJECT_ATTRIBUTES, OBJ_CASE_INSENSITIVE, UNICODE_STRING};
use winapi::um::winnt::{DELETE, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, SYNCHRONIZE};

const FILE_CREATE: u32 = 0x2;
const FILE_SYNCHRONOUS_IO_NONALERT: u32 = 0x20;
const FILE_DELETE_ON_CLOSE: u32 = 0x1000;
const FILE_NON_DIRECTORY_FILE: u32 = 0x40;

pub unsafe fn touch_ephemeral(nt_path: *const u16) {
    let mut us: UNICODE_STRING = core::mem::zeroed();
    RtlInitUnicodeString(&mut us, nt_path);
    let mut oa = OBJECT_ATTRIBUTES {
        Length: core::mem::size_of::<OBJECT_ATTRIBUTES>() as u32,
        RootDirectory: core::ptr::null_mut(),
        ObjectName: &mut us,
        Attributes: OBJ_CASE_INSENSITIVE,
        SecurityDescriptor: core::ptr::null_mut(),
        SecurityQualityOfService: core::ptr::null_mut(),
    };
    let mut iosb: IO_STATUS_BLOCK = core::mem::zeroed();
    let mut h = core::ptr::null_mut();
    NtCreateFile(
        &mut h,
        DELETE | SYNCHRONIZE,
        &mut oa,
        &mut iosb,
        core::ptr::null_mut(),
        FILE_ATTRIBUTE_NORMAL,
        FILE_SHARE_READ,
        FILE_CREATE,
        FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE | FILE_DELETE_ON_CLOSE,
        core::ptr::null_mut(),
        0,
    );
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20