【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

news2024/11/28 11:39:32

🛫 系列文章导航

  • 【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️⃣ HttpURLConnection基础开发示例
    • 2️⃣ “自吐”脚本分析
      • 准备工作
      • URL
      • HttpURLConnection分析
      • 定位HttpURLConnection真实类名
      • HttpsURLConnectionImpl分析
    • 3️⃣ “自吐”脚本编写和验证
    • 📖 参考资料

🛫 导读

开发环境

版本号描述
文章日期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️⃣ HttpURLConnection基础开发示例

Android系统自带HTTP网络通信库HttpURLConnection,下面通过三个类演示其使用方法:

  • import java.net.URL;
  • import java.net.HttpURLConnection;
  • import java.io.InputStream;

请求流程如下:

  • 获取HttpURLConnection实例
    通过传入目标网络地址来新建一个URL对象,然后通过openConnection()函数获取一个HttpURLConnection实例。
  • 设置HTTP请求头和参数信息
    • 通过setRequestMethod()函数设置HTTP请求方法(一般有GET与POST
      两种);
    • 通过setRequestProperty()设置请求参数;
    • 通过setConnectionTimeout()函数设置连接超时时间;
    • 通过setReadTimeout()函数设置接收超时时间。
  • 执行请求
    执行connection.connect(),进行http请求。
  • 处理返回结果(输入流)
    在设置完请求头和请求参数后,通过调用connection.getInputStream()函数与服务器连接并获取到服务器返回的输入流,对输入流完成读取。
  • 关闭连接
    在一个连接完成后,通过调用disconnection()方法将HTTP连接关闭掉。
    URL url = new URL("https://www.baidu.com");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");
    connection.setRequestProperty("token","r0ysue666");
    connection.setConnectTimeout(8000);
    connection.setReadTimeout(8000);
    connection.connect(); // 开始连接
    InputStream in = connection.getInputStream();
    //if(in.available() > 0){

    // 每次写入1024字节
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
    StringBuffer sb = new StringBuffer();
    while ((in.read(buffer)) != -1) {
        sb.append(new String(buffer));
    }
    Log.d("demo", sb.toString());
    connection.disconnect();

2️⃣ “自吐”脚本分析

准备工作

  • 安装测试APP:com.roysue.httpurlconnectiondemo
  • 启动frida-server
  • 启动Objection:objection -g com.roysue.httpurlconnectiondemo explore

URL

在后,先使用Objection来Hook整个URL类。Objection本身的watch class命令虽然能够Hook一个类的全部函数,但是无法Hook一个类的构造函数,因此这里手动使用如下命令Hook URL类的构造函数:
android hooking watch class_method java.net.URL.$init --dump-backtrace --dump-return --dump-args
在这里插入图片描述

示例中,定时请求baidu,所以,objection中,会定时打印如下内容:
在这里插入图片描述
我们可以看出,APP会触发三个构造函数,而java.net.URL.URL(java.lang.String)就是我们demo中所调用的函数,其中会有参数https://www.baidu.com

HttpURLConnection分析

根据我们在上一步整理的关键收发包函数会发现剩下的都是HttpURLConnection类中的函数,因此只要使用如下命令去watch整个HttpURLConnection类的所有函数即可,当然不能忘了构造函数。

  • android hooking watch class java.net.HttpURLConnection
  • android hooking watch class_method java.net.HttpURLConnection.$init

当Hook上这个类的所有函数后会发现只有构造函数和一个java.net.HttpURLConnection.getFollowRedirects()函数被调用了,其结果如图所示:
在这里插入图片描述
这和我们的预期(会hook很多函数,如setRequestMethod等)是不符的。

我们通过android heap search instances java.net.HttpURLConnection命令,无法找到任何HttpURLConnection的对象。也就是说,hook的对象是不对的。
在这里插入图片描述

定位HttpURLConnection真实类名

