Flutter混合开发App的Sign逆向分析教学文档
1. 背景介绍
本教学文档基于对某台球App的sign签名逆向分析过程,该App采用Flutter框架进行混合开发。我们将详细讲解从抓包发现sign值到最终逆向分析出sign生成逻辑的全过程。
2. 工具准备
进行此类逆向分析需要准备以下工具:
- 抓包工具:小黄鸟(或其他HTTP抓包工具如Charles、Fiddler)
- 反编译工具:jadx(用于查看Java代码)
- 脱壳工具:frida-dump(用于脱壳处理)
- Flutter逆向工具:blutter(专门用于Flutter逆向)
- Hook工具:Frida(用于动态分析)
- IDA Pro(用于分析so文件)
3. 初步分析
3.1 抓包发现sign值
使用小黄鸟抓包工具捕获App的网络请求,发现请求中包含一个名为sign的参数,这是一个常见的签名参数,用于服务端验证请求合法性。
3.2 反编译APK
使用jadx反编译APK文件时,发现App有壳保护,直接反编译无法获取有效代码。
3.3 脱壳处理
使用frida-dump进行脱壳:
- 运行frida-dump脚本
- 获取脱壳后的dex文件
- 将脱壳结果重新拖入jadx中分析
3.4 确认Flutter混合开发
在反编译后的代码中发现入口页面是FlutterActivity,确认这是一个使用Flutter框架开发的App界面。
检查APK的lib文件夹,发现存在:
libapp.solibflutter.so
这进一步确认了App采用Flutter混合开发模式。
4. Flutter逆向专项分析
4.1 使用blutter工具
blutter是一个专门用于Flutter逆向的工具,能够解析libapp.so中的快照数据,获取业务代码的类和方法信息。
项目地址:https://github.com/worawit/blutter
使用步骤:
- 克隆blutter仓库
- 运行blutter解析
libapp.so - 生成IDA脚本
ida_script/addNames.py
4.2 搜索关键函数
在blutter解析出的结果中搜索关键字"sign",发现多个相关函数。由于sign值是32位长度,初步猜测可能是MD5算法。
搜索"MD5"关键字,找到4个相关函数,需要进一步分析确认。
5. 动态Hook分析
5.1 修改blutter_frida.js
为了动态分析MD5相关函数,需要修改blutter生成的blutter_frida.js脚本:
- 增加dump函数,用于打印详细信息
- 修改
onLibappLoaded函数,增加更多参数打印 - 添加对可疑MD5函数的Hook
5.2 逐个Hook验证
通过逐一Hook四个MD5相关函数,对比抓包结果,最终确定关键函数:
Allocate_MD5SinkStub_b953c0是生成sign的核心函数。
5.3 Hook结果分析
Hook输出示例:
String@7d01397219 = "android_api_get{\"mobile\":\"13245621451\"}NKzK8hNnxNrWooj3"
将上述字符串进行MD5加密后,与抓包中的sign值对比,发现完全一致。
6. Sign生成逻辑分析
通过逆向分析,确定sign的生成规则如下:
- 固定前缀:
"android_api_get" - 拼接参数字典的JSON字符串表示
- 拼接固定字符串:
"NKzK8hNnxNrWooj3" - 对拼接后的完整字符串进行MD5加密
伪代码表示:
import hashlib
def generate_sign(params):
fixed_prefix = "android_api_get"
fixed_suffix = "NKzK8hNnxNrWooj3"
param_str = json.dumps(params)
raw_str = fixed_prefix + param_str + fixed_suffix
sign = hashlib.md5(raw_str.encode()).hexdigest()
return sign
7. 验证方法
为了验证分析结果的正确性:
- 构造相同参数
- 按照上述规则拼接字符串
- 计算MD5值
- 与抓包中的sign值对比
如果一致,则证明分析正确。
8. 总结
本教学文档详细介绍了Flutter混合开发App的sign逆向分析全过程,关键步骤包括:
- 使用抓包工具发现sign参数
- 处理加壳保护并反编译
- 识别Flutter混合开发特征
- 使用blutter工具进行Flutter专项逆向
- 通过动态Hook定位关键函数
- 分析并验证sign生成逻辑
这种分析方法不仅适用于本案例,也可作为类似Flutter应用逆向的通用方法参考。