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
相关产品推荐
相关产品推荐

