Question:
Analyse statique des binaires C ++
user1354557
2013-03-20 23:09:55 UTC
view on stackexchange narkive permalink

Lors du reverse engineering de binaires compilés à partir de C ++, il est courant de voir de nombreux appels indirects à des pointeurs de fonction dans vtables. Pour déterminer où ces appels mènent, il faut toujours être conscient des types d'objets attendus par le pointeur this dans les fonctions virtuelles, et parfois mapper une hiérarchie de classes.

Dans le cadre de l'analyse statique, quels outils ou techniques d'annotation utilisez-vous pour simplifier les fonctions virtuelles à suivre lors de votre démontage? Les solutions pour toutes les boîtes à outils d'analyse statique sont les bienvenues.

Un répondre:
#1
+24
Igor Skochinsky
2013-03-21 00:49:02 UTC
view on stackexchange narkive permalink

J'ai donné une conférence à Recon en 2011 ("Practical C ++ Decompilation") sur ce sujet précis. Des diapositives et vidéo ( miroir) sont disponibles.

L'approche de base est simple: représenter les classes comme des structures et des vtables comme structures de pointeurs de fonction. Il y a quelques astuces que j'ai décrites qui vous permettent de gérer l'héritage et différentes vtables pour les classes dans la même hiérarchie. Ces astuces ont également été décrites sur ce blog; Je ne sais pas si cela était basé sur mon discours ou un travail indépendant.

Une chose supplémentaire que je fais est d'ajouter un commentaire répétable à chaque emplacement dans la structure vtable avec l'adresse de l'implémentation. Cela vous permet de passer rapidement à l'implémentation lorsque vous appliquez la structure à la charge de l'emplacement vtable:

enter image description here

Questions à ce sujet: 1) Comment annotez-vous (personnellement) les appels indirects lorsque la vtable référencée est indéterminée? (plus précisément, lorsqu'il y a plusieurs adresses cibles possibles pour l'appel?) 2) Comment nommez-vous (personnellement) vos structures de classe avant de déterminer leur objectif, et dans quelle mesure laissez-vous leurs noms temporaires se propager dans la base de données avant de les modifier ?
Je crée (généralement) une structure vtable par instance réelle de vtable, de sorte que les adresses pointent toujours vers l'implémentation réelle. Cependant, rien ne vous empêche d'ajouter plusieurs adresses au commentaire. En ce qui concerne la dénomination, je n'ai pas vraiment de règles fixes, je peux mélanger le hongrois, CamelCase et undescored_words dans la base de données unique. Renommer des choses est ennuyeux, donc je reporte généralement le changement de nom des classes et des méthodes jusqu'à ce que je sois raisonnablement sûr de ce que fait la classe (ou que je dispose d'informations RTTI ou de débogage).
Excellent. En ce qui concerne la deuxième question, je vous demandais si vous aviez un moyen systématique de générer et de gérer les noms temporaires. En l'absence d'informations contextuelles, je choisis un nom phonétique «aléatoire» à trois caractères pour la classe. Puisque ce nom temporaire se propage aux commentaires, aux noms de fonctions, aux membres de structure, aux noms de variables, etc. Je ne me soucierai pas toujours de renommer, mais je ferai plutôt une note dans la sous-vue Bloc-notes qui explique ce qu'est réellement la classe.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...