
Outil IDAPython pour créer automatiquement des tables virtuelles C++ dans IDA Pro
Virtuailor est un outil IDAPython qui reconstruit les vtables pour du code C++ écrit pour architecture Intel, aussi bien en 32 bits qu'en 64 bits, et pour AArch64 (Nouveau !). L'outil est composé de 2 parties, statique et dynamique.
La première est la partie statique, qui contient les fonctionnalités suivantes :
La seconde est la partie dynamique, qui contient les fonctionnalités suivantes :
Virtuailor supporte désormais les versions d'IDA de 7.0 à la plus récente (7.5). Si vous utilisez une version d'IDA antérieure à 7.4, vous devrez basculer sur la branche beforeIDA-7.4 ; la branche master supporte la version la plus récente (7.5).
if __name__ == '__main__':
start_addr_range = idc.MinEA() # Vous pouvez modifier la plage d'adresses des appels virtuels
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
Facultatif (mais extrêmement recommandé) : créez un instantané de votre idb. Appuyez simplement sur Ctrl+Maj+T et créez un instantané.
Allez dans Fichier -> Exécuter un script... puis naviguez vers le dossier Virtuailor et choisissez d'exécuter Main.py. Vous pouvez voir le gif suivant pour une explication plus claire et visuelle.

Ensuite, l'interface graphique vous proposera de choisir une plage à cibler ; si vous souhaitez cibler l'intégralité du binaire, appuyez simplement sur OK avec les valeurs par défaut dans les adresses de début et de fin.
Ensuite, les points d'arrêt seront placés dans votre code et tout ce que vous avez à faire est d'exécuter votre code avec le débogueur d'IDA, d'effectuer les actions souhaitées et d'observer la construction des vtables ! Pour AArch64, vous pouvez configurer un serveur gdb distant et déboguer à l'aide du débogueur d'IDA.
Si vous ne souhaitez plus conserver les points d'arrêt, allez simplement dans l'onglet de la liste des points d'arrêt dans IDA et supprimez-les comme bon vous semble.
Il est également très important pour moi de noter qu'il s'agit de la deuxième version de l'outil avec le support 32 et 64 bits ainsi que aarch64 ; il est probable que dans certains cas, un petit nombre de points d'arrêt soient manqués. Dans ces cas, veuillez ouvrir un ticket et me contacter afin que je puisse améliorer le code et aider à le corriger. Merci d'avance pour cela :)
Les structures que Virtuailor crée à partir de la vtable utilisée dans l'appel virtuel qui a été atteint. Les fonctions de la vtable sont extraites de la mémoire en fonction du registre pertinent utilisé dans l'opcode du point d'arrêt.
Comme je souhaitais créer une corrélation entre la structure dans IDA et les vtables dans la section données, le point d'arrêt modifie le nom de l'adresse de la vtable dans la section données pour qu'il corresponde au nom de la structure. Comme vous pouvez le voir dans l'image suivante :

Les noms des fonctions virtuelles sont également modifiés, sauf dans les cas où les noms ne sont pas les noms par défaut d'IDA (fonctions avec symboles ou fonctions que l'utilisateur a renommées) ; dans ces cas, les noms de fonctions restent inchangés et sont également ajoutés à la structure de la vtable avec leur nom actuel.
Les noms choisis sont construits selon le modèle suivant :
Après avoir créé la vtable, Virtuailor ajoute également une connexion entre la structure créée et l'assembleur, comme vous pouvez le voir dans les images suivantes :

P.S. : Le décalage de structure utilisé dans le point d'arrêt n'est pertinent que pour le dernier appel effectué ; afin d'obtenir une meilleure compréhension de tous les appels virtuels effectués, la fonctionnalité de xref a été ajoutée comme expliqué dans la section suivante.
Lors du rétro-ingénierie statique en C++, il n'est pas trivial de voir qui appelle qui, car la plupart des appels sont des appels indirects. Cependant, après avoir exécuté Virtuailor, chaque fonction appelée indirectement possède désormais un xref vers ces emplacements.
Le gif suivant montre les Xref ajoutées avec leur appel de fonction indirect :

L'outil a été présenté à RECon Brussels, Troopers et Warcon. La présentation est disponible au lien suivant : https://www.youtube.com/watch?v=Xk75TM7NmtA
REcon Brussels, Troopers, Warcon crews, Nana, @tmr232, @matalaz, @oryandp, @talkain, @shiftreduce
Ce plugin est sous licence GNU GPL v3.