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

news2025/1/19 17:17:07

🛫 系列文章导航

  • 【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() {
            @Override
            public void onClick(View view) {
                (new Thread(new Runnable() {
                    @Override
                    public 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.socketWrite
    Java.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.socketRead0
    Java.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.write
    Java.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.read
    Java.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.coloradmin.cn/o/1571976.html

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

相关文章

机器学习笔记 - 文字转语音技术路线简述以及相关工具不完全清单

一、TTS技术简述 今天的文本到语音转换技术(TTS)的目标已经不仅仅是让机器说话,而是让它们听起来像不同年龄和性别的人类。通常,TTS 系统合成器的质量是从不同方面进行评估的,包括合成语音的清晰度、自然度和偏好,以及人类感知因素,例如可理解性。 1、技术路线 (1)基…

【Java网络编程】HTTPS协议

HTTPS协议 由于HTTP协议是采用明文传输的方式&#xff0c;因此带来了很大的数据安全隐患&#xff0c;所以在最近几年的时间内&#xff0c;大部分平台都采用了HTTPS逐渐取代了HTTP&#xff0c;但HTTPS并不是一种全新的协议&#xff0c;而是建立在HTTP协议的基础之上&#xff0c…

单链表的排序

目录 题目来源&#xff1a; 题目描述&#xff1a; 初始代码&#xff1a; 思路&#xff1a; 具体做法&#xff1a; 我的代码&#xff1a; 优化代码&#xff1a; 对比&#xff1a; 复习&#xff1a;List 基本介绍 常用方法 遍历方式 题目来源&#xff1a; 单链表的排…

达梦使用disql登录数据库显示“未连接”

基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例问题&#xff1a;达梦数据库在使用disql登录时&#xff0c;显示“未连接”。 指定了IP和端口号还是连接异常。 […

PTA天梯赛练习题 L1-029 是不是太胖了

PTA | 程序设计类实验辅助教学平台 思路简析 挺简单的一道输出题&#xff0c;但是有几个细节注意&#xff1a; 整数类型与浮点类型的混合运算控制小数位数 解法代码 #include<stdio.h> int main () {int H;scanf("%d", &H);float result;result 2 * (H …

Vulnhub:BOSSPLAYERSCTF: 1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap 命令执行漏洞 反弹shell 提权 系统信息收集 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd:9…

基于java+SpringBoot+Vue的月度员工绩效考核管理系统设计与实现

基于javaSpringBootVue的月度员工绩效考核管理系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot VUE工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 绩效考核查询模块&#xff1a;员工可以查询自己的绩效考核结果和历史记录。 后台展示 部门管理模…

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后&#xff0c;我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块&#xff0c;其中quick就是qml了&…

阿里云服务器资费:一年或1个月费用价格,2024年更新

阿里云服务器资费多少钱&#xff1f;一年或1个月费用价格&#xff1a;2核2G3M轻量服务器61元一年、ECS云服务器2核2G3M 99元一年&#xff0c;2核4G轻量165元一年&#xff0c;2核4G ECS 199元一年&#xff0c;阿里云服务器网aliyunfuwuqi.com整理如下&#xff1a; 1、ECS经济型e…

vue 实现的h5 页面,如何设置页面中的 title

修改页面中的title 公共修改方式在App.vue 中&#xff1a; created() {document.title "测试标题"; },单个页面修改&#xff0c;就在单个页面编写就ok

(ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类

文章目录 相关论文摘要引言类别嵌入局限性——问题1普通ZSL模型局限性——问题2自动属性注释过程——对应问题1深度语义-视觉对齐&#xff08;DSVA&#xff09;模型——对应问题2 基于遥感多模态相似性的自动属性标注属性词汇表构造使用CLIP模型自动标注属性对CLIP模型进行训练…

移动Web学习04-移动端订单结算页PC端个人中心页面

5、电商结算页面案例 css body{background-color: #F2F2F2; } * {box-sizing: border-box;margin: 0;padding: 0; }.main{padding: 12px 11px 80px; }.pay{display: flex;height: 80px;background-color: #fff;bottom: 0;width: 100%;border-top: 1px solid #ededed;position:…

腾讯云轻量应用服务器是什么?和普通云服务器有区别吗?

腾讯云轻量应用服务器是什么&#xff1f;轻量应用服务器是开箱即用、面向轻量应用场景的云服务器产品&#xff0c;与之对应的是云服务器CVM&#xff0c;CVM是专业级的云服务器&#xff0c;中小企业、个人开发者可以使用轻量应用服务器在云端构建网站、Web应用、小程序/小游戏、…

计算机网络-TCP重传、滑动窗口、流量控制、拥塞控制

重传机制 超时重传&#xff1a;超时重传时间&#xff08;RTO&#xff09;设定为略大于RTT&#xff08;动态&#xff09;。触发场景包括自己发送的数据包丢失和别人给自己的回应数据包丢失。启动重传机制后如果还没有收到数据包&#xff0c;则RTO设置为上次的两倍&#xff0c;直…

基于顺序表实现通讯管理系统!(有完整源码!)

​​​​​​​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;C语言实战项目 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01;​​​​​​​ 目录 1、实现思路 ​…

从B2B转向B2B2C模式:工业品牌史丹利百得的转型历程

图片来源&#xff1a;Twitter 在当今数据驱动的营销环境中&#xff0c;企业努力更好了解客户&#xff0c;并在整个客户旅程中提供个性化体验。史丹利百得&#xff08;Stanley Black & Decker&#xff09;是一家领先的工具和工业设备供应商&#xff0c;近年来开始重大转型。…

Oracle的物理结构解析

这些图是我自己画的&#xff0c;我也会在我的公众号【会用数据库】解析。理解起来非常简单&#xff0c;而且非常好记。不用死记硬背&#xff0c;有兴趣可以来公众号看呀。

深度学习【向量化(array)】

为什么要向量化 在深度学习安全领域、深度学习练习中&#xff0c;你经常发现在训练大量数据时&#xff0c;深度学习算法表现才更加优越&#xff0c;所以你的代码运行的非常快至关重要&#xff0c;否则&#xff0c;你将要等待非常长的时间去得到结果。所以在深度学习领域向量化…

Apache Pulsar源码解析之Lookup机制

引言 在学习Pulsar一段时间后&#xff0c;相信大家也或多或少听说Lookup这个词&#xff0c;今天就一起来深入剖析下Pulsar是怎么设计的它吧 Lookup是什么 在客户端跟服务端建立TCP连接前有些信息需要提前获取&#xff0c;这个获取方式就是Lookup机制。所获取的信息有以下几种…

机器学习实战18-机器学习中XGBClassifier分类器模型的应用实战,以及XGBClassifier分类器的调优策略

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战18-机器学习中XGBClassifier分类器模型的应用实战&#xff0c;以及XGBClassifier分类器的调优策略。XGBClassifier是基于eXtreme Gradient Boosting (XGBoost)算法的分类器模型&#xff0c;在机器学习领…