> Windows Syscalls
ntoskrnl.exeT1559T1106

NtCreatePort

Crea un objeto puerto LPC de servidor con nombre — la primitiva de escucha IPC heredada pre-ALPC.

Prototipo

NTSTATUS NtCreatePort(
  PHANDLE             PortHandle,
  POBJECT_ATTRIBUTES  ObjectAttributes,
  ULONG               MaxConnectionInfoLength,
  ULONG               MaxMessageLength,
  ULONG               MaxPoolUsage
);

Argumentos

NameTypeDirDescription
PortHandlePHANDLEoutRecibe el handle al nuevo objeto puerto de servidor.
ObjectAttributesPOBJECT_ATTRIBUTESinAtributos de objeto; típicamente proporciona una ruta NT como \RPC Control\<Name> como nombre del puerto.
MaxConnectionInfoLengthULONGinTamaño máximo en bytes del payload de info de conexión intercambiado en NtAcceptConnectPort.
MaxMessageLengthULONGinTamaño máximo de un mensaje LPC en línea; limitado a PORT_MAXIMUM_MESSAGE_LENGTH (256 bytes).
MaxPoolUsageULONGinLímite superior del uso de paged pool para mensajes en cola en este puerto.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070xABwin10-1507
Win10 16070xADwin10-1607
Win10 17030xB0win10-1703
Win10 17090xB1win10-1709
Win10 18030xB2win10-1803
Win10 18090xB2win10-1809
Win10 19030xB3win10-1903
Win10 19090xB3win10-1909
Win10 20040xB7win10-2004
Win10 20H20xB7win10-20h2
Win10 21H10xB7win10-21h1
Win10 21H20xB8win10-21h2
Win10 22H20xB8win10-22h2
Win11 21H20xBBwin11-21h2
Win11 22H20xBCwin11-22h2
Win11 23H20xBCwin11-23h2
Win11 24H20xBEwin11-24h2
Server 20160xADwinserver-2016
Server 20190xB2winserver-2019
Server 20220xBAwinserver-2022
Server 20250xBEwinserver-2025

Módulo del kernel

ntoskrnl.exeNtCreatePort

APIs relacionadas

NtAcceptConnectPortNtCompleteConnectPortNtReplyWaitReceivePortNtConnectPortNtAlpcCreatePort

Stub del syscall

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

NtCreatePort es el lado *servidor* del mecanismo IPC **LPC** heredado (pre-Vista). Registra un objeto puerto con nombre — típicamente bajo `\RPC Control\` — al que los clientes acceden vía NtConnectPort. Tras aceptar la conexión con NtAcceptConnectPort y completar el handshake con NtCompleteConnectPort, el servidor entra en su bucle de recepción mediante NtReplyWaitReceivePort. Desde Vista, el kernel expone la API **ALPC** más rica (NtAlpcCreatePort, etc.) y Microsoft ha migrado prácticamente todo el RPC interno a ALPC. LPC permanece en la SSDT por compatibilidad pero ya casi nada que se distribuya hoy lo usa.

Uso común por malware

El uso ofensivo moderno de NtCreatePort es *poco común*. El patrón histórico relevante es un implante kernel o user-mode que registra un nombre de puerto LPC imitando un componente kernel legítimo (p. ej. algo parecido a `\SeLsaCommandPort`) y lo usa como canal C2 sigiloso intra-host que no toca Winsock ni las APIs de named pipes. Hoy un atacante que quiera IPC intra-host casi siempre recurrirá a ALPC, named pipes, mailslots o secciones compartidas. Cualquier proceso no firmado por Microsoft que invoque NtCreatePort debe considerarse anómalo.

Oportunidades de detección

Sin proveedor ETW dedicado a LPC heredado equivalente a `Microsoft-Windows-Kernel-ALPC`. La detección depende por tanto de callbacks de kernel (hooks ObCreateObject del Object Manager vía ObRegisterCallbacks para el tipo `Port`) o hook de syscall a nivel driver. SystemInformer y WinObj enumeran los objetos puerto vivos bajo `\RPC Control` y `\Sessions\<n>\Windows`. Cualquier nuevo nombre de puerto que no coincida con un componente Microsoft conocido (csrss, lsass, smss, subsistema RPC) merece investigación.

Ejemplos de syscalls directos

asmx64 direct stub

; Direct syscall stub for NtCreatePort (SSN 0xBE on Win11 24H2)
NtCreatePort PROC
    mov  r10, rcx          ; PortHandle
    mov  eax, 0BEh         ; SSN — verify per-build before deploying
    syscall
    ret
NtCreatePort ENDP

cRegister a named LPC server port

// Create an LPC server port under \RPC Control.
#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (NTAPI *pNtCreatePort)(
    PHANDLE, POBJECT_ATTRIBUTES, ULONG, ULONG, ULONG);

NTSTATUS CreateLpcPort(HANDLE *outHandle, PCWSTR ntName) {
    UNICODE_STRING name;
    OBJECT_ATTRIBUTES oa;
    RtlInitUnicodeString(&name, ntName);
    InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);

    pNtCreatePort fn = (pNtCreatePort)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtCreatePort");
    return fn(outHandle, &oa, 0x100, 0x100, 0x2000);
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20