1.检测wifi设置http代理
java层可通过这两个api来检测
System.getProperty(“http.proxyHost”)
System.getProperty(“http.proxyPort”);
如何解决呢
通过设置vpn,vpn再连charles即可, vpn可选择postern 设置socket连接charles
为什么
vpn属于网络层协议,所以上面的检测不起作用
注意,需要导入charles证书到系统路径,如果出现sslpaning,还需要过掉sslpaning
如何过sslpaning呢,通过frida脚本过掉即可
function hook_ssl() {
Java.perform(function() {
var ClassName = "com.android.org.conscrypt.Platform";
var Platform = Java.use(ClassName);
var targetMethod = "checkServerTrusted";
var len = Platform[targetMethod].overloads.length;
console.log(len);
for(var i = 0; i < len; ++i) {
Platform[targetMethod].overloads[i].implementation = function () {
console.log("class:", ClassName, "target:", targetMethod, " i:", i, arguments);
//printStack(ClassName + "." + targetMethod);
}
}
});
}
如果是检测vpn呢
奉上检测过VPN检测脚本
function hook_vpn() {
Java.perform(function () {
var string_class = Java.use("java.lang.String")
// 第一种检测VPN的方式
var NetWorkInterface = Java.use("java.net.NetworkInterface")
NetWorkInterface.getName().implementation = function () {
var name = this.getName();
console.log("name: " + name)
if (name == "tun0") {
var result = string_class.$new("rmnet_data1")
console.log("hook result: " + result)
return result
} else {}
return name
}
// 第二种检测VPN的方式
var ConnectivityManager = Java.use("android.net.ConnectivityManager")
ConnectivityManager.getNetWorkCapabilities.implementation = function(arg1){
var result = this.getNetWorkCapabilities(arg1);
console.log("vpn result: " + result)
return null
}
});
}
2.如果是双向验证呢
客户端和服务端同时检验数据的加密和解密
客户端---------> 中间人<-------------服务端
中间人不能解密和加密,怎么办呢
1.首先需要找到相关证书和加密密码
那么怎么找呢
frida脚本
function hook_KeyStore_load() {
Java.perform(function () {
var StringClass = Java.use("java.lang.String");
var KeyStore = Java.use("java.security.KeyStore");
KeyStore.load.overload('java.security.KeyStore$LoadStoreParameter').implementation = function (arg0) {
printStack("KeyStore.load1");
console.log("KeyStore.load1:", arg0);
this.load(arg0);
};
KeyStore.load.overload('java.io.InputStream', '[C').implementation = function (arg0, arg1) {
printStack("KeyStore.load2");
console.log("KeyStore.load2:", arg0, arg1 ? StringClass.$new(arg1) : null);
this.load(arg0, arg1);
};
console.log("hook_KeyStore_load...");
});
}
这样就可以找到证书,如果证书是加密的呢,那么我们需要解密之后的证书再导入到charles中即可
思考
1.如果代码是混淆的呢
可以参考 https://bbs.pediy.com/thread-254114.htm, 主要思路是参数类型特征识别
2.证书是加密的呢
找到加密的地方,解密再导入到抓包工具
3.总结
以上就是常用的抓不到包的解决思路
参考连接 https://www.anquanke.com/post/id/197657#h3-13