免责声明
文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业和非法用途,否则由此产生的一切后果与作者无关。若有侵权,请在公众号【爬虫逆向小林哥】联系作者
01
—
前言
好久没发文了,之前有发过通过hook方式降级douyin-quic协议进行抓包。今天分享从okhttp3-retrofit2通信框架拦截douyin通信的请求和响应。
02
效果
评论
橱窗
03
—
知识点
okhttp
OkHttp是一个高效的HTTP客户端,是目前Android使用最广泛的网络框架
特点:支持http1、http2、quic、websocket;无缝支持gzip数据压缩,减少数据流量(抖音的有些post-data就是gzip发包的);连接池复用底层TCP;
private void testOkHttp() throws IOException {
//Step1
final OkHttpClient client = new OkHttpClient();
//Step2
final Request request = new Request.Builder()
.url("https://www.google.com.hk").build();
//Step3
Call call = client.newCall(request);
//step4 发送网络请求,获取数据,进行后续处理
call.enqueue(new Callback() {
public void onFailure(Call call, IOException e) {
}
public void onResponse(Call call, Response response) throws IOException {
Log.i(TAG,response.toString());
Log.i(TAG,response.body().string());
}
});
}
如果需要加代理的话,通过builder添加:
// 设置代理服务器,这里以HTTP代理为例
final String proxyHost = "your_proxy_host";
final int proxyPort = your_proxy_port;
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
// 设置代理
builder.proxy(proxy);
说到代理,这里给大家推荐款IP代理商:青果网络 !!!
最近笔者也在使用这家代理,主要是给的优惠足够大 哈哈哈
青果的国内短效代理,提供动态和短效的IP资源,其基于拨号VPS构建的高品质代理服务器,部署全国200+城市与地区,IP日流水超600万,更有6小时不限量测试时长;使用后的感觉整体ip稳定性、业务成功率和性价比都挺不错的。
评估下来个人感受有一下几大优势:
第一:极速响应
第二:支持短时间大量提取IP(应对短期需要切换大量IP的爬虫任务)、
第三:提供代理请求统计分析(方便用于监控用量)。
第四:支持负载均衡(平均分配请求负载,防止单个服务器过载)
感兴趣老板可以点击文尾阅读原文查看!!!
切回正片!!!
retrofit
Retrofit将您的HTTP API转换为Java接口;Retrofit 是一个 RESTful 的 HTTP网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责网络请求接口的封装;
准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。原因:网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责网络请求接口的封装。App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。所以,网络请求的本质仍旧是OkHttp完成的,retrofit只是帮使用者来进行工作简化的,比如配置网络,处理数据等工作,提高这一系列操作的复用性。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fanyi.youdao.com/") //设置网络请求的Url地址
.addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
// 创建 网络请求接口 的实例
GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
//对 发送请求 进行封装
Call<Reception> call = request.getCall("");
// 异步请求
call.enqueue(new Callback<Reception>() {
//请求成功时回调
public void onResponse(Call<Reception> call, Response<Reception> response) {
//请求处理,输出结果
response.body().show();
}
//请求失败时候的回调
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();
}
03
—
分析过程
打开douyin-apk,找到retrofit2
目录下封装了client、request、response,以及一个SsCall接口
SsCall接口有个execute方法,然后返回值Response类型
整个流程就是一个实现Client接口的类调用newSsCall 会返回一个实现SsCall的类,类中通过execute调用实现Call的类返回Httpresponse
查下这个SsCall的实现,进第一个查找用例
这里拿到retrofit2封装的Response的body
我们hook下Response
hook到了
参数:
str是请求的url i=200应该是状态码 list是个object typedInput也是object
从名字上可以看出list是headers的切片,最重要的是这里的typedInput
往上回溯找到实参位置
进去
直接hook这个getBytes即可
因此我们上面hook函数改为:
我们日志文件里面以及有了字节,我们转为str看下
然后就拿到了文本
在frida利用JavaString将字节转为string
let JavaString = Java.use("java.lang.String")
let _TypedByteArray = Java.cast(typedInput, TypedByteArray)
let results = JavaString.$new(_TypedByteArray.getBytes());
好了分析完毕!
其实在分析过程中找到了一个Cronet的开关,这个函数hook->return false,同样可以降级抓包
hook代码星球见,星球好久没更新要被骂了
04
—
算法还原
添加好友回复:交流群
戳 “阅读原文" 了解青果网络~
原文始发于微信公众号(爬虫逆向小林哥):分析okhttp3-retrofit2-截流某音通信数据
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论