抓包是老生常谈的一项重要任务,在android抓包过程中常会遇到各种问题。在对抗激烈的今天,要想顺利抓包并非易事。笔者尝试用一种叫新的插件方法处理遇到的 v*n检测,daili检测等问题,希望可以给各位师傅提供借鉴参考:
一:问题及初步的处理:
目标app:Y29tLnpsa2V0YW5nLm1t v4.9.4
遇到的问题:
image-20230505212044493.png (102.85 KB, 下载次数: 0)
下载附件
2023-5-5 22:18 上传
app进行了外皮恩和代理的检测,你要开小黄鸟或者用热点的方法抓包,程序会自动退出。
解决方法那就用优雅的frida,但是这次我们不用电脑连线的方式,而用zigisk模块的方式加载fridagadget,做到frida的持久化:
1:手机root并安装magisk,这方面的资料很多,百度即可;
2:打钩zygisk,并安装附件模块 Zygisk-zsdk-v3.0.0(按magisk模块的安装方法) ;
https://wwgg.lanzouf.com/ioq9X0usdmze
QQ图片20230505213009.png (112.73 KB, 下载次数: 0)
下载附件
2023-5-5 22:18 上传
QQ图片20230505212856.png (134.87 KB, 下载次数: 0)
下载附件
2023-5-5 22:18 上传
重启下手机
3:安装zsdk配置_1.2.apk,脚本管理软件,运行:
https://wwgg.lanzouf.com/i6pfK0usdmyd
QQ图片20230505213414.png (219.48 KB, 下载次数: 0)
下载附件
2023-5-5 22:18 上传
这玩意的界面分为左右两个部分,先将frida脚本推送到sdcard/download 目录。在软件右侧点选要加载的脚本,软件左侧点选要注入的app(或者反过来也可以)。两个都点红后,会提示注入成功,这时候可以开始fiddler抓包:
QQ图片20230505214125.png (32 KB, 下载次数: 0)
下载附件
2023-5-5 22:18 上传
可以看到,向app服务器发送的https登录包被捕捉到了,app不再报错和要求强制退出。但是在已经安装并迁移好fd证书的情况下,这个包无法被解密,fd的raw详情中看到 A SSLv3-compatible ClientHello handshake was found
二:ssl pinning的最终解决:
造成上面无法解密的原因是ssl pinning,还需要要我们进一步的处理,改写原js代码:
Java.perform(function() {
var NInterface = Java.use("java.net.NetworkInterface");
try {
NInterface.isUp.overload().implementation = function() {
//console.log("Network Down");
return false;
// 在极少数情况下可能会导致连接丢失,所以要小心
}
} catch (err) {
console.error(err);
}
try {
var NInterface = Java.use("java.net.NetworkInterface");
NInterface.getName.overload().implementation = function() {
var IName = this.getName();
if (IName == "tun0" || IName == "ppp0" || IName == "p2p0" || IName == "ccmni0" || IName == "tun") {
console.log("Detected Interface Name : ", JSON.stringify(this.getName()));
return "FuckYou";
}
return this.getName();
}
} catch (err) {
console.error(err);
}
try {
var GetProperty = Java.use("java.lang.System");
GetProperty.getProperty.overload("java.lang.String").implementation = function(getprop) {
if (getprop.indexOf("http.proxyHost") >= 0 || getprop.indexOf("http.proxyPort") >= 0) {
var newprop = "CKMKB"
return this.getProperty.call(this, newprop);
}
return this.getProperty(getprop);
}
} catch (err) {
console.error(err);
}
try {
var NCap = Java.use("android.net.NetworkCapabilities");
NCap.hasTransport.overload("int").implementation = function(values) {
console.log("检测到 HasTransport 检查 ");
if (values == 4)
return false;
else
return this.hasTransport(values);
}
} catch (e) {
console.error(e);
}
})
附件上去除证书锁定的代码,最终代码如下:
function vpn() {
Java.perform(function() {
var NInterface = Java.use("java.net.NetworkInterface");
try {
NInterface.isUp.overload().implementation = function() {
//console.log("Network Down");
return false;
// 在极少数情况下可能会导致连接丢失,所以要小心
}
} catch (err) {
console.error(err);
}
try {
var NInterface = Java.use("java.net.NetworkInterface");
NInterface.getName.overload().implementation = function() {
var IName = this.getName();
if (IName == "tun0" || IName == "ppp0" || IName == "p2p0" || IName == "ccmni0" || IName == "tun") {
console.log("Detected Interface Name : ", JSON.stringify(this.getName()));
return "FuckYou";
}
return this.getName();
}
} catch (err) {
console.error(err);
}
try {
var GetProperty = Java.use("java.lang.System");
GetProperty.getProperty.overload("java.lang.String").implementation = function(getprop) {
if (getprop.indexOf("http.proxyHost") >= 0 || getprop.indexOf("http.proxyPort") >= 0) {
var newprop = "CKMKB"
return this.getProperty.call(this, newprop);
}
return this.getProperty(getprop);
}
} catch (err) {
console.error(err);
}
try {
var NCap = Java.use("android.net.NetworkCapabilities");
NCap.hasTransport.overload("int").implementation = function(values) {
console.log("检测到 HasTransport 检查 ");
if (values == 4)
return false;
else
return this.hasTransport(values);
}
} catch (e) {
console.error(e);
}
})
};
function ssl() {
Java.perform(function() {
var array_list = Java.use("java.util.ArrayList");
var ApiClient = Java.use('com.android.org.conscrypt.TrustManagerImpl');
ApiClient.checkTrustedRecursive.implementation = function(a1, a2, a3, a4, a5, a6) {
var k = array_list.$new();
return k;
}
}, 0);
};
vpn();
ssl()
重新adb 推入sdcard/download 目录,注入。
这下 可以顺利的抓包并解密了,小黄鸟也可以:
QQ图片20230505215821.png (166.55 KB, 下载次数: 0)
下载附件
2023-5-5 22:18 上传
三:总结:
frida在现今的逆向中应用很广,因为他很便捷高效。但对于抓包这经常要操作的任务,将其持久化后将很方便(不用再每次打命令注入,还有一定的隐蔽功能)。而且zsdk配置无需重启就可以直接作业,切换非常方便。另外在fridagadget的同时,依然可以用frida sever进行hook,可以说具有很大的灵活性!