目前大多数使用Flutter的应用都是采用add2app的方式,在APP中与Flutter相关的内容主要有FlutterEngine、APP产物、资源文件。我们可以在应用市场上寻找一个接入Flutter的应用做实验。(apk可在各大应用市场下载,ipa下载可以在mac上安装Apple Configurator 2进行),apk和ipa中flutter相关产物目录如下:
iOS包文件为ipa,下载后将其后缀重命名为zip进行解压,解压后Payload下即可看到应用文件夹,其中FlutterEngine、APP产物、资源文件分别在如下位置:
xxx.app
└── Frameworks
├── App.framework
│ ├── App(Dart APP产物)
│ ├── Info.plist
│ ├── SC_Info
│ ├── _CodeSignature
│ └── flutter_assets
│ ├── flutter_assets
│ ├── AssetManifest.json
│ ├── FontManifest.json
│ ├── LICENSE
│ ├── fonts
│ ├── images
│ ├── mtf_module_info
│ └── packages
└── Flutter.framework
├── Flutter(FlutterEngine)
├── Info.plist
├── SC_Info
├── _CodeSignature
└── icudtl.dat
Android包文件为apk,下载后将其后缀重命名为zip进行解压,其中FlutterEngine、APP产物、资源文件分别在如下位置:
xxx.apk
├── assets
│ └── flutter_assets
│ └── flutter_assets
│ ├── AssetManifest.json
│ ├── FontManifest.json
│ ├── LICENSE
│ ├── fonts
│ ├── images
│ ├── mtf_module_info
│ └── packages
└── lib
└── armeabi
├── libapp.o(Dart APP产物)
└── libflutter.so(FlutterEngine)
FlutterEngine各个app都是使用官方或者在官方基础上进行修改,差别不多,我们暂不关心这部分的逆向。资源文件多是图片,字体等无需逆向即可查看的资源。我们主要关心的是使用Dart编写的业务逻辑或者某些框架代码,这部分代码在APP产物中。即:App.framework/App 或 armeabi/libapp.o这两个文件都是动态库,我们先简单看看里面包含什么?
# 可以安装常用的 bin utils工具,如 brew update && brew install binutils
~/Downloads > objdump -t App
App: 文件格式 mach-o-arm64
SYMBOL TABLE:
0000000001697e60 g 0f SECT 02 0000 [.const] _kDartIsolateSnapshotData
000000000000b000 g 0f SECT 01 0000 [.text] _kDartIsolateSnapshotInstructions
0000000001690440 g 0f SECT 02 0000 [.const] _kDartVmSnapshotData
0000000000006000 g 0f SECT 01 0000 [.text] _kDartVmSnapshotInstructions
~/Downloads > greadelf -s libapp.so
Symbol table '.dynsym' contains 5 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00001000 12992 FUNC GLOBAL DEFAULT 1 _kDartVmSnapshot[...]