
Cacher les artefacts mémoire en utilisant la ROP et les points d'arrêt matériels.
Cet outil est un PoC simple montrant comment masquer des artefacts mémoire en utilisant une chaîne ROP combinée avec des points d'arrêt matériels. La chaîne ROP changera les protections de la page mémoire du module principal en N/A pendant le sommeil (c'est-à-dire lorsque la fonction Sleep est appelée). Pour plus d'informations détaillées sur cette technique d'évasion de scan mémoire, consultez le projet original Gargoyle. x64 uniquement.
L'idée est de configurer un point d'arrêt matériel dans kernel32!Sleep et un nouveau filtre de premier niveau pour gérer l'exception. Lorsque Sleep est appelé, la fonction de filtre d'exception définie précédemment est déclenchée, nous permettant d'appeler la chaîne ROP sans avoir recours à des hooks de fonctions classiques. Ainsi, nous évitons de laisser des régions mémoire privées bizarres et inhabituelles dans le processus liées à des DLL bien connues.
La chaîne ROP appelle simplement VirtualProtect() pour définir la page mémoire courante sur N/A, puis appelle SleepEx, et enfin restaure la protection mémoire RX.
L'aperçu du processus est le suivant :
Ce processus se répète indéfiniment.
Comme on peut le voir dans l'image, la protection mémoire du module principal est changée en N/A pendant le sommeil, ce qui évite les scans mémoire cherchant des pages avec permission d'exécution.

Comme nous utilisons le plugin LITCRYPT pour obscurcir les littéraux de chaîne, il est nécessaire de définir la variable d'environnement LITCRYPT_ENCRYPT_KEY avant de compiler le code :
C:\Users\User\Desktop\RustChain> set LITCRYPT_ENCRYPT_KEY="yoursupersecretkey"
Après cela, compilez simplement le code et exécutez l'outil :
C:\Users\User\Desktop\RustChain> cargo build
C:\Users\User\Desktop\RustChain\target\debug> rustchain.exe
Cet outil est juste un PoC et certaines fonctionnalités supplémentaires devraient être implémentées pour être pleinement fonctionnel. L'objectif principal du projet était d'apprendre à implémenter une chaîne ROP et de l'intégrer dans Rust. Pour cette raison, cet outil ne fonctionnera que si vous l'utilisez tel quel, et des échecs sont attendus si vous essayez de l'utiliser d'autres manières (par exemple, en le compilant en dll et en essayant de le charger et de l'exécuter de manière reflective).