用Frida给安卓App抓HTTPS包的实操手记
环境准备最近帮朋友逆向一个加壳的金融App,常规抓包工具全部失效(OkHttp pinning + 自研证书校验),最后靠Frida绕过才搞定。把流程整理出来分享下。
[*]机器:root过的安卓机或者模拟器(推荐WSA、雷电模拟器)
[*]PC端:装Python 3.10+,pip install frida-tools
[*]安卓端:push对应架构的frida-server到/data/local/tmp,chmod 755后跑起来
定位关键函数
先用jadx把apk反编译,搜索SSLContext、okhttp3.CertificatePinner这些关键字,定位到自定义的校验类。我这次碰到的App用了Conscrypt+OkHttp双层校验,关键类叫 com.xxx.security.PinningManager。
Hook脚本
Java.perform(function(){
var Pin = Java.use('com.xxx.security.PinningManager');
Pin.checkServerTrusted.implementation = function(){
console.log('[+] bypass pinning');
return;
};
var SSL = Java.use('javax.net.ssl.SSLContext');
SSL.init.implementation = function(a,b,c){
console.log('[+] SSLContext.init bypassed');
this.init(null, null, null);
};
});
跑起来:frida -U -l hook.js -f com.xxx.app --no-pause。然后mbedtls或BoringSSL的native pinning如果还在拦,可以再用frida-trace跟一下SSL_CTX_set_verify,hook掉返回值就行。
几个坑
第一,安卓10以上SELinux策略变严,frida-server要rename才能躲过检测;第二,新版OkHttp 4.x的pinning走的是hash比对,hook checkServerTrusted不够,要hook CertificatePinner.check$okhttp;第三,遇到Native SSL pinning只能上frida-trace定位BoringSSL函数,hook的是符号不是Java层。
https://www.metk.cn/img/posts/frida_https_hook.jpg 这篇干货,比那些只有命令没有解释的强太多了。 看完最大的感受是基础知识还是要扎实,不然工具报错都不知道怎么查。 实战出来的经验和文档里写的完全是两码事,楼主这个很真实。 同求后续,想知道绕过之后怎么稳定保持,重签名这块一直搞不定。 我这边环境是Mac,有些步骤要调整,回头补个差异说明。 试了下你说的第二种方法,成功率更高,推荐。 这个流程我在真机上验证过,确实可行,注意备份就行。 讲得挺细的,不过我建议加一句免责,这东西容易被拿去做坏事。 这篇质量很高,建议加精。