【Frida】【Android】09_爬虫之Socket

🛫 系列文章导航

  • 【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
  • 【Frida】【Android】 06_夜神模拟器中间人抓包 https://blog.csdn.net/kinghzking/article/details/137162859
  • 【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection https://blog.csdn.net/kinghzking/article/details/137211973
  • 【Frida】【Android】 08_爬虫之网络通信库okhttp3 https://blog.csdn.net/kinghzking/article/details/137227041
  • 【Frida】【Android】 09_爬虫之Socket https://blog.csdn.net/kinghzking/article/details/137284648
  • 【Frida】【Android】 工具篇:ZenTracer https://blog.csdn.net/kinghzking/article/details/137284648

▒ 目录 ▒

    • 🛫 系列文章导航
    • 🛫 导读
      • 开发环境
    • 1️⃣ Socket抓包原理
    • 2️⃣ APP源码说明
      • ezReq
      • 按钮绑定及遇到问题解决
    • 3️⃣ HTTP的Socket分析
      • ZenTracer分析
      • 编写代码:jhexdump
      • 编写代码:hookSocket
      • 验证效果
    • 4️⃣ HTTPS的Socket分析
      • ZenTracer分析
      • 编写代码:
      • 验证效果
    • 5️⃣ 验证HTTPS请求流程
      • objection测试
    • 🛬 文章小结
    • 📖 参考资料

🛫 导读

开发环境

版本号描述
文章日期2024-04-02
操作系统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️⃣ Socket抓包原理

前几篇所讨论的HTTP是应用层的协议,如下图所示。
在这里插入图片描述

HTTP数据从应用层发送出去后,依次经过传输层、网络层、链路层,在经过每一层时都会被包裹上头部数据,以保证在数据传输过程中的完整性,然后传输给接收方;接收方以相反的过程依次去除头部数据从而获取真实传输的HTTP数据。
因此,如果对应用进行抓包,那么不仅仅是应用层,在传输层、网络层等应用层往下的所有层级都可以获取传输的全部数据。这正是在传输层进行Socket终极抓包的理论基础。

只要开发者使用了应用层框架,不可避免地会使用系统的Socket进行数据包的收发。
如果使用的是HTTP协议,则直接使用Socket,此时数据如果没有任何代码层面的加解密,直接就是明文,将内容dump下来即可进行分析;
如果使用的是HTTPS协议,那么HTTP包还要“裹上”一层SSL,最终通过SSL的接口进行收发,而SSL也会将加密后和解密前的数据通过Socket与服务器进行通信,如下图所示。
在这里插入图片描述

2️⃣ APP源码说明

本文示例中的APP可以从本篇绑定的资源中下载。主要功能是传递一个url,点击执行HTTP/HTTPS请求。
源码地址: https://gitcode.com/android8/AndroidFridaBeginnersBook
在这里插入图片描述

ezReq

