Jadi, jika snapshot Anda diproduksi oleh versi yang cukup modern, itu mungkin tidak akan menguraikan [dengan benar]. Namun, jika Anda ingin mencoba, Anda mungkin membutuhkan setidaknya perbaikan di #3.
darter adalah modul Python yang dapat sepenuhnya menguraikan data di dalam snapshot panah (yaitu file libapp.so dalam aplikasi flutter rilis).
Fitur:
app.so atau .snapshot file secara otomatis.Contoh dari apa yang dapat Anda lakukan dengan info parsed:
Catatan: Perlu diingat bahwa ini untuk memarsing snapshot biner (yaitu arsitektur yang bergantung pada arsitektur). File .dill dan beberapa file .snapshot berisi kernel ast, yang merupakan format yang sama sekali berbeda dan saat ini tidak didukung oleh darter . [Pelajari lebih lanjut]
Sebagian besar kode adalah ketergantungan nol, kecuali untuk:
parse_elf_snapshot(...) membutuhkan pyelftools
Modul darter.asm (untuk menganalisis kode yang dirakit) memerlukan batu penjuru (dan pengikatan ularinnya)
darter sendiri hanyalah sebuah modul, tidak memiliki program atau CLI yang berdiri sendiri.
Cara yang disarankan untuk menggunakannya adalah dengan memasukkannya ke dalam buku catatan dan bermain dengan data yang diuraikan.
Instal Jupyter dan buka buku catatan 1-introduction untuk penelusuran dasar data yang diuraikan; Kemudian pergilah ke 2-playground yang berisi lebih banyak contoh penggunaan yang menarik.
Sangat disarankan agar Anda bermain dengan snapshot yang diketahui (yaitu bahwa Anda telah membangun diri sendiri atau memiliki kodenya), sebelum menganalisis snapshot yang Anda cari.
Parser masih pada tahap awal dan tidak akan bekerja dalam setiap kasus.
Parser ini ditulis berdasarkan DART-SDK di 1ef83b86ae . Format snapshot bersifat internal ke VM. Itu membuang beberapa objek saat muncul dalam memori; Anda perlu tahu bagaimana VM (lengkungan, bendera kompilasi) dikompilasi untuk menguraikannya. Ini dapat sering berubah antara versi, karena tidak ada spesifikasi standar (AFAIK) untuk format.
Bantuan atau sumbangan apa pun dipersilakan.
Diberikan bagian data dan bagian instruksi (dan secara opsional basis ):
OneByteString , CodeSourceMap , Instructions , dll.).Informasi dikembalikan sebanyak mungkin, sehingga mudah dimanipulasi. Referensi belakang juga dilacak, sehingga mudah untuk mengetahui dari mana objek tertentu dirujuk.
darter dapat mengurai kedua snapshot 'VM' dan 'isolasi' (yang kita pedulikan).
Modul darter.asm membongkar kode yang dikompilasi dan menganalisisnya. Ini sangat penting untuk snapshot AOT, karena kami tidak mendapatkan bytecode tingkat tinggi.
Jika Anda baru mengenal Dart/Flutter Reverse-Engineering, itu ide yang bagus untuk membaca pengantar ini terlebih dahulu: https://mrale.ph/dartvm/
Kode yang relevan pada serialisasi snapshot adalah pada runtime/vm/clustered_snapshot.cc dan runtime/vm/raw_object.h .
Ada juga info tambahan di direktori info .