将.dart.snapshot反编译为Dart源代码

时间:2019-05-02 09:07:39

标签: dart flutter apk reverse-engineering decompiler

根据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?

在用Java语言编写的android Apk中,我们可以使用dex2jar工具反编译apk并从class.dex获取jar文件,但是当使用flutter框架(用dart编写)开发的应用程序时,如何反编译此应用程序并获取应用程序dart类?

此图像显示了apk资产文件中生成的快照文件。

Apk structure

1 个答案:

答案 0 :(得分:1)

在发布模式下,Flutter将Dart代码编译为机器代码currently only ARMv7(此过程称为AOT-提前编译)。与本机Android应用程序不同,在本机Android应用程序中,Java被编译为名为Smali的字节码,可以(非常容易)将其再次反编译为Java。

大多数机器代码被编译成文件“ isolate_snapshot_instr”,该文件以一种特殊格式编写,并且颤振引擎(flutterlib.so,也位于应用程序内部)在运行时将其加载到应用程序内存中。因此,您有2个合理的选择:

  1. 在运行时(.text段)读取应用程序代码。您可以使用 为此,frida dump并提取已编译的Dart代码, 您需要
  2. 添加/使用Flutter引擎以反序列化机器代码

如果您拥有ipa(IOS应用程序),则可能会更容易,因为所有代码都在App.Framework中找到。