通过以下网站:

  • https://www.apiref.com/android-zh/java/net/HttpURLConnection.html#
  • https://www.android-doc.com/reference/java/net/HttpURLConnection.html
    我们可以看出,HttpURLConnection是个抽象类,也就是说url.openConnection()获得的对象,很可能是其子类。
    在这里插入图片描述

我们可以通过frida获取其对象内容:

  1. 通过frida -UF连接
  2. 执行下面js语句
  3. 最终可以发现真实的类是com.android.okhttp.internal.huc.HttpsURLConnectionImpl
    在这里插入图片描述
    Java.perform(function(){
        var URL = Java.use('java.net.URL')
        URL.openConnection.overload().implementation = function(){
            var result = this.openConnection()
            console.log('openConnection() returnType =>',result.$className)
            return result
        }
    })

ps: 也可以通过Android Studio调试源码确认该类型。

HttpsURLConnectionImpl分析

回到objection,我们hook该类:
android hooking watch class com.android.okhttp.internal.huc.HttpsURLConnectionImpl
最终会发现Demo使用的每个函数都被调用到了,如下图所示:
在这里插入图片描述

3️⃣ “自吐”脚本编写和验证

结合上面的分析,我们可以写如下代码进行HttpURLConnection“自吐”:
运行测试结果如下:
在这里插入图片描述


function main(){
    Java.perform(function(){
        var URL = Java.use('java.net.URL')
        URL.$init.overload('java.lang.String').implementation = function(urlstr){
            console.log('url => ',urlstr)
            var result = this.$init(urlstr)
            return result
        }
        
        var HttpURLConnectionImpl = Java.use('com.android.okhttp.internal.huc.HttpURLConnectionImpl')
        HttpURLConnectionImpl.setRequestProperty.implementation = function(key,value){
            var result = this.setRequestProperty(key,value)
            console.log('setRequestProperty => ',key,':',value)
            return result
        }
    })
}

setImmediate(main)

📖 参考资料

  • frida 常见问题和报错https://crifan.github.io/reverse_debug_frida/website/summary_note/common_issue/
  • objection地址:https://github.com/sensepost/objection

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

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

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

相关文章

结构体与位段的定义以及在内存中的存储

目录 结构体的声明 完全声明 不完全声明 结构体变量的定义和初始化 结构体的嵌套 结构体成员的直接访问和间接访问 结构体的自引用 typedef对结构体类型重命名 结构体内存对齐 对齐规则 练习 为什么存在内存对齐 修改默认对齐数 结构体传参 结构体实现位段 位段…

代码膨胀会破坏开发操作吗,它将如何影响编译时间?

Incredibuild 正潜心研究公司以及客户的未来发展趋势。 过去的一年举步维艰,但聪明的企业总是能够抓住机遇,将大部分业务自动化,保持敏捷度和竞争力,最佳的案例就是游戏工作室。这一年来,用户对新游戏或新版本的期待达…

Python 基础:标准库 -- math (数学函数)

1. 官方文档 math --- 数学函数 — Python 3.12.2 文档 cmath --- 关于复数的数学函数 — Python 3.12.2 文档 Python 中,可以使用内置的数学运算符,例如加法 ()、减法 (-)、除法 (/) 和乘法 (*) 进行简单的数学运算。不过,更高级的运算&a…

Python | Leetcode Python题解之第3题无重复字符的最长子串

题目: 题解: class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 哈希集合,记录每个字符是否出现过occ set()n len(s)# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没…

Dubbo 原理及使用详解

嗨,亲爱的童鞋们!欢迎来到这次关于Dubbo的探险之旅。在编程的世界里,我们时常需要处理分布式系统的问题,而Dubbo作为一款开源的分布式服务框架,正是为了解决这类问题而生。本篇博客将深入浅出,带你领略Dubb…

transformers微调模型后使用pieline调用无法预测列表文本

初学transformers框架 使用trainer简单训练一个文本分类模型三个epoch后 使用piepline调用model 和tokenizer后 发现 传入列表文本后 输出就变得不正常了,为么子哇 如下图

常见的DC电源模块故障及解决方法

