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
| Name | Type | Dir | Description |
|---|---|---|---|
| PortHandle | HANDLE | in | Handle al puerto de comunicación del lado servidor para el cliente cuya petición se responde. |
| ReplyMessage | PPORT_MESSAGE | in | PORT_MESSAGE cuyos campos MessageId / ClientId coinciden con la petición original. |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0xC | win10-1507 |
| Win10 1607 | 0xC | win10-1607 |
| Win10 1703 | 0xC | win10-1703 |
| Win10 1709 | 0xC | win10-1709 |
| Win10 1803 | 0xC | win10-1803 |
| Win10 1809 | 0xC | win10-1809 |
| Win10 1903 | 0xC | win10-1903 |
| Win10 1909 | 0xC | win10-1909 |
| Win10 2004 | 0xC | win10-2004 |
| Win10 20H2 | 0xC | win10-20h2 |
| Win10 21H1 | 0xC | win10-21h1 |
| Win10 21H2 | 0xC | win10-21h2 |
| Win10 22H2 | 0xC | win10-22h2 |
| Win11 21H2 | 0xC | win11-21h2 |
| Win11 22H2 | 0xC | win11-22h2 |
| Win11 23H2 | 0xC | win11-23h2 |
| Win11 24H2 | 0xC | win11-24h2 |
| Server 2016 | 0xC | winserver-2016 |
| Server 2019 | 0xC | winserver-2019 |
| Server 2022 | 0xC | winserver-2022 |
| Server 2025 | 0xC | winserver-2025 |
Módulo del kernel
APIs relacionadas
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 ENDPcReply 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