
Un explorateur de traces pour les rétro-ingénieurs
Tenet est un plugin IDA Pro pour explorer les traces d'exécution. L'objectif de ce plugin est de fournir des contrôles plus naturels et humains pour naviguer dans les traces d'exécution par rapport à un binaire donné. La base de ce travail découle du désir de rechercher des méthodes nouvelles ou innovantes pour examiner et distiller les modèles d'exécution complexes dans les logiciels.
Pour plus de contexte sur ce projet, veuillez lire le billet de blog à propos de sa version initiale.
Remerciements particuliers à QIRA / geohot et al. pour l'inspiration.
Tenet est un plugin Python 3 multiplateforme (Windows, macOS, Linux). Il ne nécessite aucune dépendance tierce, rendant le code à la fois portable et facile à installer.
Depuis la console python de votre désassembleur, exécutez la commande suivante pour trouver son répertoire de plugins :
import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")Copiez le contenu du dossier /plugins/ de ce dépôt vers le répertoire listé.
Redémarrez votre désassembleur.
Ce plugin est uniquement pris en charge pour IDA 7.5 et plus récent.
Une fois correctement installé, une nouvelle entrée de menu sera disponible dans le désassembleur. Cela peut être utilisé pour charger des traces d'exécution collectées en externe dans Tenet.
Comme il s'agit de la version initiale, Tenet n'accepte que des traces texte simples lisibles par l'homme. Veuillez vous référer au readme de traçage dans ce dépôt pour des informations supplémentaires sur le format de trace, les limitations et les traceurs de référence.
Lors de l'utilisation de Tenet, le plugin va 'peindre' des traînées pour indiquer le flux d'exécution vers l'avant (bleu) et vers l'arrière (rouge) à partir de votre position actuelle dans la trace d'exécution active.
Pour avancer ou reculer dans le temps, il suffit de défiler en survolant la chronologie sur le côté droit du désassembleur. Pour passer par-dessus les appels de fonction, maintenez SHIFT en défilant.
La chronologie de la trace sera ancrée sur le côté droit du désassembleur. Ce widget est utilisé pour visualiser différents types d'événements le long de la chronologie et effectuer la navigation de base comme décrit ci-dessus.
En cliquant et en faisant glisser sur la chronologie, il est possible de zoomer sur une section spécifique de la trace d'exécution. Cette action peut être répétée un nombre quelconque de fois pour atteindre la granularité souhaitée.
Un double-clic sur le pointeur d'instruction dans la fenêtre des registres le mettra en surbrillance en rouge, révélant tous les emplacements où l'instruction a été exécutée le long de la chronologie de la trace.
Pour sauter entre les exécutions, défilez vers le haut ou le bas en survolant le pointeur d'instruction en surbrillance.
De plus, vous pouvez faire un clic droit dans la liste du désassemblage et sélectionner l'une des entrées de menu basées sur la navigation pour rechercher rapidement l'exécution d'une instruction d'intérêt.
Le raccourci clavier natif F2 d'IDA peut également être utilisé pour définir des points d'arrêt sur des instructions arbitraires.
En double-cliquant sur un octet dans les vues de la pile ou de la mémoire, vous verrez instantanément toutes les lectures/écritures sur cette adresse visualisées à travers la chronologie de la trace. Le jaune indique une lecture mémoire, le bleu indique une écriture mémoire.
Les points d'arrêt mémoire peuvent être navigués en utilisant la même technique décrite pour les points d'arrêt d'exécution. Double-cliquez sur un octet, et défilez en survolant l'octet sélectionné pour rechercher la trace vers chacun de ses accès.
Un clic droit sur un octet d'intérêt vous donnera des options pour rechercher entre lecture / écriture / accès mémoire si vous avez une action de navigation spécifique en tête.
Pour naviguer vers une adresse arbitraire dans la vue mémoire, cliquez sur la vue mémoire et appuyez sur G pour entrer une adresse ou un symbole de base de données vers lequel chercher.
Il est possible de définir un point d'arrêt mémoire sur une région de mémoire en mettant en surbrillance un bloc de mémoire, et en double-cliquant dessus pour définir un point d'arrêt d'accès.
Comme pour les points d'arrêt mémoire normaux, survoler la région et défiler peut être utilisé pour parcourir les accès effectués à la région mémoire sélectionnée.
En rétro-ingénierie, il est assez courant de rencontrer des situations où vous vous demandez "Quelle instruction a défini ce registre à sa valeur actuelle ?"
Avec Tenet, vous pouvez rechercher en arrière cette instruction en un seul clic.
La recherche en arrière est de loin la direction la plus courante pour naviguer à travers les changements de registre... mais pour plus de dextérité, vous pouvez également rechercher en avant vers la prochaine affectation de registre en utilisant la flèche bleue à droite du registre.
Un 'shell' simple est fourni pour naviguer vers des horodatages spécifiques dans la trace. Coller (ou taper...) un horodatage dans le shell avec ou sans virgules suffira.
En utilisant un point d'exclamation, vous pouvez également rechercher un 'pourcentage' spécifié dans la trace. Saisir !100 cherchera la dernière instruction de la trace, tandis que !50 cherchera environ à 50% du parcours de la trace. !last cherchera la dernière instruction navigable pouvant être visualisée dans le désassembleur.
Tenet est livré avec deux thèmes par défaut -- un thème 'clair', et un thème 'sombre'. En fonction des couleurs actuellement utilisées par votre désassembleur, Tenet tentera de sélectionner le thème qui semble le plus approprié.
Les fichiers de thème sont stockés sous forme de JSON simple sur le disque et sont hautement configurables. Si vous n'êtes pas satisfait des thèmes ou couleurs par défaut, vous pouvez créer vos propres thèmes et simplement les déposer dans le répertoire des thèmes utilisateur.
Tenet se souviendra de votre préférence de thème pour les chargements et utilisations futurs.
Le temps et la motivation le financement le permettant, les travaux futurs pourraient inclure :
Je suis ouvert aux contributions externes, aux problèmes et aux demandes de fonctionnalités. Veuillez soumettre toute demande de tirage à la branche develop de ce dépôt si vous souhaitez qu'elles soient considérées pour une future version.