逆向中遇到的一个 app ,各种抓包姿势都抓不到,各种 hook 底层,最后发现是 flutter 框架开发的。 简单记录一下,本文主要是研究 flutter 抓包,如有不对欢迎大佬指正,思路也是参考大佬们的😁

  1. # 前言

    flutter 是谷歌的移动 UI 框架,可以快速在 iOSAndroid 上构建高质量的原生用户界面。 Flutter 应用程序是用 Dart 编写的,这是一种由 Google 在 7 年多前创建的语言。官方网站

  2. # 抓包分析

    • 刚开始使用 postern + charles 进行抓包,发现请求失败,大概意思是服务端验证客户端的 ssl 失败,证书不信任,大概猜测可能是 sslpinning

    • frida sslpinning 脚本,大佬的开源项目,覆盖比较广: DroidSSLUnpinning , 结果还是一样

    • 然后用肉师傅的 r0capture 通杀脚本试一哈,然而还是没有获取到有用信息。

    • 既然要通讯,肯定要走 tcp 或者 ssl 协议,难不成一个小 app 自己再写个 openssl ,继续 hook native 层协议, misskings 大佬的文章:https://bbs.pediy.com/thread-267940.htm;我这里 hook jni 的底层收发包函数 sendtorecvfrom ,终于有了一点响应😒

    • 收发包都是一段数字,让我想起了大佬们提到的 flutterapk 解包果然看到 flutter.so 文件

  3. # ida 分析 libflutter.so

    • ida 打开 so 文件,等待编译完成,然后 Alt + t 打开搜索 text 界面,然后输入 ssl_client 并点击 ok

    • 等待搜索完毕,然后可以看到类似指令,函数偏移地址是 0x5873D4

      x9, xx; "ssl_client"
      

    • 双击此函数,可以看到 ssl_clientssl_server

    • 在此页面点击空格,进入 .text 视图

    • 然后点击菜单栏 option -> General -> , 将下图红框位置改为 4 , 就可以看到字节码了

    • 然后找到函数开头的 10 个字节码

  4. # 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);
    		}
    	});
    }
    • 成功抓到包

参考文章:

​ 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

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

渣渣文 微信支付

微信支付

渣渣文 支付宝

支付宝