该函数对HttpURLConnection进行封装,执行网络请求。具体含义参考《【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection https://blog.csdn.net/kinghzking/article/details/137211973》。

    public void ezReq(String urlStr) {try {URL url = new URL(urlStr);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setRequestProperty("token","demo");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();// }} catch (IOException e) {e.printStackTrace();}}

按钮绑定及遇到问题解决

  • NetworkOnMainThreadException
    在Android 4.0以上,网络连接不能放在主线程上,否则报错android.os.NetworkOnMainThreadException。
    所以,我们需要new Thread创建一个线程将网络请求包进去。
  • Cleartext HTTP traffic to XXX not permitted
    Android 9.0(API级别28)开始,默认情况下限制了明文流量的网络请求,对未加密流量不再信任,直接放弃请求,因此http的url均无法在webview中加载,https 不受影响。
    小编使用的模拟器是Android 9,当执行http请求时就会报上面的问题。可以通过下面步骤解决:
    • res 下新建 xml 目录,创建文件:network_security_config.xml ,内容如下:
      在这里插入图片描述
    • 在 AndroidManifest.xml 的 application 标签添加配置:
      在这里插入图片描述
        Button button = findViewById(R.id.buttonReq);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {(new Thread(new Runnable() {@Overridepublic void run() {//请求详情TextView viewById = findViewById(R.id.textInputEditText);String url = viewById.getText().toString();Log.d("url = ", url);ezReq(url);}})).start();}});

3️⃣ HTTP的Socket分析

ZenTracer分析

关于ZenTracer的使用,可以参考文章:《【Frida】【Android】 工具篇:ZenTracer https://blog.csdn.net/kinghzking/article/details/137284648》

  • 我们设置好匹配内容为Socket(注意大小写),APP中设置url为http://www.baidu.com,然后点击执行请求:
    在这里插入图片描述

这时候在ZenTracer中,我们可以看到如下内容:
在这里插入图片描述
很明显,read、write函数就是我们想要的函数。

编写代码:jhexdump

java.net.SocketOutputStream的第一个参数是[B,表示字节数组,为了使输出的字节数组更加可视化,这里引用了Awakened的jhexdump()函数,如下面的代码清单所示:

function jhexdump(array, len) {var ptr = Memory.alloc(len);for (var i = 0; i < len; ++i) Memory.writeS8(ptr.add(i), array[i]);//console.log(hexdump(ptr, { offset: off, length: len, header: false, ansi: false }));console.log(hexdump(ptr, {offset: 0,length: len,header: false,ansi: false,}));
}

这部分代码主要是将Java层的byte数组通Memory.writeS8()
函数存放至通过Memory.alloc()这个API手动开辟的内存区域中,再调用hexdump()这个API打印出相应字节的hexdump。

编写代码:hookSocket

代码实现对下面函数的hook

  • java.net.SocketOutputStream.write(bytearray1, int1, int2)
    • 第三个参数int2,表示数组的长度
  • java.net.SocketInputStream.read(bytearray1, int1, int2)
    • 返回值表示读取的长度
    • 对于过长的封包,会分多次读取。
function hookSocket() {Java.perform(function () {// java.net.SocketOutputStream.write// java.net.SocketOutputStream.socketWriteJava.use("java.net.SocketOutputStream").socketWrite.overload("[B","int","int").implementation = function (bytearray1, int1, int2) {var result = this.socketWrite(bytearray1, int1, int2);console.log("socketWrite result,bytearray1,int1,int2=>",result,bytearray1,int1,int2);var ByteString = Java.use("com.android.okhttp.okio.ByteString");jhexdump(bytearray1, int2);return result;};// java.net.SocketInputStream.read// java.net.SocketInputStream.socketRead0Java.use("java.net.SocketInputStream").read.overload("[B","int","int").implementation = function (bytearray1, int1, int2) {var result = this.read(bytearray1, int1, int2);console.log("read result,bytearray1,int1,int2=>",result,bytearray1,int1,int2);var ByteString = Java.use("com.android.okhttp.okio.ByteString");//console.log('contents: => ', ByteString.of(bytearray1).hex())jhexdump(bytearray1, result);return result;};});
}

验证效果

请求封包,write打印结果:
在这里插入图片描述
在这里插入图片描述

响应封包,read打印结果:
在这里插入图片描述
在这里插入图片描述

4️⃣ HTTPS的Socket分析

ZenTracer分析

分析之前我们将APP中的URL由http://www.baidu.com改成
https://www.baidu.com,再次点击执行请求按钮。
ZenTracer将打印如下内容,可见com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLOutputStream.write就是我们需要的写函数
在这里插入图片描述
相对的,我们可以在ZenTracer的控制台中搜素read,可以找到读取的函数com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read
在这里插入图片描述

编写代码:

代码实现与HTTP的类似,不做过多解释,代码如下:

function hookSSLSocketAndroid() {Java.perform(function () {// com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLOutputStream.writeJava.use("com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLOutputStream").write.overload("[B", "int", "int").implementation = function (bytearray1,int1,int2) {var result = this.write(bytearray1, int1, int2);console.log("write result,bytearray1,int1,int2=>",result,bytearray1,int1,int2);var ByteString = Java.use("com.android.okhttp.okio.ByteString");console.log("contents: => ", ByteString.of(bytearray1).hex());return result;};// com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.readJava.use("com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream").read.overload("[B", "int", "int").implementation = function (bytearray1,int1,int2) {var result = this.read(bytearray1, int1, int2);console.log("read result,bytearray1,int1,int2=>",result,bytearray1,int1,int2);var ByteString = Java.use("com.android.okhttp.okio.ByteString");//console.log('contents: => ', ByteString.of(bytearray1).hex())jhexdump(bytearray1, result);return result;};});
}

验证效果

打印结果与HTTP类似,不再贴图了。

5️⃣ 验证HTTPS请求流程

至此,Socket的Hook代码已经写完,反过来,我们通过hook相关函数,可以定位到APP的核心代码,下面我们以HTTPS为例,定位APP调用函数。

objection测试

  • objection连接APP:
    objection -g com.roysue.httpurlconnectiondemo explore
  • hook关键函数、打印堆栈
    android hooking watch class_method com.android.org.conscrypt.ConscryptFileDescrip torSocket$SSLOutputStream.write --dump-args --dump-return --dump-backtrace
    在这里插入图片描述
  • 点击请求,查看打印结果
    如下图,我们可以看出,请求从run函数开始,调用ezReq,然后执行一系列函数,最终发送出去的。
    在这里插入图片描述

🛬 文章小结

使用ZenTracer过程中,会出现崩溃的情况,这时候可以:

  • 多试几次
  • 或者根据已有的输出结果,调整删选条件再次尝试。
  • 或者通过objection的-c命令调整输入结果进行尝试。

关于Socket请求,有很多实现方式,大厂可能会自实现网络请求,避开Socket调用。也有的直接调用so层实现网络请求。

📖 参考资料

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

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

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

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

相关文章

js实现websocket断线重连功能

在项目开发中我们可能经常要使用websocket技术&#xff0c;当连接发生断线后&#xff0c;如果不进行页面刷新将不能正常接收来自服务端的推送消息。为了有效避免这种问题&#xff0c;我们需要在客户端做断线重连处理。当网络或服务出现问题后&#xff0c;客户端会不断检测网络状…

Tomcat部署flowable出现consider increasing the maximum size of the cache

使用Apache Tomcat/8.5.32部署运行flowable-6.5.0时发现控制台有警告 问题原因&#xff1a;解决方法: 使用Apache Tomcat/8.5.32部署运行flowable-6.5.0时发现控制台有警告 01-Apr-2024 20:55:08.877 警告 [localhost-startStop-1] org.apache.catalina.webresources.Cache.ge…

二百二十九、离线数仓——离线数仓Hive从Kafka、MySQL到ClickHouse的完整开发流程

一、目的 为了整理离线数仓开发的全流程&#xff0c;算是温故知新吧 离线数仓的数据源是Kafka和MySQL数据库&#xff0c;Kafka存业务数据&#xff0c;MySQL存维度数据 采集工具是Kettle和Flume&#xff0c;Flume采集Kafka数据&#xff0c;Kettle采集MySQL数据 离线数仓是Hi…

【Mysql】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

前端调试工具之Chrome Elements、Network、Sources、TimeLine调试

常用的调试工具有Chrome浏览器的调试工具&#xff0c;火狐浏览器的Firebug插件调试工具&#xff0c;IE的开发人员工具等。它们的功能与使用方法大致相似。Chrome浏览器简洁快速&#xff0c;功能强大这里主要介绍Chrome浏览器的调试工具。 打开 Google Chrome 浏览器&#xff0c…

Taro多行文本最多展示5行,超出“查看更多”展示,点击弹层

Taro中&#xff0c;页面需求&#xff1a; 多行文本&#xff0c;展示最多展示5行&#xff0c;超出5行&#xff0c;展示“查看更多”按钮&#xff0c;点击弹层展示文本详细信息。 弹层代码就不说了&#xff0c;着重说一下怎么获取区域高度&#xff5e; 1.区域设置max-height&am…

redis的键值基本操作

设置数据 首先设置键值对 删除age&#xff0c;会得到nil&#xff0c;表示这个键已经被删除掉了 判断age键还在不在 查找所有键 查找所有以me结尾的键 删除所有键 redis的键和值都是二进制存储的&#xff0c;所以默认不支持中文。 但是&#xff0c;我们重新登录客户端&#xff…

MySQL-linux安装-万能RPM法

一、MySQL的Linux版安装 1、 CentOS7下检查MySQL依赖 1. 检查/tmp临时目录权限&#xff08;必不可少&#xff09; 由于mysql安装过程中&#xff0c;会通过mysql用户在/tmp目录下新建tmp_db文件&#xff0c;所以请给/tmp较大的权限。执行 &#xff1a; chmod -R 777 /tmp2. …

为什么mac文件拖拽不了 mac文件拖不进硬盘里 macbookpro文件无法拖进移动硬盘 Tuxera NTFS for Mac 2023绿色

如果你是一位Mac用户&#xff0c;你可能会遇到这样的问题&#xff1a;你想把Mac上的文件拖拽到其他位置&#xff0c;比如桌面、文件夹或者外接硬盘&#xff0c;但是却发现无法操作&#xff0c;这是为什么呢&#xff1f;这篇文章将为你解答为什么mac文件拖拽不了&#xff0c;以及…

非关系型数据库-----------探索 Redis高可用 与持久化

目录 一、Redis 高可用 1.1什么是高可用 1.2Redis的高可用技术 二、 Redis 持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三、Redis 持久化之----------RDB 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.2执行流程 3.3启动时加载…

增强Java技能:使用OkHttp下载www.dianping.com信息

在这篇技术文章中&#xff0c;我们将探讨如何使用Java和OkHttp库来下载并解析www.dianping.com上的商家信息。我们的目标是获取商家名称、价格、评分和评论&#xff0c;并将这些数据存储到CSV文件中。此外&#xff0c;我们将使用爬虫代理来绕过任何潜在的IP限制&#xff0c;并实…

Linux编译器 --- gcc/g++使用

文章目录 gcc/g使用1.背景知识2.gcc如何完成2.1 预处理(进行宏替换)2.2 编译&#xff08;生成汇编&#xff09;2.3 汇编&#xff08;生成机器可识别代码&#xff09;2.4 连接&#xff08;生成可执行文件或库文件&#xff09;2.5 gcc选项 gcc/g使用 1.背景知识 预处理&#xf…