免责声明
由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
项目上来了个APP,死活抓不到包,前期尝试使用模拟器走Proxfier,真机走Postem到BURP等等都未果。
众所周知Apk文件本身是一个压缩包,此处apk后缀改为zip解压并在lib目录下发现libflutter.so。
具体分析过程不在此讨论,感兴趣可看
https://www.jianshu.com/p/ada10d2976f2
https://bbs.kanxue.com/thread-261941.htm
言简意赅:我们需要frida加载脚本来绕过证书校验,脚本如下:
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 A9FA 67 03 A9 F8 5F 04 A9 F6 57 05 A9 F4 4F 06 A9 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());
// Add 0x01 because it's a THUMB function
// Otherwise, we would get 'Error: unable to intercept function at 0x9906f8ac; please file a bug'
hook_ssl_verify_result(address);
},
onError: function(reason){
console.log('[!] There was an error scanning memory');
},
onComplete: function() {
console.log("All done")
}
});
}
function main() {
Java.perform(function(){
hookFlutter();
});
}
setImmediate(main);
不同APP的pattern值可能有所不同,查找方法为
1. 将libflutter.so放到IDA当中,ALT+T搜索关键词ssl_client
2. 根据指令x9, xx; "ssl_client",双击点进去,记住此处函数开头为59728C
翻到ssl_client和ssl_server—按空格
3. 然后点击菜单栏 option-> General-> , 将Number of opoode 位置改为4,就可以看到字节码了,找函数开头(59728C)-STRB中间的字节码也就是脚本中的pattern值
4. 随后,打开安卓机器的frida,在电脑上执行
frida -U APP名字 -l .\hook64 (这里直接去掉-f,-U接APP包名)
这里真机使用Postern配置代理将流量指向Burp即可。
坑点:
网上公开文章都是 frida -U -f com.XXX.ntoccDriver -l .\hook64(-f对应的是包名)来hook,此处我加-f hook一直报错,使用frida -U APP名字 -l .\hook64即可。
不要使用模拟器,模拟器hook一直报错,此类需要真机root抓包(专门去咸鱼买了二手一加6)。
真机adb shell,在电脑上无法以root权限运行,运行frida报错,后续真机使用MT管理器终端模拟器执行frida。