> Windows Syscalls
ntoskrnl.exeT1559T1106

NtAcceptConnectPort

Aceptación en el servidor de una solicitud de conexión LPC heredada, con mapeo opcional de vista compartida.

Prototipo

NTSTATUS NtAcceptConnectPort(
  PHANDLE            PortHandle,
  PVOID              PortContext,
  PPORT_MESSAGE      ConnectionRequest,
  BOOLEAN            AcceptConnection,
  PPORT_VIEW         ServerView,
  PREMOTE_PORT_VIEW  ClientView
);

Argumentos

NameTypeDirDescription
PortHandlePHANDLEoutRecibe un handle al puerto de comunicación recién creado si se acepta la conexión.
PortContextPVOIDinPuntero de contexto opaco del servidor asociado a esta conexión, devuelto en mensajes posteriores.
ConnectionRequestPPORT_MESSAGEinEl mensaje LPC_CONNECTION_REQUEST recibido previamente vía NtListenPort / NtReplyWaitReceivePort.
AcceptConnectionBOOLEANinTRUE para aceptar la conexión, FALSE para rechazarla (el cliente recibe STATUS_PORT_CONNECTION_REFUSED).
ServerViewPPORT_VIEWin/outVista de sección compartida opcional expuesta al cliente; actualizada con la dirección en el cliente.
ClientViewPREMOTE_PORT_VIEWoutRecibe la vista de sección compartida del cliente (si el cliente ofreció una en el connect).

IDs de syscalls por versión de Windows

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

Módulo del kernel

ntoskrnl.exeNtAcceptConnectPort

APIs relacionadas

NtCreatePortNtListenPortNtCompleteConnectPortNtReplyWaitReceivePortNtConnectPortNtAlpcAcceptConnectPort

Stub del syscall

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

NtAcceptConnectPort es la mitad servidor del handshake **LPC** (Local Procedure Call) heredado — el antecesor pre-Vista de ALPC. Sigue presente en ntoskrnl.exe por compatibilidad y aún se alcanza desde user mode, pero prácticamente todo el RPC moderno fluye ya por ALPC (`NtAlpc*`). El SSN está congelado en `0x2` desde la introducción de la tabla, vestigio de la edad de LPC. Las llamadas hermanas son NtCreatePort (servidor), NtListenPort, NtReplyWaitReceivePort, NtCompleteConnectPort y NtConnectPort (cliente).

Uso común por malware

El abuso directo de LPC por malware moderno es raro; la superficie ha sido suplantada en gran medida por ALPC y named pipes. Históricamente (era XP / 2003), LPC servía a veces como canal C2 intra-proceso o intra-host entre componentes cooperantes de rootkits en user mode, porque no existía API Win32 y el tráfico era invisible a los monitores de red. Hoy la relevancia es sobre todo *histórica y educativa* — conocer la interfaz heredada ayuda a red teamers a reconocerla en código antiguo y a defensores a evitar puntos ciegos en instalaciones Windows de cola larga donde las tablas LPC siguen cableadas.

Oportunidades de detección

No hay proveedor ETW dedicado al LPC heredado como existe `Microsoft-Windows-Kernel-ALPC` para ALPC; la señal más fiable es la *ausencia* de llamantes legítimos — casi ningún componente in-box de Windows 10/11 usa LPC en crudo. Los EDR que hookean la tabla de syscalls en kernel pueden marcar cualquier proceso de user mode que llame a NtAcceptConnectPort fuera de un puñado de componentes legacy (algunos caminos de CSRSS / SMSS aún la tocan). En forense, la enumeración de puertos de SystemInformer muestra puertos LPC junto a ALPC — un puerto LPC nombrado inesperado en `\RPC Control\` o `\BaseNamedObjects\` merece investigación.

Ejemplos de syscalls directos

asmx64 direct stub

; Direct syscall stub for NtAcceptConnectPort (SSN 0x2, stable since Win10 1507)
NtAcceptConnectPort PROC
    mov  r10, rcx          ; PortHandle
    mov  eax, 02h          ; SSN
    syscall
    ret
NtAcceptConnectPort ENDP

cLegacy LPC server accept skeleton

// Educational LPC server skeleton — modern code should use ALPC instead.
#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (NTAPI *pNtAcceptConnectPort)(
    PHANDLE, PVOID, PVOID /*PPORT_MESSAGE*/, BOOLEAN, PVOID, PVOID);

NTSTATUS AcceptOrReject(PVOID connReq, BOOL allow) {
    HANDLE hComm = NULL;
    pNtAcceptConnectPort fn = (pNtAcceptConnectPort)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtAcceptConnectPort");
    // PortContext = NULL, no shared views
    return fn(&hComm, NULL, connReq, allow ? TRUE : FALSE, NULL, NULL);
}

rustFFI declaration via ntapi

// Cargo: ntapi = "0.4"
use ntapi::ntlpcapi::NtAcceptConnectPort;
use winapi::shared::ntdef::{HANDLE, BOOLEAN, NTSTATUS};

unsafe fn accept(req: *mut u8) -> Result<HANDLE, NTSTATUS> {
    let mut h: HANDLE = std::ptr::null_mut();
    let s = NtAcceptConnectPort(
        &mut h,
        std::ptr::null_mut(),
        req as *mut _,
        1 as BOOLEAN,
        std::ptr::null_mut(),
        std::ptr::null_mut(),
    );
    if s == 0 { Ok(h) } else { Err(s) }
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20