逆向中遇到的一个 app
,各种抓包姿势都抓不到,各种 hook
底层,最后发现是 flutter
框架开发的。 简单记录一下,本文主要是研究 flutter
抓包,如有不对欢迎大佬指正,思路也是参考大佬们的😁
# 前言
flutter
是谷歌的移动UI
框架,可以快速在iOS
和Android
上构建高质量的原生用户界面。Flutter
应用程序是用Dart
编写的,这是一种由Google
在 7 年多前创建的语言。官方网站# 抓包分析
刚开始使用
postern
+charles
进行抓包,发现请求失败,大概意思是服务端验证客户端的ssl
失败,证书不信任,大概猜测可能是sslpinning
。上
frida
sslpinning
脚本,大佬的开源项目,覆盖比较广:DroidSSLUnpinning
, 结果还是一样然后用肉师傅的
r0capture
通杀脚本试一哈,然而还是没有获取到有用信息。既然要通讯,肯定要走
tcp
或者ssl
协议,难不成一个小app
自己再写个openssl
,继续hook
native
层协议,misskings
大佬的文章:https://bbs.pediy.com/thread-267940.htm;我这里hook
jni
的底层收发包函数sendto
和recvfrom
,终于有了一点响应😒收发包都是一段数字,让我想起了大佬们提到的
flutter
,apk
解包果然看到flutter.so
文件
#
ida
分析libflutter.so
ida
打开so
文件,等待编译完成,然后Alt + t
打开搜索text
界面,然后输入ssl_client
并点击ok
等待搜索完毕,然后可以看到类似指令,函数偏移地址是
0x5873D4
x9, xx; "ssl_client"
双击此函数,可以看到
ssl_client
和ssl_server
在此页面点击空格,进入
.text
视图然后点击菜单栏
option
->General
-> , 将下图红框位置改为4
, 就可以看到字节码了然后找到函数开头的
10
个字节码
#
frida
hook
脚本- 参考大佬们的文章,大部分都是通过前 10 位字节码去
hook
,
function hook_flutter() {
function hook_ssl_verify_result(address) {
Interceptor.attach(address, {
onEnter: function (args) {
send("Disabling SSL validation")
},
onLeave: function (retval) {
send("Retval: " + retval)
retval.replace(0x1);
}
});
}
function disablePinning() {
console.log("[*] Disabling SSL pinning")
var m = Process.findModuleByName("libflutter.so");
var pattern = "FF 03 05 D1 FD 7B 0F A9 BC DE 05 94 08 0A 80 52 48 00 00 39"
var res = Memory.scan(m.base, m.size, pattern, {
onMatch: function (address, size) {
console.log('[+] ssl_verify_result found at: ' + address.toString());
hook_ssl_verify_result(address);
},
onError: function (reason) {
console.log('[!] There was an error scanning memory');
},
onComplete: function () {
console.log("All done")
}
});
}
}
- 我发现上述脚本实际就是通过暴力搜索内存中匹配的函数地址,然后再
hook
替换,既然我在搜索ssl_client
那一步就知道函数地址是0x5873D4
,那直接通过偏移地址去hook
不也可以?操作了一下果然可行,
function disablePinning() {
var address = Module.findBaseAddress('libflutter.so').add(0x5873D4);
console.log("[*] Disabling SSL pinning")
Interceptor.attach(address, {
onEnter: function (args) {
console.log("Disabling SSL validation")
},
onLeave: function (retval) {
console.log("Retval: " + retval)
retval.replace(0x1);
}
});
}
成功抓到包
- 参考大佬们的文章,大部分都是通过前 10 位字节码去
参考文章:
1.[原创] 一种基于 frida 和 drony 的针对 flutter 抓包的方法:https://bbs.pediy.com/thread-261941.htm
2.[原创] Flutter 应用逆向分析相关讨论:https://bbs.pediy.com/thread-270362.htm
3.[原创] android 抓包学习的整理和归纳 : https://bbs.pediy.com/thread-267940.htm
4. 对 flutter 开发的某 app 逆向分析:https://mp.weixin.qq.com/s/pXpfXK-Ez0n70f3bqFuuFg