> Windows Syscalls
ntoskrnl.exeT1559T1106

NtReplyPort

Sendet eine Antwort auf einen Server-LPC-Port zu einer empfangenen Anfrage, ohne zu warten.

Prototyp

NTSTATUS NtReplyPort(
  HANDLE         PortHandle,
  PPORT_MESSAGE  ReplyMessage
);

Argumente

NameTypeDirDescription
PortHandleHANDLEinHandle auf den Server-Kommunikations-Port für den Client, dessen Anfrage beantwortet wird.
ReplyMessagePPORT_MESSAGEinPORT_MESSAGE, deren MessageId-/ClientId-Felder zur ursprünglichen Anfrage passen.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
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

Kernel-Modul

ntoskrnl.exeNtReplyPort

Verwandte APIs

NtReplyWaitReceivePortNtRequestWaitReplyPortNtCreatePortNtAcceptConnectPortNtAlpcSendWaitReceivePort

Syscall-Stub

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

Undokumentierte Hinweise

NtReplyPort komplettiert die Server-Hälfte eines synchronen LPC-Austauschs, den ein Client via NtRequestWaitReplyPort initiiert hat. Die passende `MessageId` in der Antwort erlaubt dem Kernel, die Antwort an den richtigen Caller zuzustellen. Ein Server ruft NtReplyPort normalerweise *nicht* direkt in einer Hot-Loop auf — er nutzt NtReplyWaitReceivePort, das atomar die vorherige Anfrage beantwortet und auf die nächste wartet. Die SSN `0x0C` ist über alle Windows-10/11-Builds eingefroren, ein Spiegel des Legacy-Status von LPC als niedrig nummerierter, von Microsoft praktisch unangetasteter Tabelleneintrag.

Häufige Malware-Nutzung

Malware-Nutzung speziell von NtReplyPort ist *sehr selten* und tritt fast immer zusammen mit einem benutzerdefinierten, via NtCreatePort registrierten LPC-Server auf. Nur historisches Interesse: Pre-Vista-User-Mode-Rootkits, die einen vorgetäuschten Kernel-Port exponierten, um Befehle von einer co-residenten Komponente zu empfangen, und dann via NtReplyPort antworteten. Moderner offensiver Code wählt für dieses Muster überwiegend ALPC oder Named Pipes.

Erkennungs­möglichkeiten

Kein dedizierter ETW-Provider für Legacy-LPC. Das stärkste Signal liegt vorgelagert: Jeder nicht von Microsoft signierte Prozess, der einen LPC-Server-Port hält (sichtbar via SystemInformer / WinObj oder einem Kernel-ObRegisterCallbacks-Filter für Typ `Port`) und NtReplyPort erreicht, ist auf Windows 10/11 hochauffällig. Korrelation des Caller-Thread-Stacks mit einem zuvor beobachteten NtCreatePort identifiziert den Server.

Direkte Syscall-Beispiele

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

MITRE ATT&CK-Mappings

Last verified: 2026-05-20