文章参考自看雪:[原创]一种基于frida和drony的针对flutter抓包的方法
Flutter是Google使用Dart语言开发的移动应用开发框架,使用一套Dart代码就能快速构建高性能、高保真的iOS和Android应用程序。
由于Dart使用Mozilla的NSS库生成并编译自己的Keystore,导致我们就不能通过将代理CA添加到系统CA存储来绕过SSL验证。为了解决这个问题,就必需要研究libflutter.so
。
原文章是找特征,用frida内存扫描特征,不过这个特征每个app好像还不一样,做不到通用。
借用大佬的结论,直接将apk pull到电脑上,解压,在lib目录中找到libflutter.so
。用IDA打开
搜索字符串ssl_client
在字符串面板ctrl+F搜索字符串ssl_client 找到了
双击进去
看交叉引用
鼠标放在函数位置按x搜索交叉引用(右键 list cross references也可)
可以找到并定位函数为sub_3B1834
双击进去看看,下面画红圈的就是特征的样子
找函数头
往上找,找到函数头
,或者f5看伪代码也可以
hook
然后把地址换成自己的0x3B1834
之所以address.add(0x01)是因为看到这么个说明:在32位ARM上, 对于ARM函数, 此地址的最低有效位必须设置为0, 对于Thumb函数, 此地址必须设置为1。
function hook_ssl_verify_result(address)
{
Interceptor.attach(address, {
onEnter: function(args) {
console.log("Disabling SSL validation")
},
onLeave: function(retval)
{
console.log("Retval: " + retval)
retval.replace(0x1);
}
});
}
function disablePinning(){
// Change the offset on the line below with the binwalk result
// If you are on 32 bit, add 1 to the offset to indicate it is a THUMB function: .add(0x1)
// Otherwise, you will get 'Error: unable to intercept function at ......; please file a bug'
var address = Module.findBaseAddress('libflutter.so').add(0x3B1834)
hook_ssl_verify_result(address);
}
setTimeout(disablePinning, 1000)
接下来adb启动frida
进入app之后`frida –UF –l flutter_by_pass.js “(-UF 就是当前打开的app)
可以触发一下发包的动作,看有没有日志打印
有的话启动postern, charles进行抓包