电子数据取证Android篇之Flutter
随着移动互联网进入存量竞争时代,Google 推出的 Flutter 框架凭借其“一份代码,多端运行”的跨平台特性、媲美原生的流畅性能(基于 Skia/Impeller 引擎)以及极高的开发效率,已迅速成为全球开发者青睐的首选方案。从金融支付到社交工具,Flutter 应用的身影无处不在。然而,对于电子数据取证(Forensics)和移动安全研究人员而言,Flutter 的兴起却构建了一道全新的技术壁垒。
与传统的跨平台框架(如基于 JavaScript 桥接的 React Native)不同,Flutter 在生产模式下采用 AOT(Ahead-of-Time) 编译。它将 Dart 代码直接编译为目标平台的机器码(如 ARM 指令集),并打包在特有的 libapp.so(Android)或 App.framework(iOS)中。
在电子数据取证的早期阶段,通过设置系统代理(System Proxy)并配合 Charles 或 Fiddler 抓包是获取应用行为数据的主流手段。但在 Flutter 环境下,这一招式往往“折戟沉沙”。
本文旨在深入探讨 Flutter 应用在 ARM 架构下的逆向技巧,并详细解析如何突破其独立的 SSL 验证逻辑,实现对加密流量的透明化截获,为移动取证提供一套切实可行的实战方案。
特征
在逆向分析前,我们首先要确定测试目标是否使用Flutter进行开发,Flutter的特征是在assets目录下会存在flutter_assets文件夹,在lib目录下存在libapp.so(业务逻辑核心)和libflutter.so(引擎核心),如下图所示:


抓包对抗
Hook修改返回值
Flutter使用Dart语言,其标准库中的网络请求不会通过代理发送,所以常见的抓包工具无法捕获flutter应用的网络请求,并且Dart SDK在Android平台上只会强制信任系统目录下的安装证书。
为了绕过SDK中的ssl验证,我们需要找到一个合适的hook点,修改证书验证的结果,从而实现网络流量抓包。
我们解压lib目录从中拿到libflutter.so文件,将该文件通过ida打开,搜索ssl_client关键字,查询ssl验证的关键位置,如下图所示:

通过代码可以得出,如果我们强制证书校验返回true,我们需要hooksub_4CA5FC函数,使其返回的值为1即可绕过ssl证书检验,因为不同版本的Flutter引擎编译出的偏移量不同通过特征码定位会更具通用性,这里我们使用内存搜刮函数前10字节定位,修改返回值即可。
Reflutter Patch
可以使用reflutter完成抓包操作,目前的版本已经不需要再输入宿主机的IP地址,输入reflutter xx.apk等待输出即可,需要注意的是,输出的app没有签名,需要进行签名,使用mt管理器或者手动签名都行,等待签名安装成功之后开启抓包软件即可正常抓包。

Blutter逆向
Blutter是专门为 Dart AOT 运行时设计的逆向分析套件。它不仅仅是一个解包工具,更是一套集成了 元数据提取、代码重构与分析助手 的综合方案。它的核心使命是将高度抽象、难以理解的二进制机器码,还原为具有可读性的类结构和伪代码,解包后的目录如下图所示:

其中asm是包含符号的libapp程序集,blutter_frida.js是针对目标应用程序的frida脚本模板,objs.txt是从Object Pool中转储的对象,pp.txt是Object Pool中的全部Dart对象,ida_script是使用ida对符号进行去除的脚本。
通常来说使用ida_script下的addNames.py对libapp.so文件进行分析,objs.txt中搜索到在app中出现的所有文本,可以快速定位敏感字符串(API接口,加密key),在通过asm目录下的伪代码进行整体代码的逻辑分析。
Flutter 的流行无疑为移动端取证与安全审计带来了全新的挑战。其自建的网络协议栈绕过了传统的系统代理机制,而高度优化的 AOT 编译模式则将可读的代码封锁在二进制的迷雾之中。
然而,通过本文的分析我们可以看到,从底层引擎的 SSL 逻辑注入,到利用工具自动化重建 Dart 对象模型,Flutter 并非不可逾越的“技术黑盒”。在实际的电子数据取证工作中,灵活运用 动态 Hook 截获流量 与 静态逆向提取逻辑 的双重手段,依然能够有效地拨云见日,还原应用最真实的数据交换行为。随着 Flutter 版本的不断更迭,逆向技术也将持续演进,这场“攻守道”的较量仍将继续。