
Alternative Read- und Write-Primitive, die Rtl*-Funktionen auf nicht vorgesehene Weise nutzen.
Ein Repository mit Skripten zur Demonstration alternativer Read- und Write-Primitive mit Rtl*-Funktionen auf nicht vorgesehene Weise.
RtlFillMemory nimmt drei Argumente entgegen: einen Zeiger auf den Zielspeicher, die Anzahl der zu schreibenden Bytes und einen einzelnen Byte-Wert. Schreibt nur ein Byte in den angegebenen Speicherblock.
Write-Primitive durch die Kombination von RtlInitializeBitMapEx und RtlFillMemory.
Zuerst durchläuft es den String in 16-Byte-Blöcken und teilt jeden Block in zwei 8-Byte-Werte auf. Der erste 8-Byte-Block wird im ersten Argument von RtlInitializeBitMapEx gespeichert, der zweite 8-Byte-Block im zweiten Argument.
Wenn ein zusätzlicher 8-Byte-Block übrig bleibt, wird dieser mithilfe von RtlInitializeBitMapEx mit NULL als zweitem Parameter geschrieben.
Wenn schließlich weniger als 8 Bytes übrig bleiben, werden sie einzeln mit RtlFillMemory geschrieben, bis der gesamte String in den Zielpuffer kopiert ist.
Read-Primitive mithilfe von RtlQueryDepthSList. Nützlich für die ROP-Gadget-Suche, Byte-Vergleich, Hook-Erkennung usw. Hier demonstriere ich eine einfache Prozessinjektion mit einem ROP-Gadget. RtlQueryDepthSList akzeptiert ein einzelnes Argument—die Speicheradresse, aus der gelesen werden soll—, liest aber nur 2 Bytes und gibt einen 4-Byte-Wert zurück.