网络库: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的构造函数
需单独hook构造函数java.net.URL.\$init
可以发现在手机每点击一下刷新验证码,就会弹出新的请求。
然后可以编写自吐脚本,打印出经过的url地址
frida -U -f com.example.network -l 20201013.js –no-pause使用该自吐脚本尝试另一款APP做实验
frida -U -f com.cz.babySister -l 20201013.js –no-pausehook java.io.PrintWriter
的write方法打印出内容:
编写hook脚本将java.io.PrintWriter.write
内容进行打印,可以发现显示出了用户输入的账号和密码。
最终HttpURLConnection
自吐脚本如下
网络库:okhttp3+logging
OKHttp简介
OKHttp是一个处理网络请求的开源项目,Android当前最火热网络框架。
OKHttp的功能
1、PUT,DELETE,POST,GET等请求
2、文件的上传下载
3、加载图片(内部会图片大小自动压缩)
4、支持请求回调,直接返回对象、对象集合
5、支持session的保持
HOOK OkHttp3
1、OkhttpClient对象
在example
类创建一个OkhttpClient对象
可以使用objection查找该okhttp3.OkHttpClient
实例,并查看该属性、域和方法
2、Request对象
// 构造request Request request = new Request.Builder() .url(url) .build();查看该类com.android.okh ttp.internal.huc.HttpURLConnectionImpl
发现每点击刷新一下,会增加一新的实例,然后可以去查看该域
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()); } } ); } }做完混淆,通过拦截器分析方法失效。
网络库: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

评论