利用 Frida 动态拦截 OkHttp 请求与响应数据

发布时间:2026/6/30 13:46:34

利用 Frida 动态拦截 OkHttp 请求与响应数据 1. 为什么需要拦截OkHttp请求在移动应用开发和安全测试中经常需要分析应用与服务器之间的网络通信。OkHttp作为Android平台最流行的HTTP客户端库被广泛应用于各类APP中。通过拦截OkHttp请求和响应我们可以调试网络问题查看实际发送的请求内容和服务器返回的原始数据安全测试检查敏感信息是否明文传输验证加密措施是否到位逆向分析理解APP与服务器的交互逻辑分析API调用方式传统做法是在代码中插入日志语句但这需要修改和重新编译APP。使用Frida进行动态拦截的优势在于无需修改源码直接在运行时注入代码实时性强可以随时调整拦截逻辑适用范围广即使没有APP源代码也能使用2. Frida环境准备2.1 安装Frida工具链首先需要在开发机上安装Frida客户端pip install frida-tools对于Android设备需要根据CPU架构选择对应的frida-serverARM设备frida-server-xx.x.x-android-arm.xzARM64设备frida-server-xx.x.x-android-arm64.xzx86设备frida-server-xx.x.x-android-x86.xz下载后解压并推送到设备adb push frida-server /data/local/tmp/ adb shell chmod 755 /data/local/tmp/frida-server adb shell /data/local/tmp/frida-server 2.2 确认设备连接运行以下命令检查设备是否就绪frida-ps -U如果能看到设备上运行的进程列表说明环境配置成功。3. 拦截OkHttp请求的核心原理OkHttp的设计采用了拦截器链模式这是我们可以进行请求拦截的关键。当应用发起网络请求时数据会依次经过多个拦截器应用拦截器Application Interceptors网络拦截器Network Interceptors实际网络请求响应返回路径我们的Frida脚本主要通过以下方式实现拦截创建自定义拦截器实现Interceptor接口的intercept方法注入到拦截器链通过重写OkHttpClient.Builder的build方法打印请求响应信息在拦截器中获取并输出关键数据4. 完整拦截脚本解析以下是完整的Frida脚本我们分段解析关键部分4.1 基础类引入Java.perform(function () { var OkHttpClient Java.use(okhttp3.OkHttpClient); var OkHttpClientBuilder Java.use(okhttp3.OkHttpClient$Builder); var Interceptor Java.use(okhttp3.Interceptor); var Response Java.use(okhttp3.Response); var ResponseBody Java.use(okhttp3.ResponseBody);这部分引入了OkHttp相关的核心类为后续操作打下基础。4.2 自定义拦截器实现var MyInterceptor Java.registerClass({ name: com.custom.MyInterceptor, implements: [Interceptor], methods: { intercept: function (chain) { try { // 获取请求对象 var request chain.request(); // 打印请求基本信息 var url request.url().toString(); var method request.method(); console.log([*] OkHttp Request: method url); // 打印请求头 var headers request.headers(); for (var i 0; i headers.size(); i) { console.log([*] Header: headers.name(i) : headers.value(i)); } // 打印请求体 var body request.body(); if (body) { var buffer Java.use(okio.Buffer).$new(); body.writeTo(buffer); var requestBody buffer.readUtf8(); console.log([*] Body: requestBody); } // 继续请求并获取响应 var response chain.proceed(request); // 打印响应体 var responseBody response.body().string(); console.log([*] OkHttp Response: responseBody); // 重建响应对象 var newResponseBody ResponseBody.create( response.body().contentType(), responseBody ); var newResponse response.newBuilder() .body(newResponseBody) .build(); return newResponse; } catch (e) { console.log(Interceptor Error: e); throw e; } } } });这段代码实现了完整的请求和响应拦截逻辑特别注意请求体需要使用okio.Buffer来读取响应体.string()方法只能调用一次需要重建响应对象完善的错误处理保证脚本稳定性4.3 注入拦截器OkHttpClientBuilder.build.overload().implementation function () { console.log([*] Adding interceptor to OkHttpClient); this.addInterceptor(MyInterceptor.$new()); return this.build(); };这里重写了Builder的build方法确保每个新建的OkHttpClient都会包含我们的拦截器。5. 实际使用示例将上述脚本保存为okhttp_intercept.js然后执行frida -U -l okhttp_intercept.js -n com.target.app成功注入后当目标应用发起网络请求时控制台会输出类似信息[*] OkHttp Request: GET https://api.example.com/users [*] Header: Accept: application/json [*] Header: Authorization: Bearer xxxx [*] OkHttp Response: {users:[{id:1,name:John}]}6. 高级技巧与注意事项6.1 过滤特定请求可以通过修改拦截器逻辑只关注特定请求intercept: function (chain) { var request chain.request(); var url request.url().toString(); // 只拦截包含特定路径的请求 if (!url.includes(/api/)) { return chain.proceed(request); } // 其余处理逻辑... }6.2 修改请求和响应拦截器不仅可以查看数据还能修改// 修改请求头 var newRequest request.newBuilder() .header(X-Injected, true) .build(); // 修改响应体 var modifiedResponse responseBody.replace(John, Modified); var newResponseBody ResponseBody.create( response.body().contentType(), modifiedResponse );6.3 常见问题解决脚本不生效确认目标APP确实使用OkHttp检查frida-server版本是否匹配尝试不同的注入时机-f参数启动应用乱码问题非文本响应使用readByteString()代替readUtf8()检查Content-Type头部确定编码格式性能影响避免在拦截器中执行耗时操作生产环境使用后记得卸载脚本7. 与其他工具的对比相比其他抓包方案FridaOkHttp拦截有以下特点工具/方法优点缺点Frida拦截无需root可修改数据需要逆向分析能力Charles代理简单易用可视化好需要处理证书校验Wireshark底层抓包全面无法解密HTTPS代码插桩精准控制需要源码和重新编译在实际项目中我通常会根据具体需求组合使用多种工具。对于OkHttp应用Frida拦截往往是最直接有效的方式特别是当应用使用了证书绑定等安全措施时。

相关新闻