
Verstecke Speicherartefakte mithilfe von ROP und Hardware-Breakpoints.
Dieses Tool ist ein einfacher PoC, wie man Speicherartefakte mit einer ROP-Kette in Kombination mit Hardware-Breakpoints verstecken kann. Die ROP-Kette ändert die Speicherseitenschutz des Hauptmoduls auf N/A (nicht zugänglich) während des Schlafens (d.h. wenn die Funktion Sleep aufgerufen wird). Für detailliertere Informationen über diese Technik zur Umgehung von Speicherscans siehe das ursprüngliche Projekt Gargoyle. Nur x64.
Die Idee ist, einen Hardware-Breakpoint in kernel32!Sleep und einen neuen Top-Level-Filter zur Behandlung der Ausnahme einzurichten. Wenn Sleep aufgerufen wird, wird die zuvor gesetzte Ausnahmefilterfunktion ausgelöst, sodass wir die ROP-Kette aufrufen können, ohne klassische Funktions-Hooks verwenden zu müssen. Auf diese Weise vermeiden wir, seltsame und ungewöhnliche private Speicherbereiche im Prozess zu hinterlassen, die mit bekannten DLLs in Verbindung stehen.
Die ROP-Kette ruft einfach VirtualProtect() auf, um die aktuelle Speicherseite auf N/A zu setzen, ruft dann SleepEx auf und stellt schließlich den RX-Speicherschutz wieder her.
Der Überblick über den Prozess ist wie folgt:
Dieser Prozess wiederholt sich unbegrenzt.
Wie im Bild zu sehen, wird der Speicherschutz des Hauptmoduls während des Schlafens auf N/A geändert, was Speicherscans vermeidet, die nach Seiten mit Ausführungsberechtigung suchen.

Da wir das LITCRYPT Plugin verwenden, um String-Literale zu verschleiern, ist es erforderlich, die Umgebungsvariable LITCRYPT_ENCRYPT_KEY vor der Kompilierung des Codes zu setzen:
C:\Users\User\Desktop\RustChain> set LITCRYPT_ENCRYPT_KEY="yoursupersecretkey"
Danach einfach den Code kompilieren und das Tool ausführen:
C:\Users\User\Desktop\RustChain> cargo build
C:\Users\User\Desktop\RustChain\target\debug> rustchain.exe
Dieses Tool ist nur ein PoC und einige zusätzliche Funktionen sollten implementiert werden, um voll funktionsfähig zu sein. Der Hauptzweck des Projekts war es zu lernen, wie man eine ROP-Kette implementiert und in Rust integriert. Aus diesem Grund funktioniert dieses Tool nur, wenn Sie es so verwenden, wie es ist, und es werden Fehler erwartet, wenn Sie versuchen, es auf andere Weise zu verwenden (z.B. durch Kompilieren zu einer DLL und versuchen, sie reflektiv zu laden und auszuführen).