> Windows Syscalls
ntoskrnl.exeT1559T1106

NtConnectPort

Conexión del cliente a un puerto servidor LPC heredado, equivalente pre-ALPC de NtAlpcConnectPort.

Prototipo

NTSTATUS NtConnectPort(
  PHANDLE                       PortHandle,
  PUNICODE_STRING               PortName,
  PSECURITY_QUALITY_OF_SERVICE  SecurityQos,
  PPORT_VIEW                    ClientView,
  PREMOTE_PORT_VIEW             ServerView,
  PULONG                        MaxMessageLength,
  PVOID                         ConnectionInformation,
  PULONG                        ConnectionInformationLength
);

Argumentos

NameTypeDirDescription
PortHandlePHANDLEoutRecibe el handle al puerto cliente conectado si el servidor acepta.
PortNamePUNICODE_STRINGinNombre completo del puerto LPC en el espacio de objetos, p. ej. \RPC Control\myport.
SecurityQosPSECURITY_QUALITY_OF_SERVICEinNivel de impersonación y modo de seguimiento que el servidor puede aplicar al cliente (típicamente Identification).
ClientViewPPORT_VIEWin/outSección compartida opcional que el cliente ofrece al servidor; actualizada con la dirección en el servidor.
ServerViewPREMOTE_PORT_VIEWoutRecibe la vista de sección compartida del servidor (si el servidor adjuntó una en el accept).
MaxMessageLengthPULONGoutRecibe la longitud máxima de mensaje LPC negociada con el servidor (PORT_MAXIMUM_MESSAGE_LENGTH = 256).
ConnectionInformationPVOIDin/outCarga útil opcional enviada en el connect; sobrescrita al retornar con los datos de aceptación del servidor.
ConnectionInformationLengthPULONGin/outEn entrada, tamaño de ConnectionInformation; en salida, tamaño de la respuesta del servidor.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070x99win10-1507
Win10 16070x9Awin10-1607
Win10 17030x9Cwin10-1703
Win10 17090x9Dwin10-1709
Win10 18030x9Ewin10-1803
Win10 18090x9Ewin10-1809
Win10 19030x9Ewin10-1903
Win10 19090x9Ewin10-1909
Win10 20040xA0win10-2004
Win10 20H20xA0win10-20h2
Win10 21H10xA0win10-21h1
Win10 21H20xA0win10-21h2
Win10 22H20xA0win10-22h2
Win11 21H20xA2win11-21h2
Win11 22H20xA2win11-22h2
Win11 23H20xA2win11-23h2
Win11 24H20xA4win11-24h2
Server 20160x9Awinserver-2016
Server 20190x9Ewinserver-2019
Server 20220xA2winserver-2022
Server 20250xA4winserver-2025

Módulo del kernel

ntoskrnl.exeNtConnectPort

APIs relacionadas

NtAcceptConnectPortNtSecureConnectPortNtAlpcConnectPortNtRequestPortNtRequestWaitReplyPortNtCreatePort

Stub del syscall

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

NtConnectPort es la contraparte cliente de NtAcceptConnectPort y el antecesor pre-Vista de NtAlpcConnectPort. La firma de 8 argumentos está documentada por phnt y el libro Windows Internals; la implementación kernel reside en `LpcpConnectPort` de ntoskrnl.exe. Aunque ALPC suplantó funcionalmente a LPC desde Vista, el camino de dispatch LPC nunca se eliminó — estos SSN siguen cableados y resuelven a código funcional en Windows 11 24H2. El SSN deriva entre builds (a diferencia de NtAcceptConnectPort), por lo que los stubs de syscall directo deben resolver dinámicamente.

Uso común por malware

El malware moderno rara vez elige LPC sobre ALPC o named pipes, pero la superficie sigue siendo una primitiva IPC viable para componentes que quieran evitar los caminos ALPC mejor instrumentados. Históricamente (era XP / 2003) algunas familias de rootkits en user mode usaban LPC para comunicación entre un loader y un payload inyectado, ya que no existía wrapper Win32 y el tráfico permanecía íntegramente en kernel. Hoy la relevancia práctica es sobre todo *histórica y educativa*; trate cualquier llamante de user mode como sospechoso, casi nada usa legítimamente LPC en crudo en Windows contemporáneo.

Oportunidades de detección

No hay proveedor ETW `Microsoft-Windows-Kernel-LPC` análogo al de ALPC; los defensores dependen de hooks en la tabla de syscalls (EDR en kernel) o hooks de user mode sobre `ntdll!NtConnectPort`. La tasa base es tan baja en Windows 10/11 que *cualquier* hit en NtConnectPort desde un proceso no sistema merece alerta. SystemInformer enumera puertos LPC y ALPC por proceso — un handle LPC inesperado en una app sandboxeada o en un binario sin firmar es un indicador de alta confianza. Las secciones compartidas PORT_VIEW también crean entradas VAD que sobreviven a la conexión.

Ejemplos de syscalls directos

asmx64 direct stub (Win11 24H2)

; Direct syscall stub for NtConnectPort (SSN 0xA4 on Win11 24H2 — drifts per build)
NtConnectPort PROC
    mov  r10, rcx          ; PortHandle
    mov  eax, 0A4h         ; SSN
    syscall
    ret
NtConnectPort ENDP

cConnect to a named LPC server

// Connect to a legacy LPC server port; minimal connect message, no shared view.
#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (NTAPI *pNtConnectPort)(
    PHANDLE, PUNICODE_STRING, PVOID /*PSECURITY_QOS*/,
    PVOID, PVOID, PULONG, PVOID, PULONG);

HANDLE LpcConnect(LPCWSTR name) {
    UNICODE_STRING us; RtlInitUnicodeString(&us, name);
    SECURITY_QUALITY_OF_SERVICE qos = {
        sizeof(qos), SecurityIdentification, SECURITY_DYNAMIC_TRACKING, FALSE
    };
    HANDLE h = NULL; ULONG maxLen = 0, cinfoLen = 0;
    pNtConnectPort fn = (pNtConnectPort)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtConnectPort");
    fn(&h, &us, &qos, NULL, NULL, &maxLen, NULL, &cinfoLen);
    return h;
}

rustResolve and call via GetProcAddress

// Cargo: windows-sys = "0.59"
use std::ffi::c_void;
use windows_sys::Win32::System::LibraryLoader::{GetModuleHandleA, GetProcAddress};

type NtConnectPortFn = unsafe extern "system" fn(
    *mut *mut c_void, *const c_void, *const c_void,
    *mut c_void, *mut c_void, *mut u32, *mut c_void, *mut u32,
) -> i32;

unsafe fn resolve() -> Option<NtConnectPortFn> {
    let h = GetModuleHandleA(b"ntdll.dll\0".as_ptr());
    let p = GetProcAddress(h, b"NtConnectPort\0".as_ptr())?;
    Some(std::mem::transmute(p))
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20