Je tente de générer un graphique de flux de contrôle des résultats d'assemblage renvoyés via un appel à objdump -d. Actuellement, la meilleure méthode que j'ai trouvée est de placer chaque ligne du résultat dans une liste chaînée, et de séparer l'adresse mémoire, l'opcode, et les opérandes pour chaque ligne. Je les sépare en m'appuyant sur la nature régulière des résultats d'objdump (l'adresse mémoire est du caractère 2 au caractère 7 dans la chaîne qui représente chaque ligne).Construction d'un graphique de flux de contrôle à l'aide des résultats d'Objdump
Une fois cela fait, je démarre l'instruction CFG réelle. Chaque nœud du CFG contient une adresse mémoire de début et de fin, un pointeur vers le bloc de base précédent et des pointeurs vers des blocs de base enfants. Je passe ensuite en revue les résultats d'objdump et compare l'opcode avec un tableau de tous les opcodes de flux de contrôle dans x86_64. Si l'opcode est un flux de contrôle, j'enregistre l'adresse comme la fin du bloc de base, et en fonction de l'opcode soit ajouter deux pointeurs enfants (opcode conditionnel) ou un (appel ou retour).
Je suis en train de mettre en œuvre ceci en C, et il semble que cela fonctionnera mais se sent très ténu. Est-ce que quelqu'un a des suggestions ou quelque chose que je ne prends pas en compte?
Merci d'avoir pris le temps de lire ceci!
modifier:
L'idée est de l'utiliser pour comparer les traces de la pile des appels système générés par DynamoRIO contre le CFG attendu pour un binaire cible, j'espère que la construction comme ceci facilitera cela. Je n'ai pas réutilisé ce qui est disponible parce que A) Je n'y avais pas vraiment réfléchi et B) J'ai besoin d'obtenir le graphique dans une structure de données utilisable pour que je puisse faire des comparaisons de chemin. Je vais jeter un oeil à certains utilitaires sur la page que vous avez alignée, merci de m'indiquer dans la bonne direction. Merci pour vos commentaires, j'apprécie vraiment!
Cela ressemble à une approche globale plausible. Vous voudrez peut-être réfléchir à ce que vous devez faire lorsque vous voyez un appel indirect. En outre, vous dites que les instructions de retour auront un successeur - que serait-ce, exactement, pour une fonction avec plusieurs appelants? Les appels et les retours ne sont souvent pas inclus dans les fichiers CFG (tels que LLVM IR). La "bonne" réponse dépend de ce que vous envisagez de faire avec le CFG après l'avoir construit. –
Approche intéressante. Il existe plusieurs outils (voir http://en.wikipedia.org/wiki/Call_graph) qui peuvent être utilisés pour créer des CFG à partir du code source. Y a-t-il une raison particulière pour laquelle vous voulez adopter cette approche au lieu de réutiliser ce qui est disponible? – Sudhanshu
Comment résolvez-vous les pointeurs de fonction? J'écris aussi un genre de programme similaire mais je me demande toujours comment je vais résoudre les pointeurs de fonction? – prap19