【Frida】【Android】08_爬虫之网络通信库okhttp3

🛫 系列文章导航

  • 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950
  • 【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446
  • 【Frida】【Android】03_RPC https://blog.csdn.net/kinghzking/article/details/137050967
  • 【Frida】【Android】04_Objection安装和使用 https://blog.csdn.net/kinghzking/article/details/137071768
  • 【Frida】【Android】05_Objection实战 https://blog.csdn.net/kinghzking/article/details/137071826

▒ 目录 ▒

    • 🛫 系列文章导航
    • 🛫 导读
      • 开发环境
    • 1️⃣ 代码介绍
      • okhttp3主逻辑
      • 拦截器
    • 2️⃣ newCall自吐
      • 自吐frida脚本编写
      • 验证步骤
    • 3️⃣ 拦截器自吐
      • 获取dex文件
      • 自吐frida脚本编写【通用高效】
      • 验证步骤
    • 📖 参考资料

🛫 导读

开发环境

版本号描述
文章日期2024-03-24
操作系统Win11 - 22H222621.2715
node -vv20.10.0
npm -v10.2.3
夜神模拟器7.0.5.8
Android9
python3.9.9
frida16.2.1
frida-tools12.3.0
objection1.11.0

1️⃣ 代码介绍

okhttp3主逻辑

implementation(“com.squareup.okhttp3:okhttp:3.12.0”)。
okhttp3的网络请求流程主要有以下几步:

  • 通过以下代码创建一个okhttpClient对象
  • 码创建一个Request请求对象
  • 端将Request请求封装成Call对象
  • 通过调用Call对象的enqueue()函数产生一次真实的网络请求,该参数接受一个Callback对象,用于处理响应结果。

public class example {// TAG即为日志打印时的标签private static final String TAG = "r0ysue666";// 新建一个Okhttp客户端(不含拦截器等各种参数的OkHttpClient对象)// OkHttpClient client = new OkHttpClient();// 新建一个拦截器OkHttpClient client = new OkHttpClient.Builder().addNetworkInterceptor(new LoggingInterceptor()).build();void run(String url) throws IOException {// 构造requestRequest request = new Request.Builder().url(url).header("token","r0ysue").build();// 发起异步请求client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {call.cancel();}@Overridepublic void onResponse(Call call, Response response) throws IOException {//打印输出Log.d(TAG, response.body().string());}});}
}

拦截器

拦截器是okhttp中的一个重要概念,okhttp通过Interceptor完成监控管理、重写和重试请求。每个网络请求和接收不管是GET还是PUT/POST等数据传输方式都必须经过okhttp3本身存在的五大拦截器,因此Interceptor是一个绝佳的Hook点,可以同时打印输出请求和响应。
下图就是okhttp3自带的五大拦截器:
在这里插入图片描述

拦截器链
下面的代码,是构造拦截器链的过程,可以看到:

  • 通过 addInterceptor() 方法添加的应用拦截器是放在最前面的。
  • 通过 addNetworkInterceptor() 方法添加的网络拦截器,则是在非 WebSocket 请求时,添加在 ConnectInterceptor 和 CallServerInterceptor 之间的。
Response getResponseWithInterceptorChain() throws IOException {// Build a full stack of interceptors.// 收集拦截器的临时列表List<Interceptor> interceptors = new ArrayList<>();// 先添加通过 OkHttpClient.Builder # addInterceptor() 方法添加的拦截器interceptors.addAll(client.interceptors());interceptors.add(retryAndFollowUpInterceptor);interceptors.add(new BridgeInterceptor(client.cookieJar()));interceptors.add(new CacheInterceptor(client.internalCache()));interceptors.add(new ConnectInterceptor(client));if (!forWebSocket) {// 如果不是 WebSocket 请求,// 则添加通过 OkHttpClient.Builder # addNetworkInterceptor() 方法添加的拦截器interceptors.addAll(client.networkInterceptors());}interceptors.add(new CallServerInterceptor(forWebSocket));Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,originalRequest, this, eventListener, client.connectTimeoutMillis(),client.readTimeoutMillis(), client.writeTimeoutMillis());return chain.proceed(originalRequest);
}

