PoC Rust : contournement AMSI sans patch via Page Guard sur AmsiScanBuffer
🔍 Contexte Publié sur GitHub (Whitecat18/Rust-for-Malware-Development), cet article présente un proof-of-concept (PoC) en Rust implémentant un contournement de l’Antimalware Scan Interface (AMSI) de Microsoft sans modifier un seul octet de amsi.dll. ⚙️ Mécanisme technique La technique repose sur l’exploitation des exceptions de page mémoire gardée (Page Guard) : La page mémoire contenant AmsiScanBuffer est transformée en « trap » via VirtualProtect avec le flag PAGE_GUARD. Tout appel à AmsiScanBuffer déclenche une violation de page gardée (exception 0x80000001) avant l’exécution de la première instruction. Un Vectored Exception Handler (VEH) intercepte cette exception et : Écrit AMSI_RESULT_CLEAN dans la variable résultat du caller (via déréférencement du pointeur en [Rsp+0x30]). Simule un ret pour retourner au caller. Réarme le piège via une exception de single-step (0x80000004) pour le prochain appel. 🧩 Point critique d’implémentation L’article souligne un gotcha critique : l’argument 6 sur la pile ([Rsp+0x30]) est un pointeur vers AMSI_RESULT, pas la valeur directe. Il faut charger le pointeur puis le déréférencer — écrire directement dans le slot de pile corrompt la pile sans affecter la variable résultat du caller. ...