> Windows Syscalls
ntoskrnl.exeT1559T1106

NtCreatePort

Crée un objet port LPC serveur nommé — la primitive d'écoute IPC historique pré-ALPC.

Prototype

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

Arguments

NameTypeDirDescription
PortHandlePHANDLEoutReçoit le handle vers le nouvel objet port serveur.
ObjectAttributesPOBJECT_ATTRIBUTESinAttributs d'objet ; fournit typiquement un chemin NT comme \RPC Control\<Name> comme nom de port.
MaxConnectionInfoLengthULONGinTaille maximale en octets du payload de connexion échangé lors de NtAcceptConnectPort.
MaxMessageLengthULONGinTaille maximale d'un message LPC inline ; plafonnée à PORT_MAXIMUM_MESSAGE_LENGTH (256 octets).
MaxPoolUsageULONGinBorne supérieure sur l'utilisation de paged pool pour les messages en file sur ce port.

IDs de syscalls par version de Windows

Version 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

Module noyau

ntoskrnl.exeNtCreatePort

APIs liées

NtAcceptConnectPortNtCompleteConnectPortNtReplyWaitReceivePortNtConnectPortNtAlpcCreatePort

Stub du 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

Notes non documentées

NtCreatePort est le côté *serveur* du mécanisme IPC **LPC** historique (pré-Vista). Il enregistre un objet port nommé — typiquement sous `\RPC Control\` — que les clients atteignent via NtConnectPort. Après acceptation par NtAcceptConnectPort puis finalisation par NtCompleteConnectPort, le serveur entre dans sa boucle de réception via NtReplyWaitReceivePort. Depuis Vista, le noyau expose l'API **ALPC** plus riche (NtAlpcCreatePort etc.) et Microsoft a migré quasiment tout le RPC interne vers ALPC. LPC reste dans la SSDT pour compatibilité mais n'est presque plus utilisé par ce qui se livre aujourd'hui.

Usage courant par les malwares

L'usage offensif moderne de NtCreatePort est *peu courant*. Le pattern historique pertinent est un implant kernel ou user-mode qui enregistre un nom de port LPC mimant un composant noyau légitime (p. ex. quelque chose ressemblant à `\SeLsaCommandPort`) et l'utilise comme canal C2 intra-host furtif ne touchant ni Winsock ni les APIs named pipe. Aujourd'hui un attaquant qui veut de l'IPC intra-host se tournera presque toujours vers ALPC, named pipes, mailslots ou sections partagées. Tout processus non signé Microsoft invoquant NtCreatePort doit être considéré anormal.

Opportunités de détection

Pas de provider ETW dédié au LPC historique équivalent à `Microsoft-Windows-Kernel-ALPC`. La détection repose donc sur des callbacks kernel (hooks ObCreateObject de l'Object Manager via ObRegisterCallbacks pour le type `Port`) ou un hook syscall en driver. SystemInformer et WinObj énumèrent les objets port vivants sous `\RPC Control` et `\Sessions\<n>\Windows`. Tout nouveau nom de port ne correspondant pas à un composant Microsoft connu (csrss, lsass, smss, sous-système RPC) mérite enquête.

Exemples de syscalls directs

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);
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20