
Un dumper dynamique VMP et un réparateur d'imports, propulsé par VTIL.

Un dumper VMP dynamique et réparateur d'importations, propulsé par VTIL. Fonctionne pour VMProtect 3.X x64.

VMPDump.exe <Target PID> "<Target Module>" [-ep=<Entry Point RVA>] [-disable-reloc]
Arguments :
<Target PID> : L'ID du processus cible, sous forme décimale ou hexadécimale.<Target Module> : Le nom du module qui doit être dumpé et réparé. Cela peut être une chaîne vide ("") si le module image du processus est souhaité.[-ep=<Entry Point RVA>] : Un RVA de point d'entrée facultatif, sous forme hexadécimale. VMPDump écrase simplement le point d'entrée dans l'en-tête optionnel avec cette valeur.[-disable-reloc] : Un paramètre facultatif pour ordonner à VMPDump de marquer que les relocalisations ont été supprimées dans l'image de sortie, forçant l'image à se charger à l'ImageBase dumpée. Ceci est utile si des dumps exécutables sont souhaités.L'initialisation et le dépaquetage de VMProtect doivent être terminés dans le processus cible avant d'exécuter VMPDump. Cela signifie qu'il doit être à ou après l'OEP (Original Entry Point).
L'image dumpée et réparée apparaîtra dans le répertoire du module image du processus, sous le nom <Target Module Name>.VMPDump.<Target Module Extension>.
VMProtect injecte des stubs pour chaque appel ou saut d'importation. Ces stubs résolvent le thunk 'obfusqué' dans la section .vmpX, et ajoutent une constante fixe pour le 'désobfusquer'. Les appels ou sauts eux-mêmes sont ensuite distribués avec une instruction ret.
VMPDump scanne toutes les sections exécutables à la recherche de ces stubs, et les élève vers VTIL en utilisant le lifter x64 de VTIL. Une analyse est ensuite effectuée sur ces stubs, afin de déterminer quel type d'appel doit être remplacé et quels octets doivent être écrasés.
Une fois que tous les appels ont été récupérés, VMPDump crée ensuite une nouvelle table d'importation et ajoute des thunks à l'IAT existante. Les appels vers les stubs d'importation VMP sont remplacés par des appels directs vers ces thunks.
Notez que dans les routines mutées, il y a des situations où il n'y a pas assez d'octets pour remplacer l'appel du stub d'importation VMP par un appel de thunk direct, car ce dernier est plus grand d'1 octet. Dans ces cas, la section est étendue et un stub qui saute vers le thunk d'importation est injecté. L'appel du stub d'importation VMP est ensuite remplacé par un appel relatif de 5 octets ou un saut vers ledit stub injecté.
mkdir build && cd build
cmake -G "Visual Studio 16 2019" ..
cmake --build . --config Release
La compilation dans VS est aussi simple que de remplacer les répertoires include/library vers VTIL-NativeLifers/VTIL-Core/Keystone/Capstone dans le vcxproj.
Le projet nécessite C++20.
En raison du fait que les sections de code sont scannées linéairement, en particulier dans du code fortement muté et obfusqué, certains appels de stub d'importation peuvent être ignorés et donc non résolus. Cependant, VMPDump inclut des solutions de contournement pour la majorité des incohérences de mutation de VMProtect, il devrait donc produire des résultats décents même dans du code fortement muté.
Si vous rencontrez cela, veuillez ouvrir un issue avec les informations pertinentes et je jetterai un coup d'œil.
Sous licence GPL-3.0. Aucune garantie d'aucune sorte n'est fournie.