当前位置: 首页 > news >正文

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

🛫 系列文章导航

  • 【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: 文章中内容仅用于技术交流,请勿用于违规违法行为。

相关文章:

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

🛫 系列文章导航 【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://bl…...

算法2.6基数排序

基数排序 属于分配式排序,又称桶子法,通过键值的各个位上的值,将要排序的元素分配至某些桶中,达到排序的作用. 基数排序属于稳定性排序,是效率高的稳定性排序法 是桶排序的扩展,将整数按照位数进行切割,再按各个位数进行比较 是用空间换时间的经典算法 在使用8kw个数据进行…...

redis -List

一,List(列表) 1,所应用场景 list实际上是一个链表,before Node after , left, right 都可以插入值如果key不存在,则创建新的链表如果key存在,新增内容如果移除了所有值,空链表,也代表不存在在…...

ARMv8-A架构下的外部debug模型(external debug)简介

Armv8-A external debug Armv8-A debug模型一,外部调试 External debug 简介二,Debug state2.1 Debug state的进入与退出 三,DAP,Debug Access Port3.1 EDSCR, External Debug Status and Control Register调试状态标识&#xff0…...

DevOps入门

DevOps入门 1. 基础概念和原则 了解DevOps的定义、历史和主要目标 DevOps是一种将软件开发(Dev)与信息技术运维(Ops)结合起来的文化、运动或实践,旨在缩短系统开发生命周期,同时提供高质量的持续交付。DevOps的历史可以追溯到敏捷软件开发的兴起,它强调了开发和运维团队之…...

Docker搭建私有镜像仓库

1.Docker镜像仓库 搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 官网地址:https://hub.docker.com/_/registry 1.1.简化版镜像仓库 Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,…...

流行的API架构学习

几种流行的API架构风格图 SOAP(Simple Object Access Protocol) 优点:SOAP 是一种基于 XML 的通信协议,具有良好的跨平台和跨语言支持。它提供了丰富的安全性和事务管理功能,并支持复杂的消息交换模式。 缺点&#xf…...

问题解决:Fatal Python error: initfsencoding: unable to load the file system codec

问题: "D:\...Climb_C_site\venv\Scripts\python.exe" "D:\...\Small_Case\change_suffix.py" Fatal Python error: initfsencoding: unable to load the file system codec ModuleNotFoundError: No module named encodingsCurrent thread 0x…...

WPF —— TreeView树形控件

1 TreeView简介 TreeView 表示一个控件,该控件在树结构(其中的项可以展开和折叠)中显示分层数据。 TreeView 是一个 ItemsControl,这意味着它可以包含任何类型的对象的集合 (,例如字符串、图像或面板) 。 2 Tree Vie…...

2024.2.20力扣每日一题——从前序和中序遍历序列构建二叉树

2024.2.20 题目来源我的题解方法一 递归方法二 迭代 题目来源 力扣每日一题;题序:105 我的题解 方法一 递归 前序特点:[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]中序特点:[ [左子树的中序遍历结果], 根节点…...

c++ 小游戏(2种)

目录 介绍 游戏1 游戏2 介绍 因为DEV C的编译环境较小&#xff0c;所以大部分的游戏代码都无法在此上运行&#xff0c;我收集了一部分摸鱼小游戏的源码&#xff0c;在此呈现&#xff0c;如果有能在DEV C上运行的我会先作声明&#xff1a; 游戏1 扫雷 #include<stdio.…...

电阻详解:定义、公式、影响因素及电阻器类型解析

电阻定义 电阻是指当电流通过导体时&#xff0c;导体对电流流动所呈现的阻碍作用的物理量。它是电路元件的一个基本参数&#xff0c;用于量化导体阻止电荷定向移动的能力。#电阻#的大小决定了通过导体的电流与两端电压之间的关系&#xff0c;遵循欧姆定律&#xff0c;即在恒定…...

LabVIEW动车组谐波分析与检测系统

LabVIEW动车组谐波分析与检测系统 随着中国高速铁路网络的快速发展&#xff0c;动车组数量和运行速度的不断提升&#xff0c;其产生的谐波问题对电网产生了不小的影响。基于图形化编程语言LabVIEW&#xff0c;开发了一套动车组谐波分析与检测系统&#xff0c;旨在实时监控与分…...

H5移动端 Vue3 + vue-virtual-scroller 实现长列表性能优化

文章目录 安装 vue-virtual-scroller引入&#x1f4e2;注意事项使用基础使用上拉加载下拉刷新 移动端在渲染长列表时 大量dom节点的渲染和重绘重排会导致页面卡顿、滚动不流畅、设备耗电加快、影响移动设备电池寿命等性能问题 这里分享使用【虚拟滚动】方案进行长列表优化&…...

第20章-IP路由原理

目录 1. 概述 2. 路由表 3. 查表规则 4. 路由来源类型 5. 路由优先级 6. 路由的度量值 7. 路由器写表规则 1. 概述 1. 定义 路由器:异构网络互联机制; 路由:指导路由器如何进行数据发送的路径信息; 路由表:目的地址、下一跳、出接口等; 2. IP连通的条件 沿途的每…...

SBCFormer:能够在单板计算机上以每秒1帧的速度进行全尺寸ImageNet分类的轻量级网络

文章目录 摘要1、引言2、 相关工作2.1、用于移动设备的卷积网络2.2、移动设备上的ViT和CNN-ViT混合模型2.3、评估指标 3、CNN-ViT 混合模型在低端CPU上的应用3.1、设计原则3.2、SBCFormer的整体设计3.3、SBCFormer块3.4、改进的注意力机制 4、实验结果4.1、实验设置4.2、ImageN…...

【opencv】教程代码 —features2D(8)AKAZE 特征点匹配和图像拼接

graf1.png graf3.png <?xml version"1.0"?> <opencv_storage> <H13 type_id"opencv-matrix"><rows>3</rows><cols>3</cols><dt>d</dt><data>7.6285898e-01 -2.9922929e-01 2.2567123e02…...

ssm基于springboot的数字家庭亲子视频分享网站java+vue

本网站的模块主要分为前台展示模块和后台管理模块。 前台展示模块功能如下&#xff1a; 1&#xff09;家庭照片模块 主要功能是对家庭照片的分类显示&#xff0c;如旅游、运动、生活、工作、学习等&#xff0c;每一类中的照片按时间轴展示出来。 2&#xff09;家庭亲子视频模块…...

产品经理功法修炼(1)之自我管理

点击下载《产品经理功法修炼(1)之自我管理》 1. 前言 产品经理的能力修炼并非局限于某一技能的速成,而是需要全面参与到产品的整个生命周期中,通过不断的实践来逐步提升自己的各项能力。尽管在企业的日常运作中,我们不可能身兼数职去扮演每一个角色,但作为产品的核心负…...

2024年04月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...