前言
分析下某音模拟器看直播的方法.
图片部分关键信息已打码.
某音极速版(11.0.0)
实验环境
1.Android真机(Android5.1)
2.雷电模拟器3(3.120)
3.win10
过程
模拟器打开app,点击直播,发现只能进入一次直播后就再也无法进入,提示房间无法进入.
打开ddms
搜索toast
一直找它的父方法,直到
com.bytedance.android.livesdk.chatroom.detail.e.handleMsg
基本上可以断定是这个方法结束了直播
模拟器启动frida
执行脚本打印message的值
Java.perform(function(){
var hook_class = Java.use('com.bytedance.android.livesdk.chatroom.detail.e');
hook_class.handleMsg.implementation = function(map){
console.log(map.toString());
var result = this.handleMsg(map);
return result;
}
});
发现当成功进入直播间时obj的值为com.bytedance.android.livesdk.chatroom.model.i
而进入直播间失败时obj的值为java.lang.IllegalStateException: body must not be null
由此可以断定com.bytedance.android.livesdk.chatroom.model.i是关键点
打开jadx
搜索com.bytedance.android.livesdk.chatroom.model.i
大致可以确定其包含sendMessage的方法在com.bytedance.android.livesdk.chatroom.bl.ag.accept里
查找该类引用,定位到上层方法为
((RoomRetrofitApi) com.bytedance.android.livesdk.ab.i.k().b().a(RoomRetrofitApi.class)).enterRoom(j3, 1, j2, hashMap).compose(o.a()).subscribe(new af(a2, weakHandler, j3), new ag(a2, weakHandler, j3));
查找enterRoom,发现它是一个HTTP的接口
模拟器连接fiddler
抓/webcast/room/enter/的包发现
当进入直播失败时,该post请求的返回包里body无内容
当进入直播成功时,该post请求的返回包里body是有内容的
那么是什么决定了该请求的返回内容呢?
拿出真机,设置fiddler代{过}{滤}理.打开app,进入直播间
将真机QueryString的参数值逐一替换到模拟器的QueryString里,重新发送
最后发现当模拟器的iid,device_id与真机相同时,该包body有内容
那么iid,device_id是怎么来的呢?
这里就不展开了,直接百度一下
根据前人大佬们的经验,可知
/service/2/device_register/
接口负责设备的注册,
那么只需要获取手机上的device_register包,并将response转发到模拟器上就行了
实现过程
打开fiddler,手机设置fiddler代{过}{滤}理,打开app,在fiddler中找到
/service/2/device_register/
的包.然后把响应保存起来
设置AutoResponder(拦截模拟器的device_register请求并返回手机对应的响应)
如图
之后模拟器设置代{过}{滤}理,打开app.进入直播间,切换直播间没有任何问题.
写在最后
/service/2/device_register/
这个接口其实已经对真机和模拟器进行了区分,感兴趣的大佬可以仔细的研究.