Entonces, si su instantánea fue producida por una versión razonablemente moderna, probablemente no analizará [correctamente]. Aún así, si quieres intentarlo, probablemente necesitarás al menos la solución en el #3.
darter es un módulo de Python que puede analizar completamente los datos dentro de una instantánea de DART (es decir, el archivo libapp.so en una aplicación Flutter de lanzamiento).
Características:
app.so o .snapshot automáticamente.Ejemplos de lo que puede hacer con la información analizada:
Nota: Tenga en cuenta que esto es para analizar instantáneas binarias (es decir, dependiente de la arquitectura). . Los archivos .dill y algunos archivos .snapshot contienen ASTEL AST, que es un formato completamente diferente y actualmente no es compatible con darter . [Aprende más]
La mayor parte del código es dependencia cero, excepto:
parse_elf_snapshot(...) requiere pyelftools
El módulo darter.asm (para analizar el código ensamblado) requiere Capstone (y su unión a Python)
darter en sí mismo es solo un módulo, no tiene un programa o CLI independiente.
La forma recomendada de usarlo es incluirlo en un cuaderno y jugar con los datos analizados.
Instale Jupyter y abra el cuaderno 1-introduction para un tutorial básico de los datos analizados; Luego dirígete a 2-playground que contiene ejemplos de uso más interesantes.
Se recomienda encarecidamente que juegue con una instantánea conocida (es decir, que se haya construido o tenga el código), antes de analizar la instantánea que busca.
El analizador todavía está en una etapa temprana y no funcionará en todos los casos.
Este analizador fue escrito basado en Dart-SDK en 1ef83b86ae . El formato de instantánea es interno para la VM. Dobla algunos de los objetos a medida que aparecen en la memoria; Debe saber cómo se compiló la VM (arco, las banderas de compilación) para analizarlo. Puede cambiar con frecuencia entre versiones, ya que no hay una especificación estándar (AFAIK) para el formato.
Cualquier ayuda o donaciones es bienvenida.
Dada una sección de datos y una sección de instrucciones (y opcionalmente una base ):
OneByteString , CodeSourceMap , Instructions , etc.).La información se devuelve lo más posible, para que sea fácil de manipular. Las referencias de retroceso también se rastrean, de modo que es fácil saber de dónde se hace referencia a un determinado objeto.
darter puede analizar tanto las instantáneas 'VM' como las 'aislar' (las que nos importan).
El módulo darter.asm desmonta el código compilado y lo analiza. Esto es crucial para las instantáneas AOT, porque no obtenemos un código de bytes de alto nivel.
Si es nuevo en la ingeniería inversa de Dart/Flutter, es una buena idea leer esta introducción primero: https://mrale.ph/dartvm/
El código relevante en la serialización de la instantánea está en runtime/vm/clustered_snapshot.cc y runtime/vm/raw_object.h .
También hay información adicional en el directorio info .