Декомпиляция .dart.snapshot в исходный код Dart - PullRequest
2 голосов
/ 02 мая 2019

Согласно dart-lang / sdk :

Начиная с версии 1.21, Dart VM также поддерживает моментальные снимки приложений, которые включают в себя все проанализированные классы и скомпилированный код, сгенерированный во время тренировочного прогона.программа.

    $ dart --snapshot=hello.dart.snapshot --snapshot-kind=app-jit hello.dart arguments-for-training
    Hello, world!
    $ dart hello.dart.snapshot arguments-for-use
    Hello, world!

Теперь, как мне декомпилировать этот файл hello.dart.snapshot в hello.dart?

В Android Apk, написанном на языке Java, мы можем декомпилировать apk и получитьфайл jar из class.dex с использованием dex2jar инструментов, но когда приложение, разработанное на основе flutter (написано с помощью dart), как можно декомпилировать это приложение и получить классы приложений dart?

На этом изображении показаны файлы снимков, сгенерированные в файле ресурсов apk.

Apk structure

1 Ответ

1 голос
/ 29 мая 2019

В режиме релиза Flutter компилирует код Dart в машинный код, в настоящее время только ARMv7 (эта процедура называется AOT - Ahead-Of-Time compilation). В отличие от нативных приложений Android, в которых Java скомпилирована в байт-код с именем Smali, который (довольно легко) можно декомпилировать обратно в Java.

Большая часть машинного кода скомпилирована в файл isolate_snapshot_instr, который написан в специальном формате, а механизм флаттера (flutterlib.so, также находящийся внутри приложения) загружает его в память приложения во время выполнения. , Поэтому у вас есть 2 разумных варианта:

  1. Чтение кода приложения во время выполнения (сегмент .text). Ты можешь использовать frida dump для этого и извлеките скомпилированный код Dart, который тебе нужно
  2. Pacthing / Использование двигателя Flutter для десериализации машинного кода

Если у вас есть ipa (приложение IOS), это может быть проще, потому что весь код находится в App.Framework.

...