news 2026/7/12 0:21:59

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
利用 Frida 动态拦截 OkHttp 请求与响应数据

1. 为什么需要拦截OkHttp请求

在移动应用开发和安全测试中,经常需要分析应用与服务器之间的网络通信。OkHttp作为Android平台最流行的HTTP客户端库,被广泛应用于各类APP中。通过拦截OkHttp请求和响应,我们可以:

  • 调试网络问题:查看实际发送的请求内容和服务器返回的原始数据
  • 安全测试:检查敏感信息是否明文传输,验证加密措施是否到位
  • 逆向分析:理解APP与服务器的交互逻辑,分析API调用方式

传统做法是在代码中插入日志语句,但这需要修改和重新编译APP。使用Frida进行动态拦截的优势在于:

  1. 无需修改源码:直接在运行时注入代码
  2. 实时性强:可以随时调整拦截逻辑
  3. 适用范围广:即使没有APP源代码也能使用

2. Frida环境准备

2.1 安装Frida工具链

首先需要在开发机上安装Frida客户端:

pip install frida-tools

对于Android设备,需要根据CPU架构选择对应的frida-server:

  • ARM设备:frida-server-xx.x.x-android-arm.xz
  • ARM64设备:frida-server-xx.x.x-android-arm64.xz
  • x86设备: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的设计采用了拦截器链模式,这是我们可以进行请求拦截的关键。当应用发起网络请求时,数据会依次经过多个拦截器:

  1. 应用拦截器(Application Interceptors)
  2. 网络拦截器(Network Interceptors)
  3. 实际网络请求
  4. 响应返回路径

我们的Frida脚本主要通过以下方式实现拦截:

  1. 创建自定义拦截器:实现Interceptor接口的intercept方法
  2. 注入到拦截器链:通过重写OkHttpClient.Builder的build方法
  3. 打印请求响应信息:在拦截器中获取并输出关键数据

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; } } } });

这段代码实现了完整的请求和响应拦截逻辑,特别注意:

  1. 请求体需要使用okio.Buffer来读取
  2. 响应体.string()方法只能调用一次,需要重建响应对象
  3. 完善的错误处理保证脚本稳定性

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 常见问题解决

  1. 脚本不生效

    • 确认目标APP确实使用OkHttp
    • 检查frida-server版本是否匹配
    • 尝试不同的注入时机(-f参数启动应用)
  2. 乱码问题

    • 非文本响应使用readByteString()代替readUtf8()
    • 检查Content-Type头部确定编码格式
  3. 性能影响

    • 避免在拦截器中执行耗时操作
    • 生产环境使用后记得卸载脚本

7. 与其他工具的对比

相比其他抓包方案,Frida+OkHttp拦截有以下特点:

工具/方法优点缺点
Frida拦截无需root,可修改数据需要逆向分析能力
Charles代理简单易用,可视化好需要处理证书校验
Wireshark底层抓包,全面无法解密HTTPS
代码插桩精准控制需要源码和重新编译

在实际项目中,我通常会根据具体需求组合使用多种工具。对于OkHttp应用,Frida拦截往往是最直接有效的方式,特别是当应用使用了证书绑定等安全措施时。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/23 12:31:28

Phi-3 Forest Laboratory 创意编程:使用Processing进行交互式艺术创作

Phi-3 Forest Laboratory 创意编程&#xff1a;使用Processing进行交互式艺术创作 你有没有想过&#xff0c;用几句话就让电脑屏幕上下起一场雨&#xff0c;或者让一群粒子像萤火虫一样飞舞&#xff1f;以前&#xff0c;这需要你懂编程&#xff0c;懂数学&#xff0c;还得花不…

作者头像 李华
网站建设 2026/3/23 12:30:31

Qwen3-ASR-1.7B开发入门:基于VS Code的调试技巧全解析

Qwen3-ASR-1.7B开发入门&#xff1a;基于VS Code的调试技巧全解析 语音识别开发中最让人头疼的不是写代码&#xff0c;而是调试时那种"明明看起来没问题&#xff0c;就是不出结果"的无力感。本文将带你用VS Code彻底解决Qwen3-ASR-1.7B的开发调试难题。 作为一名语音…

作者头像 李华
网站建设 2026/3/23 12:29:30

C语言嵌入式面向对象实践:封装、继承与多态

1. C语言面向对象编程的工程实践方法C语言作为嵌入式系统开发的基石语言&#xff0c;其简洁性、可预测性和对硬件的直接控制能力使其在资源受限环境中具有不可替代的地位。然而&#xff0c;随着嵌入式软件复杂度持续提升&#xff0c;传统面向过程的编程范式在模块化设计、代码复…

作者头像 李华
网站建设 2026/3/23 12:26:08

FRCRN(单麦-16k)部署教程:国产统信UOS/麒麟系统兼容性验证

FRCRN&#xff08;单麦-16k&#xff09;部署教程&#xff1a;国产统信UOS/麒麟系统兼容性验证 如果你正在使用国产操作系统&#xff0c;比如统信UOS或者麒麟&#xff0c;并且需要处理嘈杂的录音文件&#xff0c;那么这篇文章就是为你准备的。我们经常遇到这样的问题&#xff1…

作者头像 李华
网站建设 2026/3/23 12:25:48

SuperMap路径分析服务参数详解:除了起点终点,TransportationAnalystParameter里这些设置能让你的规划更精准

SuperMap路径分析服务参数深度优化指南&#xff1a;从基础规划到精准决策 在物流配送、应急响应和出行导航等实际业务场景中&#xff0c;简单的起点到终点路径规划往往难以满足复杂需求。我曾参与过一个城市冷链物流项目&#xff0c;初期直接使用默认参数生成的路径导致运输时间…

作者头像 李华