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

🛫 系列文章导航

🛫 导读

开发环境

版本号 描述
文章日期 2024-03-24
操作系统 Win11 - 22H2 22621.2715
node -v v20.10.0
npm -v 10.2.3
夜神模拟器 7.0.5.8
Android 9
python 3.9.9
frida 16.2.1
frida-tools 12.3.0
objection 1.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真实类名

通过以下网站:

我们可以通过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)

📖 参考资料

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

相关推荐

  1. Python爬虫requests

    2024-04-04 17:04:04       41 阅读
  2. Python爬虫urllib

    2024-04-04 17:04:04       31 阅读
  3. 07.14_111期_linux_网络通信

    2024-04-04 17:04:04       23 阅读
  4. 07.16_111期_linux_网络通信

    2024-04-04 17:04:04       23 阅读
  5. Python网络爬虫(二):Requests

    2024-04-04 17:04:04       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-04 17:04:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-04 17:04:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-04 17:04:04       82 阅读
  4. Python语言-面向对象

    2024-04-04 17:04:04       91 阅读

热门阅读

  1. 安装nodejs、npm、coturn

    2024-04-04 17:04:04       33 阅读
  2. 2024最新华为OD机试试题库全 -【高效货运】- C卷

    2024-04-04 17:04:04       40 阅读
  3. 基于chatGLM在llama index上建立Text2SQL

    2024-04-04 17:04:04       36 阅读
  4. SpringBoot2升级到SpringBoot3总结

    2024-04-04 17:04:04       39 阅读
  5. Linux系统常见命令

    2024-04-04 17:04:04       26 阅读
  6. Nginx基础(02)

    2024-04-04 17:04:04       43 阅读
  7. 全排列问题

    2024-04-04 17:04:04       31 阅读
  8. C语言游戏实战(9):球球大作战

    2024-04-04 17:04:04       30 阅读
  9. HTML&CSS

    HTML&CSS

    2024-04-04 17:04:04      28 阅读