插件窝 干货文章 frida如何抓apk网络包

frida如何抓apk网络包

Java function var implementation 311    来源:    2025-04-24

使用Frida抓取APK网络包的方法

Frida是一个强大的动态插桩工具,可以用来监控和修改APK的网络请求。以下是几种使用Frida抓取APK网络包的方法:

方法一:Hook Android网络相关API

// 针对HttpURLConnection
Java.perform(function() {
    var URL = Java.use("java.net.URL");
    var HttpURLConnection = Java.use("java.net.HttpURLConnection");

    URL.openConnection.overload().implementation = function() {
        var connection = this.openConnection();
        console.log("[*] URL: " + this.toString());

        // Hook setRequestProperty
        HttpURLConnection.setRequestProperty.implementation = function(key, value) {
            console.log("[*] Request Header: " + key + ": " + value);
            return this.setRequestProperty(key, value);
        };

        return connection;
    };
});

// 针对OkHttp
Java.perform(function() {
    var OkHttpClient = Java.use("okhttp3.OkHttpClient");
    var Request = Java.use("okhttp3.Request");

    OkHttpClient.newCall.implementation = function(request) {
        console.log("[*] Request URL: " + request.url().toString());
        var headers = request.headers();
        for (var i = 0; i < headers.size(); i++) {
            console.log("[*] Header: " + headers.name(i) + ": " + headers.value(i));
        }
        return this.newCall(request);
    };
});

方法二:Hook SSL相关函数(适用于HTTPS)

// Hook SSL上下文初始化
Java.perform(function() {
    var SSLContext = Java.use("javax.net.ssl.SSLContext");

    SSLContext.init.implementation = function(keyManagers, trustManagers, secureRandom) {
        console.log("[*] SSLContext.init() called");
        // 打印调用栈
        console.log(Java.use("android.util.Log").getStackTraceString(
            Java.use("java.lang.Exception").$new()
        ));
        return this.init(keyManagers, trustManagers, secureRandom);
    };
});

// 信任所有证书(用于绕过证书验证)
Java.perform(function() {
    var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");

    TrustManagerImpl.checkServerTrusted.implementation = function(chain, authType, host) {
        console.log("[*] Bypassing SSL verification for: " + host);
        return this.checkServerTrusted(chain, authType, host);
    };
});

方法三:使用Frida配合其他工具

  1. 配合Burp Suite:

    • 在设备上安装Burp CA证书
    • 使用Frida禁用证书固定(pinning)
    • 设置Burp为代理
  2. 配合mitmproxy:

    • 类似Burp的设置方式
    • 可以使用Frida脚本自动设置代理

方法四:Hook底层Socket操作

// Hook Socket读写操作
Java.perform(function() {
    var Socket = Java.use("java.net.Socket");
    var InputStream = Java.use("java.io.InputStream");
    var OutputStream = Java.use("java.io.OutputStream");

    Socket.getInputStream.implementation = function() {
        var inputStream = this.getInputStream();
        return Java.registerClass({
            name: 'com.example.MyInputStream',
            superClass: InputStream,
            methods: {
                read: function(buffer, byteOffset, byteCount) {
                    var ret = this.super.read(buffer, byteOffset, byteCount);
                    if (ret > 0) {
                        var data = Java.array('byte', buffer).slice(byteOffset, byteOffset + ret);
                        console.log("[*] Received data: " + 
                            JSON.stringify(Array.from(new Uint8Array(data))));
                    }
                    return ret;
                }
            }
        }).$new(inputStream);
    };

    Socket.getOutputStream.implementation = function() {
        var outputStream = this.getOutputStream();
        return Java.registerClass({
            name: 'com.example.MyOutputStream',
            superClass: OutputStream,
            methods: {
                write: function(buffer, byteOffset, byteCount) {
                    var data = Java.array('byte', buffer).slice(byteOffset, byteOffset + byteCount);
                    console.log("[*] Sent data: " + 
                        JSON.stringify(Array.from(new Uint8Array(data))));
                    return this.super.write(buffer, byteOffset, byteCount);
                }
            }
        }).$new(outputStream);
    };
});

使用步骤

  1. 安装Frida-server到目标设备
  2. 编写上述脚本保存为network_hook.js
  3. 运行命令:frida -U -l network_hook.js -f com.target.app --no-pause

注意事项

  1. 对于HTTPS流量,可能需要禁用证书固定(pinning)
  2. 某些应用可能使用自定义的加密协议,需要进一步分析
  3. 生产环境的应用可能有反调试措施,需要先绕过

如果需要更详细的网络抓包,建议结合使用Frida和Wireshark/Charles/Burp等专业抓包工具。