BOSHIDA 常见的DC电源模块故障及解决方法 DC电源模块广泛应用于各种电子设备中,为其提供稳定的直流电源。然而,由于长期使用或其他原因,DC电源模块有时会出现故障。本文将介绍一些常见的DC电源模块故障及相应的解决方法。 1. 输出电压异常&a…

如何使用免费的ChatGpt3.5

如何使用免费的ChatGpt 最近免费的gpt3.5很多都不怎么行了实在是太给力了尾声 最近免费的gpt3.5很多都不怎么行了 原因是什么呢?因为openai已经取消了免费的5刀赠送,那么这些人手上的免费的sses-key 用完后,就基本上全军覆没了,再…

探索http-vue-loader的奥秘:原理、使用方法、在Vue开发中的应用

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

SpringSecurity学习总结(三更草堂)

SpringSecurity安全框架的核心功能是认证和授权: 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。 授权:经过认证后判断当前用户是否具有进行某个操作的权限。 一般来说中大型的项目都是使用SpringSecurit…

无尘卷轴布:保障洁净环境的关键利器

在现代科技高度发达的今天,许多行业对于环境洁净度的要求越来越严格,比如半导体制造、医疗器械生产等。而在这些领域中,无尘卷轴布成为了一项至关重要的辅助工具,其独特的设计和材质特性,为保障洁净环境做出了突出贡献…

如何备份 Outline 导出的 Markdown 文件

前面,我撰写了两篇文章,介绍了: 《如何在本地环境安装 Outline》《使用 Outline 搭建企业、个人知识库面临的问题》 今天,我们继续这个话题。使用 Outline 搭建知识库,如何备份自己知识库内的资料。 Outline 底层使用…

【教学类-09-03】20240401细线迷宫图02(A4横版一页-2份竖版)

作品展示: 背景需求: 【教学类-09-02】20240331细线迷宫图01(A4横版一页1份横版)-CSDN博客文章浏览阅读779次,点赞28次,收藏6次。【教学类-09-02】20240331细线迷宫图01(A4横版一页1份横版&…

Sentinel入门Controller自动定义为资源

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流…

【opencv】教程代码 —ShapeDescriptors

检测和显示图像的轮廓 在图像中搜索并显示轮廓边缘多边形、轮廓矩形和包围圆 获取包含检测到的轮廓的椭圆和旋转的矩形 图像轮廓检测和轮廓凸包 计算图像中的轮廓的矩(包括面积、重心等)并进行显示 创建和绘制一个多边形图像然后计算并显示图像上每个点到…

使用Vue3组件的计算属性

计算属性在Vue.js的computed选项中定义,它可以在模板上进行双向数据绑定以展示出结果或者进行其他处理。 通常用户会在模板中定义表达式,非常便利,Vue.js的设计初衷也是用于简单运算。但是在模板中放入太多的逻辑,会让模板变得臃…

项目管理中,项目延期的这些原因,你经历过几个

在项目管理过程中,项目延期是一种常见的现象,深入了解项目延期的原因,并制定相应的应对策略,对于提高项目管理的效率和成功率至关重要。 项目延期的主要原因: 1、估计不足:在项目初期,对项目…

iOS网络抓包工具大曝光:深入了解常用工具的工作原理与应用场景

摘要 本文将深入探讨iOS平台上常用的网络抓包工具,包括Charles、克魔助手、Thor和Http Catcher,以及通过SSH连接进行抓包的方法。此外,还介绍了克魔开发助手作为iOS应用开发的辅助工具,提供的全方面性能监控和调试功能。 在iOS应…

DC-DC芯片D1509, 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是芯谷科技推出的一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片,其输出电压有固定3.3V、5.0V和12.0V的版本,…

Pygame基础8-碰撞

Collisions 在Pygame中,我们使用矩形来移动物体,并且用矩形检测碰撞。 colliderect检测两个矩形是否碰撞,但是没法确定碰撞的方向。 Rect1.colliderect(Rect2) # collision -> return Ture # else -> return Falsecollidepoint可以…