这是猿人学App第七题flutter案例
直接抓包看一下,直接抓不到。关闭抓包就正常
![image]()
既然说了是flutter,可以参考这两篇文章
文章里面也说了Flutter是Google使用Dart语言开发的移动应用开发框架,由于Dart使用Mozilla的NSS库生成并编译自己的Keystore,导致我们就不能通过将代理CA添加到系统CA存储来绕过SSL验证。为了解决这个问题,就必需要研究libflutter.so。
写脚本,在运行时将返回函数改为true即可绕过证书链检查实现抓包。
文章内容各位就自己看,我们直接上手
解压apk,用ida打开libflutter.so
在ida中的strings搜索字符串ssl_client
![image]()
跟进去可以找到并定位函数为sub_393DA4,也可以按x看它的引用,也是函数sub_393DA4,跟进去
![image]()
![image]()
找到ssl_client的引用位置,往上找到函数sub_393DA4头部字节定位,
![image]()
针对64位flutter.so的hook代码示例如下,地址不再需要+1。把上面的头部字节替换到pattern里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 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 hookFlutter() { var m = Process.findModuleByName("libflutter.so"); var pattern = "FF C3 01 D1 FD 7B 01 A9 FC 6F 02 A9 FA 67 03 A9 F8 5F 04 A9 F6 57 05 A9 F4 4F 06 A9 08 0A 80 52"; 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") } }); }
|
开启脚本后,抓包就正常了
![image]()