> Windows Syscalls
ntoskrnl.exeT1486T1070.004T1485

NtSetInformationFile

Establece metadatos de archivo vía FILE_INFORMATION_CLASS — renombrar, eliminar, asignar, fin de archivo…

Prototipo

NTSTATUS NtSetInformationFile(
  HANDLE                 FileHandle,
  PIO_STATUS_BLOCK       IoStatusBlock,
  PVOID                  FileInformation,
  ULONG                  Length,
  FILE_INFORMATION_CLASS FileInformationClass
);

Argumentos

NameTypeDirDescription
FileHandleHANDLEinHandle abierto. El acceso requerido depende de FileInformationClass (DELETE para disponer/renombrar).
IoStatusBlockPIO_STATUS_BLOCKoutRecibe el estado de la operación y el valor Information específico de la clase.
FileInformationPVOIDinBúfer correspondiente a la clase solicitada (p. ej. FILE_RENAME_INFORMATION, FILE_DISPOSITION_INFORMATION_EX).
LengthULONGinTamaño en bytes del búfer FileInformation.
FileInformationClassFILE_INFORMATION_CLASSinEnum que selecciona la operación, p. ej. FileRenameInformation (10), FileDispositionInformation (13), FileDispositionInformationEx (64).

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070x27win10-1507
Win10 16070x27win10-1607
Win10 17030x27win10-1703
Win10 17090x27win10-1709
Win10 18030x27win10-1803
Win10 18090x27win10-1809
Win10 19030x27win10-1903
Win10 19090x27win10-1909
Win10 20040x27win10-2004
Win10 20H20x27win10-20h2
Win10 21H10x27win10-21h1
Win10 21H20x27win10-21h2
Win10 22H20x27win10-22h2
Win11 21H20x27win11-21h2
Win11 22H20x27win11-22h2
Win11 23H20x27win11-23h2
Win11 24H20x27win11-24h2
Server 20160x27winserver-2016
Server 20190x27winserver-2019
Server 20220x27winserver-2022
Server 20250x27winserver-2025

Módulo del kernel

ntoskrnl.exeNtSetInformationFile

APIs relacionadas

SetFileInformationByHandleMoveFileExWDeleteFileWNtQueryInformationFileNtCreateFile

Stub del syscall

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

Notas no documentadas

SSN estable en `0x27` en todos los builds soportados. La potencia reside en el enum `FILE_INFORMATION_CLASS` — más de 70 clases, pero cuatro importan operativamente: `FileRenameInformation` / `FileRenameInformationEx` (renombrar/mover, incluso sobre nombres bloqueados con FLAGS_POSIX_SEMANTICS en builds modernos), `FileDispositionInformation` / `FileDispositionInformationEx` (marcar para borrar; la variante Ex, añadida en RS1, soporta `FILE_DISPOSITION_FORCE_PERMANENTLY_CHECK_ACCESS` y `FILE_DISPOSITION_POSIX_SEMANTICS` para unlink-while-open), `FileAllocationInformation` (preasignar espacio para escrituras de ransomware veloces) y `FileEndOfFileInformation` (truncar). Dispose/rename pasan por IRP_MJ_SET_INFORMATION y son vistos por cada minifilter.

Uso común por malware

Dos abusos dominantes: (1) **renombrado atómico con cambio de extensión por ransomware**. Cifrar el archivo in situ y `FileRenameInformation` a `<original>.locked` — funciona aunque el archivo lo tenga abierto otro proceso si `FILE_RENAME_POSIX_SEMANTICS` está activado. (2) **Auto-borrado que sobrevive a un EDR sujetando el handle**. Abrir el EXE en ejecución, llamar a `NtSetInformationFile` con `FileRenameInformationEx` a una ruta larga alternativa, luego `FileDispositionInformationEx` con `FILE_DISPOSITION_POSIX_SEMANTICS | FILE_DISPOSITION_DELETE` — el archivo se desvincula al instante aunque el handle siga en uso, técnica documentada por Jonas Lykkegaard / LloydLabs como `delete-self-poc`. También usada por wipers para truncar archivos críticos a cero antes de la disposición final.

Oportunidades de detección

Sysmon Event ID 23 (FileDelete) y 26 (FileDeleteDetected — captura el contenido de archivos borrados cuando archive store está habilitado) detectan disposes a posteriori. El evento ETW `SetInformation` de Microsoft-Windows-Kernel-File porta la FileInformationClass; filtrar por clases 10, 13, 64 y 65 (FileRenameInformationEx) da una señal enfocada. Renombrados masivos en ventana corta con patrón de nueva extensión consistente (`.locked`, `.encrypted`, sufijos aleatorios de 5 chars) es el indicador clásico de ransomware — la mayoría de los EDR lo implementan como heurística de minifilter, ya que los hooks de usuario se eluden con syscalls directas. La técnica de autoborrado aparece como renombrado de la imagen principal de un proceso seguido de FileDispositionInformationEx mientras la sección de imagen sigue mapeada — una pista extremadamente nítida.

Ejemplos de syscalls directos

cRansomware-style rename (`x.docx` -> `x.docx.locked`)

// FileRenameInformation == 10
typedef struct _FILE_RENAME_INFORMATION {
    BOOLEAN ReplaceIfExists;
    HANDLE  RootDirectory;
    ULONG   FileNameLength;
    WCHAR   FileName[1];
} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;

WCHAR newName[] = L"\\??\\C:\\Users\\v\\report.docx.locked";
SIZE_T nameLen = wcslen(newName) * sizeof(WCHAR);
SIZE_T size = FIELD_OFFSET(FILE_RENAME_INFORMATION, FileName) + nameLen;

PFILE_RENAME_INFORMATION info = LocalAlloc(LPTR, size);
info->ReplaceIfExists = TRUE;
info->RootDirectory   = NULL;
info->FileNameLength  = (ULONG)nameLen;
memcpy(info->FileName, newName, nameLen);

IO_STATUS_BLOCK iosb;
NtSetInformationFile(hFile, &iosb, info, (ULONG)size, FileRenameInformation);

cSelf-delete (POSIX semantics)

// LloydLabs delete-self-poc primitive.
// FileRenameInformationEx == 65, FileDispositionInformationEx == 64
typedef struct _FILE_DISPOSITION_INFORMATION_EX {
    ULONG Flags;
} FILE_DISPOSITION_INFORMATION_EX, *PFILE_DISPOSITION_INFORMATION_EX;

#define FILE_DISPOSITION_DELETE                       0x1
#define FILE_DISPOSITION_POSIX_SEMANTICS              0x2
#define FILE_DISPOSITION_FORCE_IMAGE_SECTION_CHECK    0x4
#define FILE_DISPOSITION_ON_CLOSE                     0x8

// 1) Open current image with DELETE | SYNCHRONIZE.
// 2) Rename to an ADS (`:wat`) via FileRenameInformationEx.
// 3) Re-open with DELETE access.
// 4) Mark for delete:
FILE_DISPOSITION_INFORMATION_EX d = {
    .Flags = FILE_DISPOSITION_DELETE | FILE_DISPOSITION_POSIX_SEMANTICS
};
IO_STATUS_BLOCK iosb;
NtSetInformationFile(hSelf, &iosb, &d, sizeof(d), FileDispositionInformationEx);

asmDirect stub (SSN 0x27)

NtSetInformationFile PROC
    mov  r10, rcx
    mov  eax, 27h
    syscall
    ret
NtSetInformationFile ENDP

Mapeos MITRE ATT&CK

Last verified: 2026-05-20