关于Flutter框架开发的安卓App的HTTPS抓包解决方案

如何确定目标APP是否为Flutter开发?

APP的apk包中包含libflutter.so即可确定是Flutter开发的

为什么普通方式抓不到HTTPS包呢?

  • 它不走系统代理
  • 它不支持设置代理
  • 它不信任系统证书
  • 它证书校验写死在so文件里,所以导致JustTrustMe,SSLUnpinning等模块完全失效

面临的问题?

  • 证书校验
  • 不走代理

解决方案:

针对不走代理我们可以使用基于VPN模式的Postern,也可以使用基于iptablesProxyDroid,这两款APP,当然不止这两款APP可以用,只是这两款比较傻瓜式操作,简单明了.

针对证书校验问题,就是用frida去hook libflutter.so中的函数,具体参考看雪论坛大佬的帖子:https://bbs.pediy.com/thread-261941.htm 在此贴一下我的frida脚本代码,大家遇到可以试试,不行的话就自己用ida扣一下对应的pattern,hook成功后每次请求会有对应输出.

脚本代码如下:

//frida -UF -l hook.js
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 03 05 D1 FD 7B 0F A9 9A E3 05 94 08 0A 80 52 48 00 00 39 16 54 40 F9 56 07 00 B4 C8 02 40 F9 08 07 00 B4";
    var pattern = "FF 03 05 D1 FD 7B 0F A9 FA 67 10 A9 F8 5F 11 A9 F6 57 12 A9 F4 4F 13 A9 08 0A 80 52 48 00 00 39 16 54 40 F9";
    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")
        }
    });
}

function main() {
    hookFlutter();
}

setImmediate(main);


hook成功后,开启ProxyDroid将流量转发到本地charles即可看到解密的HTTPS流量.

未经允许不得转载:鹞之神乐 » 关于Flutter框架开发的安卓App的HTTPS抓包解决方案

赞 (1) 打赏

评论

8+2=

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