从上面我们可以看到.addNetworkInterceptor(new LoggingInterceptor())这样的代码,意思是给okhttp3增加网络拦截器。
LoggingInterceptor对象,将打印请求和响应相关的内容。
拦截器执行结果如下:
在这里插入图片描述

2️⃣ newCall自吐

本篇文章自带的资源是带拦截器的版本,可以查看拦截器运行的效果。
下面的内容,是通过不带拦截器的apk(下载地址:https://download.csdn.net/download/kinghzking/89067530)进行讲解,打印出我们想要的内容。

自吐frida脚本编写

从《源码介绍》中我们可以看出,OkHttpClient.newCall接受了一个request参数,该参数包含了我们关心的主要内容,所以我们直接拦截newCall即可打印出我们想要的结果,代码如下:

    Java.perform(function() {var OkHttpClient = Java.use("okhttp3.OkHttpClient")OkHttpClient.newCall.implementation = function (request) {var result = this.newCall(request)console.log('[newCall] request = ', request.toString())return result};});

验证步骤

  • 通过frida -UF连接
  • 执行上面js语句
  • 点击apk中的发送请求按钮,显示拦截结果。
    效果如下图所示:
    在这里插入图片描述

3️⃣ 拦截器自吐

前文已经说过,拦截器方式,可以更方便的实现请求内容的打印,我们如果将拦截器注入到目标APP中,将更通用而方便。
这种实现有两种方式:

  • LoggingInterceptor这部分代码翻译成JavaScript代码
  • 将编译好的dex通过Frida将注入其他应用中

很明显,第二种更便于代码的编写和理解,我们也将以该方式进行演示。

获取dex文件

  • 下载不带拦截器的apk(下载地址:https://download.csdn.net/download/kinghzking/89067530)
  • 将这个文件解压后得到一个classes.dex
  • 将classes.dex更名为okhttp3logging.dex
    • 也可以直接下载:https://download.csdn.net/download/kinghzking/89068234
  • 将其推送到测试手机的/data/local/tmp目录下
    • adb push okhttp3logging.dex /data/local/tmp
      在这里插入图片描述

自吐frida脚本编写【通用高效】

  • 加载dex:Java.openClassFile
  • 获取LoggingInterceptor类:Java.use
  • 生成LoggingInterceptor对象:MyInterceptor.$new()
  • 获取OkHttpClient内部类Builder
  • 修改Builder.build实现
  • 在networkInterceptors()中增加拦截器LoggingInterceptor对象
    Java.perform(function () {Java.openClassFile("/data/local/tmp/okhttp3logging.dex").load();var MyInterceptor = Java.use("com.r0ysue.okhttp3demo.LoggingInterceptor");var MyInterceptorObj = MyInterceptor.$new();var Builder = Java.use("okhttp3.OkHttpClient$Builder");console.log(Builder);Builder.build.implementation = function () {this.networkInterceptors().add(MyInterceptorObj);return this.build();};console.log("hook_okhttp3...");});

验证步骤

当我们通过frida交互模式,执行了上面代码的时候,发现并不会打印我们想要的结果:
在这里插入图片描述
这是因为,App只有一个全局对象client,一般在App启动的较早时机被创建,如果采用attach模式Hook okhttpClient,大概率会一无所获,因此只能用spawn模式来启动,对应的Frida命令必须使用-f参数。

执行命令:frida -U -f com.r0ysue.okhttp3demo -l hookInteceptor.js
再次点击发送请求按钮,熟悉的okhttpGET:日志又出现了:
在这里插入图片描述

📖 参考资料

  • frida 常见问题和报错https://crifan.github.io/reverse_debug_frida/website/summary_note/common_issue/
  • objection地址:https://github.com/sensepost/objection
  • okhttp3logging.dex https://download.csdn.net/download/kinghzking/89068234
  • okhttp3 读书笔记 https://blog.csdn.net/OneDeveloper/article/details/88381817

ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/585582.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的停车场车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 上图测试结果如下图所示&#xff1a; 2.算法运行软件版本 matlab2022a 3.部分核心程序 image imread(image_test\test.jpg); image2 image;%图…

HUAWEI 华为交换机 配置 Eth-Trunk 接口流量本地优先转发示例(堆叠)

组网需求 说明 S5720I-10X-PWH-SI-AC 和 S5720I-6X-PWH-SI-AC 不支持此配置。 如 图 3-23 所示&#xff0c;为了增加设备的容量采用设备堆叠技术&#xff0c;将 Switch3 和 Switch4通过专用的堆叠电缆链接起来&#xff0c;对外呈现为一台逻辑交换机。为了实现设备间的备份、…

【深耕 Python】Data Science with Python 数据科学(5)Matplotlib可视化(1)

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&#xf…

递归算法讲解(结合内存图)

递归算法 递归是快速排序的基础&#xff0c;所以一定要理解基本概念&#xff01; 递归其实就是一种循环 for循环/while循环&#xff0c;循环的是一个代码块 递归循环&#xff0c;循环的是一个方法 递归的定义&#xff0c;作用&#xff0c;本质 本质&#xff1a;方法不断调用…

2024年04月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2024年04月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…

记录Xshell使用ed25519公钥免密链接SSH

试了半天&#xff0c;Xshell好像没办法导入linux生成的ssh公钥,因此需要以下步骤实现免密登录 结论&#xff0c;在linux公钥文件中&#xff0c;将客户端生成的ed25519公钥加上去即可(一个公钥单独一行) 1.使用Linux生成秘钥文件(不需要输入私钥密码passphrase)或者直接创建一…

开源简单方便功能强大的Devops工具:Goploy

Goploy&#xff1a;加速您的DevOps旅程&#xff0c;拥抱无缝部署——选择Goploy&#xff0c;让您从繁琐的发布与回滚中解放出来&#xff0c;尽享高效、智能与便捷的自动化部署力量&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 现在大部分流行的发布工具功能虽然强…

基于GaN的半导体光学放大器SOA

摘要 基于GaN的材料可覆盖很宽的光谱范围&#xff0c;以紫外、紫、蓝、绿和红波发射的激光二极管已经商业化。基于GaN的半导体光学放大器&#xff08;SOA&#xff09;具有提高激光二极管输出功率的能力&#xff0c;因此SOA将有很多潜在应用。未来需要利用短波、超快脉冲特性的…

Day5-

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

Docker工作流

1.工作流 开发应用编写Dockerfile构建Docker镜像运行Docker容器测试应用发布镜像到Hub迭代更新镜像 2.开发应用 首先你需要创建一个应用&#xff0c;这个应用可以是后端应用或者前端应用&#xff0c;任何语言都可以。 比如&#xff1a;我使用IDEA 创建一个Java后端应用&…

BEV目标检测论文串讲:知识蒸馏(CMKD、TiG-BEV、UniDistill、RadarDistill、CRKD)

大家好&#xff0c;今天和大家介绍五篇知识蒸馏在BEV目标检测中应用的论文。关于知识蒸馏&#xff0c;大家可以看一下这个视频 EfficientML.ai Lecture 9 - Knowledge Distillation (MIT 6.5940, Fall 2023, Zoom)&#xff0c;对常见的知识蒸馏方法进行了很好的介绍。 文章目录…

【Linux 驱动基础】设备树驱动

# 前置知识 在图中&#xff0c;树的主干就是系统总线&#xff0c; IIC 控制器、 SPI 控制器等都是接到系统主线上的分支。其中 IIC1 上接了 AT24C02这个 IIC 设备&#xff0c; DTS 文件的主要功能就是按照图所示的结构来描述板子上的设备信息。 1. Device格式 DTS文件格式 …