> Windows Syscalls
ntoskrnl.exeT1559T1106

NtReplyPort

Envía una respuesta en un puerto LPC del lado servidor a una petición recibida, sin esperar.

Prototipo

NTSTATUS NtReplyPort(
  HANDLE         PortHandle,
  PPORT_MESSAGE  ReplyMessage
);

Argumentos

NameTypeDirDescription
PortHandleHANDLEinHandle al puerto de comunicación del lado servidor para el cliente cuya petición se responde.
ReplyMessagePPORT_MESSAGEinPORT_MESSAGE cuyos campos MessageId / ClientId coinciden con la petición original.

IDs de syscalls por versión de Windows

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

Módulo del kernel

ntoskrnl.exeNtReplyPort

APIs relacionadas

NtReplyWaitReceivePortNtRequestWaitReplyPortNtCreatePortNtAcceptConnectPortNtAlpcSendWaitReceivePort

Stub del syscall

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

NtReplyPort completa la mitad servidor de un intercambio LPC síncrono iniciado por un cliente vía NtRequestWaitReplyPort. El `MessageId` coincidente en la respuesta permite al kernel entregar la respuesta al llamante correcto. Un servidor normalmente *no* invoca NtReplyPort en un bucle caliente — usa NtReplyWaitReceivePort, que responde atómicamente a la petición previa y espera la siguiente. El SSN `0x0C` está congelado en todas las builds de Windows 10/11, reflejo del estado legacy de LPC, con número bajo y prácticamente intacto por Microsoft.

Uso común por malware

El uso de NtReplyPort específicamente en malware es *muy raro* y casi siempre co-ocurre con un servidor LPC custom registrado vía NtCreatePort. Interés histórico únicamente: rootkits user-mode pre-Vista que exponían un puerto kernel falso para recibir comandos de un componente co-residente y luego respondían vía NtReplyPort. El código ofensivo moderno elige mayoritariamente ALPC o named pipes para este patrón.

Oportunidades de detección

Sin proveedor ETW dedicado a LPC heredado. La señal más fuerte está aguas arriba: cualquier proceso no firmado por Microsoft que mantenga un puerto servidor LPC (visible vía SystemInformer / WinObj o un filtro kernel ObRegisterCallbacks para el tipo `Port`) y alcance NtReplyPort es altamente anómalo en Windows 10/11. Correlacionar la pila del hilo llamante con un NtCreatePort observado previamente permite identificar al servidor.

Ejemplos de syscalls directos

asmx64 direct stub

; Direct syscall stub for NtReplyPort (SSN 0x0C, stable Win10 1507+)
NtReplyPort PROC
    mov  r10, rcx          ; PortHandle
    mov  eax, 0Ch          ; SSN
    syscall
    ret
NtReplyPort ENDP

cReply to a single LPC request

// Send a one-shot reply to an LPC request whose MessageId we've stashed.
#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (NTAPI *pNtReplyPort)(HANDLE, PVOID /*PPORT_MESSAGE*/);

NTSTATUS LpcReply(HANDLE serverPort, void *replyMsg) {
    pNtReplyPort fn = (pNtReplyPort)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtReplyPort");
    return fn(serverPort, replyMsg);
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20