Android网络库详解

2022-07-20 8,143

网络库:HttpURLConnection

HttpURLConnection介绍

一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。继承至URLConnection,抽象类,无法直接实例化对象。通过调用openCollection()方法获得对象实例,默认是带gzip压缩的;

HttpURLConnection的使用步骤

使用HttpURLConnection的步骤如下:

1、创建一个URL对象: URL url = new URL(https://www.baidu.com);
2、调用URL对象的openConnection( )来获取HttpURLConnection对象实例: HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3、设置HTTP请求使用的方法:GET或者POST,或者其他请求方式比如:PUT conn.setRequestMethod("GET");
4、设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头 conn.setConnectTimeout(6*1000); conn.setReadTimeout(6 * 1000);
5、调用getInputStream()方法获得服务器返回的输入流,然后输入流进行读取了 InputStream in = conn.getInputStream();
6、最后调用disconnect()方法将HTTP连接关掉 conn.disconnect();

HOOK HttpURLConnection

创建一个URL对象: URL url = new URL(https://www.baidu.com);

如果想自吐URL(https://www.baidu.com)则应该hook URL的构造函数

com.example.network on (google: 8.1.0) [usb] # android hooking search classes URL

16122722514120.jpg

需单独hook构造函数java.net.URL.\$init

com.example.network on (google: 8.1.0) [usb] # android hooking watch class_method java.net.URL.$init --dump-args --dump-backtrace --dump-re
turn

可以发现在手机每点击一下刷新验证码,就会弹出新的请求。
16122725661934.jpg

然后可以编写自吐脚本,打印出经过的url地址

frida -U -f com.example.network -l 20201013.js  --no-pause

16122763487941.jpg使用该自吐脚本尝试另一款APP做实验

frida -U -f com.cz.babySister -l 20201013.js  --no-pause

16122768625553.jpg

hook java.io.PrintWriter的write方法打印出内容:

com.cz.babySister on (google: 8.1.0) [usb] # android hooking watch class_method java.io.PrintWr
iter.write --dump-args --dump-backtrace --dump-return

16122781902711.jpg

编写hook脚本将java.io.PrintWriter.write内容进行打印,可以发现显示出了用户输入的账号和密码。

16123349187100.jpg

最终HttpURLConnection自吐脚本如下

function hook_HttpUrlConnection(){

    Java.perform(function(){
            // java.net.URL.URL  ($init) (得到URL)

    Java.use("java.net.URL").$init.overload('java.lang.String').implementation = function (str){
        var result = this.$init(str)
        console.log("result , str => ",result,str);
        return result;
    }

    //HttpURLConnection setRequestProperty 得到各种请求头、属性等
    Java.use("com.android.okhttp.internal.huc.HttpURLConnectionImpl").setRequestProperty.implementation = function(str1,str2){
        var result = this.setRequestProperty(str1,str2);
        console.log(".setRequestProperty result,str1,str2->",result,str1,str2);
        return result; 
    }

    Java.use("com.android.okhttp.internal.huc.HttpURLConnectionImpl").setRequestMethod.implementation = function(str1){
        var result = this.setRequestMethod(str1);
        console.log(".setRequestMethod result,str1,str2->",result,str1);
        return result; 
    }
    //java.io.PrintWriter write 得到输入内容
    Java.use("java.io.PrintWriter").write.overload('java.lang.String').implementation = function(str1){
        var result = this.write(str1);
        console.log(".write result,str1->",result,str1);
        return result; 
    }



    })

}
setImmediate(hook_HttpUrlConnection)

网络库:okhttp3+logging

OKHttp简介

OKHttp是一个处理网络请求的开源项目,Android当前最火热网络框架。

OKHttp的功能

1、PUT,DELETE,POST,GET等请求
2、文件的上传下载
3、加载图片(内部会图片大小自动压缩)
4、支持请求回调,直接返回对象、对象集合
5、支持session的保持

HOOK OkHttp3

1、OkhttpClient对象

example类创建一个OkhttpClient对象

OkHttpClient client = new OkHttpClient();

可以使用objection查找该okhttp3.OkHttpClient实例,并查看该属性、域和方法

com.roysue.octolesson2ok3 on (google: 8.1.0) [usb] # plugin load /Users/tale/.objection/plugins/Wallbreaker
Loaded plugin: wallbreaker
com.roysue.octolesson2ok3 on (google: 8.1.0) [usb] # plugin wallbreaker classsearch OkHttpClient
com.android.okhttp.OkHttpClient$1
com.android.okhttp.OkHttpClient
okhttp3.OkHttpClient$1
okhttp3.OkHttpClient$Builder
okhttp3.OkHttpClient
com.roysue.octolesson2ok3 on (google: 8.1.0) [usb] # plugin wallbreaker objectsearch okhttp3.OkHttpClient
[0x26c2]: okhttp3.OkHttpClient@dc28b06
com.roysue.octolesson2ok3 on (google: 8.1.0) [usb] # plugin wallbreaker objectdump --fullname 0x26c2

16129617751453.jpg

2、Request对象

// 构造request
Request request = new Request.Builder()
        .url(url) 
        .build();

查看该类com.android.okh ttp.internal.huc.HttpURLConnectionImpl
发现每点击刷新一下,会增加一新的实例,然后可以去查看该域
16129622507623.jpg

3、发起异步请求
在将Request对象封装成Call对象后,每次enqueue都会产生一次真实的网络请求

// 发起异步请求
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        call.cancel();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {

        //打印输出
        Log.d(TAG, response.body().string());

    }
}
public class example {

    // TAG即为日志打印时的标签
    private static String TAG = "learnokhttp";


    // 新建一个Okhttp客户端
    //OkHttpClient client = new OkHttpClient();
    OkHttpClient client = new OkHttpClient.Builder()
            .addNetworkInterceptor(new LoggingInterceptor())
            .build();

    void run(String url) throws IOException {
        // 构造request
        Request request = new Request.Builder()
                .url(url)
                .build();


        // 发起异步请求
        client.newCall(request).enqueue(new Callback() {
                                            @Override
                                            public void onFailure(Call call, IOException e) {
                                                call.cancel();
                                            }

                                            @Override
                                            public void onResponse(Call call, Response response) throws IOException {

                                                //打印输出
                                                Log.d(TAG, response.body().string());

                                            }
                                        }
        );
    }
}

16129605327783.jpg

做完混淆,通过拦截器分析方法失效。

网络库:Retrofit

Retrofit简介:

Retrofit是一个RESTful的HTTP网络请求框架的封装,网络请求的工作本质上是OkHttp完成,而 Retrofit仅负责网络请求接口的封装。

Retrofit使用步骤:

1.添加Retrofit库的依赖:

implementation 'com.squareup.retrofit2:retrofit:2.5.0'//Retrofit依赖
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'//可选依赖 解析json字符所用

网络权限:

<uses-permission android:name="android.permission.INTERNET" />

2.创建用于描述网络请求的接口
Retrofit将Http请求抽象成Java接口:采用注解描述网络请求参数和配置网络请求参数

public interface GetRequest_Interface {

    @GET("openapi.do?keyfrom=abc&key=2032414398&type=data&doctype=json&version=1.1&q=car")
    Call<Reception> getCall(@Field("name") String name);
    // @GET注解的作用:采用Get方法发送网络请求

    // getCall() = 接收网络请求数据的方法
    // 其中返回类型为Call<*>,*是接收数据的类(即上面定义的Translation类)
    // 如果想直接获得Responsebody中的内容,可以定义网络请求返回值为Call<ResponseBody>
}

3.创建Retrofit实例

  Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fanyi.youdao.com/") //设置网络请求的Url地址
                .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

4.发送请求

// 创建 网络请求接口 的实例
        GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
        //对 发送请求 进行封装
        Call<Reception> call = request.getCall("");
        call.enqueue(new Callback<Reception>() {
            //请求成功时回调
            @Override
            public void onResponse(Call<Reception> call, Response<Reception> response) {
                //请求处理,输出结果
                response.body().show();
            }
            //请求失败时候的回调
            @Override
            public void onFailure(Call<Reception> call, Throwable throwable) {
                System.out.println("连接失败");
            }
        });

          //同步请求
        try {
            Response<Reception> response = call.execute();
            response.body().show();
        } catch (IOException e) {
            e.printStackTrace();
        }

HOOK Retrofit

因Retrofit的下层为okhttp, 所以hook okhttp3一样的可以用在hook Retrofit上。
对比 Okhttp,Retrofit是一个RESTful的HTTP网络请求框架的封装。
原因:网络请求的工作本质上是OkHttp完成,而Retrofit仅负责网络请求接口的封装。
App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数、Header、Url

等信息,之后由OkHttp完成后续的请求操作。在服务端返回数据之后,OkHttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析。

参考资料

https://www.runoob.com/w3cnote/android-tutorial-httpurlconnection.html
https://blog.csdn.net/zhangqiluGrubby/article/details/71480546


本文作者:TideSec

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/183844.html

Tags:
评论  (0)
快来写下你的想法吧!

TideSec

文章数:97 积分: 185

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号