Donc, si votre instantané a été produit par une version raisonnablement moderne, elle analysera probablement [correctement]. Pourtant, si vous voulez essayer, vous aurez probablement besoin au moins de la correction du # 3.
darter est un module Python qui peut entièrement analyser les données dans un instantané DART (c'est-à-dire le fichier libapp.so dans une application Flutter).
Caractéristiques:
app.so ou .snapshot automatiquement.Exemples de ce que vous pouvez faire avec les informations analysées:
Remarque: Gardez à l'esprit que c'est pour l'analyse des instantanés binaires (c'est-à-dire dépendants de l'architecture). .dill Les darter .snapshot [Apprendre encore plus]
La majeure partie du code est une dépendance zéro, sauf pour:
parse_elf_snapshot(...) nécessite des pyelftools
Le module darter.asm (pour analyser le code assemblé) nécessite une pierre angulaire (et sa liaison python)
darter en soi n'est qu'un module, il n'a pas de programme autonome ni de CLI.
La façon recommandée de l'utiliser est de l'inclure dans un cahier et de jouer avec les données analysées.
Installez Jupyter et ouvrez le cahier 1-introduction pour une procédure pas à pas de base des données analysées; Rendez-vous ensuite vers 2-playground qui contient des exemples d'utilisation plus intéressants.
Il est fortement recommandé de jouer avec un instantané connu (c'est-à-dire que vous avez construit vous-même ou avez le code), avant d'analyser l'instantané que vous recherchez.
L'analyseur est encore à un stade précoce et ne fonctionnera pas dans tous les cas.
Cet analyseur a été écrit sur la base de DART-SDK à 1ef83b86ae . Le format instantané est interne à la machine virtuelle. Il jette certains des objets tels qu'ils apparaissent en mémoire; Vous devez savoir comment la machine virtuelle (arc, drapeaux de compilation) a été compilée afin de l'analyser. Il peut changer fréquemment entre les versions, car il n'y a pas de spécification standard (afaik) pour le format.
Toute aide ou dons sont les bienvenus.
Étant donné une section de données et une section d'instructions (et éventuellement une base ):
OneByteString , CodeSourceMap , Instructions , etc.).Les informations sont renvoyées autant que possible, afin qu'elle soit facile de manipuler. Les références arrière sont également suivies, de sorte qu'il est facile de savoir d'où un certain objet est référencé.
darter peut analyser à la fois les instantanés «VM» et les «isolat» (ceux dont nous nous soucions).
Le module darter.asm démonte le code compilé et l'analyse. Ceci est crucial pour les instantanés AOT, car nous n'obtenons aucun bytecode de haut niveau.
Si vous êtes nouveau dans l'ingénierie inverse de Dart / Flutter, c'est une bonne idée de lire cette introduction en premier: https://mrale.ph/dartvm/
Le code pertinent sur la sérialisation des instantanés est sur runtime/vm/clustered_snapshot.cc et runtime/vm/raw_object.h .
Il y a aussi des informations supplémentaires dans le répertoire info .