You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Frida在Android11实例化okhttp.Request$Builder报错如何绕过非SDK限制

问题原因

Android 9及以上版本引入了非SDK接口限制机制,com.android.okhttp 包下的类属于系统隐藏接口,默认不允许普通应用通过反射访问,你用Frida的Java.use调用该包下类的构造方法时,系统会拦截该反射请求,导致Frida找不到匹配的方法重载,抛出no supported overloads错误。

解决方案

下面提供3种可行的解决方式,按实现难度从低到高排序:

方法1:全局豁免非SDK接口限制(最快捷,推荐新手使用)

Frida可以直接调用系统API解除当前进程的非SDK接口限制,在你原有逻辑最前面加入豁免代码即可,修改后的完整代码如下:

var req = _uri + param;
Java.perform(function(){
    // 先解除非SDK接口限制
    var VMRuntime = Java.use('dalvik.system.VMRuntime');
    var runtime = VMRuntime.getRuntime();
    runtime.setHiddenApiExemptions(['L']); // 传入L前缀表示豁免所有隐藏接口

    // 原有逻辑保持不变
    var OkHttpClient =  Java.use("com.android.okhttp.OkHttpClient");
    var Builder = Java.use("com.android.okhttp.Request$Builder").$new();
    var request = Builder.url(Java.use("java.lang.String").$new(req)).build();
    OkHttpClient.$new().newCall(request).execute();
});

方法2:改用系统公开的HTTP接口实现请求

如果不想修改隐藏接口限制,可以直接使用Android公开的HttpURLConnection类发请求,该类没有访问限制,全版本兼容,示例代码如下:

var req = _uri + param;
Java.perform(function(){
    var URL = Java.use('java.net.URL');
    var url = URL.$new(req);
    var conn = url.openConnection();
    conn.setRequestMethod('GET');
    // 按需添加请求头、超时配置等
    conn.setConnectTimeout(5000);
    conn.setReadTimeout(5000);
    // 执行请求获取响应
    var inputStream = conn.getInputStream();
    // 后续按需读取响应内容
});

方法3:使用目标应用自带的OkHttp库

如果当前Hook的目标应用本身集成了三方OkHttp库,直接调用应用自带的OkHttp类即可,不会触发系统隐藏接口限制:

var req = _uri + param;
Java.perform(function(){
    // 注意类路径是okhttp3的公开路径,不是系统的com.android.okhttp
    var OkHttpClient = Java.use('okhttp3.OkHttpClient');
    var Builder = Java.use('okhttp3.Request$Builder').$new();
    var request = Builder.url(req).build();
    OkHttpClient.$new().newCall(request).execute();
});

内容的提问来源于stack exchange,提问作者NiceMonday

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:04