爬虫抓包总结

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

猜你喜欢

转载自blog.csdn.net/esabeny/article/details/112579670