【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.mzph.cn/news/786524.shtml

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

相关文章

编译和链接(基础速通版)

翻译环境和运行环境 前提解释 电脑是不能直接执行C语言的程序代码的&#xff0c;所依赖的是翻译环境进行一个源代码运行的时候需要经过翻译环境和运行环境的处理&#xff0c;才能得到你需要的可运行程序。 这里是源文件&#xff0c;也就是 .c文件&#xff0c;通过翻译环境得…

图解PyTorch中的torch.gather函数和 scatter 函数

前言 torch.gather在目前基于 transformer or query based 的目标检测中&#xff0c;在最后获取目标结果时&#xff0c;经常用到。 这里记录下用法&#xff0c;防止之后又忘了。 介绍 torch.gather 官方文档对torch.gather()的定义非常简洁 定义&#xff1a;从原tensor中获…

Ubuntu joystick 测试手柄 xbox

Ubuntu joystick 测试手柄 xbox 测试使用Ubuntu20.04 测试环境在工控机 安装测试 实际测试使用的手柄是北通阿修罗2pro 兼容xbox Ubuntu20.04主机 连接手柄或者无线接收器后查看是否已经检测到&#xff1a; ls /dev/input找到输入中的 js0 即为手柄输入 需要安装joysti…

注意力机制篇 | YOLOv8改进之添加DAT注意力机制

前言:Hello大家好,我是小哥谈。DAT(Vision Transformer with Deformable Attention)是一种引入了可变形注意力机制的视觉Transformer。在训练算法模型的时候,通过引入可变形注意力机制,改进了视觉Transformer的效率和性能,使其在处理复杂的视觉任务时更加高效和准确。�…

css酷炫边框

边框一 .leftClass {background: #000;/* -webkit-animation: twinkling 1s infinite ease-in-out; 1秒钟的开始结束都慢的无限次动画 */ } .leftClass::before {content: "";width: 104%;height: 102%;border-radius: 8px;background-image: linear-gradient(var(…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

柔性数组详细讲解

动态内存函数的使用和综合实践-malloc&#xff0c;free&#xff0c;realloc&#xff0c;calloc-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137075045 柔性数组存在的意义 柔性数组在编程语言中指的是可以动态调整大小的数组。相比固定大小的数组&#…

STL容器的一些操作(常用的,不全)

目录 string 1.string的一些创建 2.string 的读入和输出&#xff1a; 3.string的一些操作 4.彻底清空string 容器的函数 vector 1.vector的一些创建&#xff1a; 2.vector的一些操作&#xff1a; 3.vector的彻底清空并释放内存&#xff1a; queue 循环队列&#xff1…

兑换码生成算法

兑换码生成算法 兑换码生成算法1.兑换码的需求2.算法分析2.重兑校验算法3.防刷校验算法 3.算法实现 兑换码生成算法 兑换码生成通常涉及在特定场景下为用户提供特定产品或服务的权益或礼品&#xff0c;典型的应用场景包括优惠券、礼品卡、会员权益等。 1.兑换码的需求 要求如…

Pointnet++分类和分割数据集准备和实验复现

5.分类数据集Modelnet40及可视化 Modelnet40分类数据集 原始的modelnet40是off文件&#xff0c;是cad模型 OFF文件是一种用于存储三维对象信息的文件格式&#xff0c;全称为"Object File Format"。它主要用于存储几何体的顶点、边和面信息&#xff0c;以及可能的颜…

面对复杂多变的网络攻击,企业应如何守护网络安全

企业上云&#xff0c;即越来越多的企业把业务和数据&#xff0c;迁移到云端。随着云计算、大数据、物联网、人工智能等技术的发展&#xff0c;用户、应用程序和数据无处不在&#xff0c;企业之间的业务边界逐渐被打破&#xff0c;网络攻击愈演愈烈&#xff0c;手段更为多。 当前…

uni app 扫雷

闲来无聊。做个扫雷玩玩吧&#xff0c;点击打开&#xff0c;长按标记&#xff0c;标记的点击两次或长按取消标记。所有打开结束 <template><view class"page_main"><view class"add_button" style"width: 100vw; margin-bottom: 20r…

Docker容器监控之CAdvisor+InfluxDB+Granfana

介绍&#xff1a;CAdvisor监控收集InfluxDB存储数据Granfana展示图表 目录 1、新建3件套组合的docker-compose.yml 2、查看三个服务容器是否启动 3、浏览cAdvisor收集服务&#xff0c;http://ip:8080/ 4、浏览influxdb存储服务&#xff0c;http://ip:8083/ 5、浏览grafan…

如何利用CSS实现文字滚动效果

1. 使用CSS3的animation属性 CSS3的animation属性可以让元素在一段时间内不停地播放某个动画效果。我们可以利用这个特性来实现文字滚动效果。 我们需要定义一个包含所有需要滚动的文本的容器元素。比如&#xff1a; <div class"scroll-container"><p>…

JAV八股--redis

如何保证Redis和数据库数据一致性 关于异步通知中消息队列和Canal的内容。 redisson实现的分布式锁的主从一致性 明天继续深入看这个系列问题 介绍IO复用模型

【机器学习300问】59、计算图是如何帮助人们理解反向传播的?

在学习神经网络的时候&#xff0c;势必会学到误差反向传播&#xff0c;它对于神经网络的意义极其重大&#xff0c;它是训练多层前馈神经网络的核心算法&#xff0c;也是机器学习和深度学习领域中最为重要的算法之一。要正确理解误差反向传播&#xff0c;不妨借助一个工具——计…

代码随想录算法训练营第24天|理论基础 |77. 组合

理论基础 jia其实在讲解二叉树的时候&#xff0c;就给大家介绍过回溯&#xff0c;这次正式开启回溯算法&#xff0c;大家可以先看视频&#xff0c;对回溯算法有一个整体的了解。 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理…

深入理解数据结构——堆

前言&#xff1a; 在前面我们已经学习了数据结构的基础操作&#xff1a;顺序表和链表及其相关内容&#xff0c;今天我们来学一点有些难度的知识——数据结构中的二叉树&#xff0c;今天我们先来学习二叉树中堆的知识&#xff0c;这部分内容还是非常有意思的&#xff0c;下面我们…

前端秘法番外篇----学完Web API,前端才能算真正的入门

目录 一.引言 二.元素的获取和事件 1.获取元素 2.各种事件 2.1点击事件 2.2键盘事件 三.获取&修改操作 1.获取修改元素属性 2.修改表单属性 2.1暂停播放键的转换 2.2计数器的实现 2.3全选的实现 3.样式操作 3.1行内样式操作 3.2类名样式操作 四.节点 1.创…

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

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