目录
Java.perform(function(){
var LiveLayoutViewerExtendActivity = Java.use("com.xxx.live.activity.room.LiveLayoutViewerExtendActivity");
var PayLiveBlackBgView = Java.use("com.xxx.pay.appview.PayLiveBlackBgView")
var LiveJoinPayDialog = Java.use("com.xxx.pay.dialog.LiveJoinPayDialog");
// hook 收费弹窗 显示
LiveJoinPayDialog.show.implementation = function(){
console.log("LiveJoinPayDialog.show: ");
}
// 设置播放时间
PayLiveBlackBgView.setProview_play_time.implementation = function(a1) {
console.log("setProview_play_time ", a1);
this.setProview_play_time(1000000000)
}
// 设置视频 图像显示
PayLiveBlackBgView.setIs_only_play_voice.implementation = function(a1){
console.log("setIs_only_play_voice: ", a1);
return this.setIs_only_play_voice(0);
}
})




这里我只写了两个消息的主动调用 (房间列表,房间详情)其他接口都类似,就不举例了
Java.perform(function() {
Java.openClassFile("/data/local/tmp/gson.dex").load();
var gson = Java.use("com.google.gson.Gson").$new();
var CommonInterface = Java.use("com.xxx.live.common.CommonInterface");
var AppRequestCallback = Java.use("com.xxx.xxx.http.AppRequestCallback");
var LiveTabHotView4 = Java.use("com.xxx.live.appview.main.LiveTabHotView$4");
var Json = Java.use("com.alibaba.fastjson.JSON");
var Index_indexActModel = Java.use("com.xxx.live.model.Index_indexActModel");
var LiveRoomModel = Java.use("com.xxx.live.model.LiveRoomModel");
var a = 1;
//对于 new class<class> 的构造 有点困惑
//CommonInterface.requestIndex(1, this.mSex, 0, this.mCity, new AppRequestCallback<Index_indexActModel>() {
//TODO :方法1 : CommonInterface.requestIndex(1, 0, 0, "热门", AppRequestCallback$new());
// 大厅房间列表获取
Java.choose("com.xxx.live.appview.main.LiveTabHotView$4", {
onMatch: function (instance) {
if(a == 1){
console.log("LiveTabHotView$4 .....", instance);
CommonInterface.requestIndex(1, 0, 0, "热门", instance);
a = 2;
}
}, onComplete: function () {
}
})
LiveTabHotView4.onSuccess.implementation = function(a){
var result = a.getDecryptedResult();
var resultModel = Json.parseObject(result, Index_indexActModel.class);
var roomList = Java.cast(resultModel, Index_indexActModel).getList();
console.log("size : ", roomList.size(), roomList.get(0))
for(var i = 0; i < roomList.size(); i++){
var LiveRoomModelInfo = Java.cast(roomList.get(i), LiveRoomModel);
console.log("roominfo: ", i, " ", gson.toJson(LiveRoomModelInfo));
}
return this.onSuccess(a);
}
var b = 1;
var LiveBusiness2 = Java.use("com.xxx.live.business.LiveBusiness$2");
// 下面的消息接口 也是大同小异
// 指定房间信息获取 (可以拿到 直播的 url)
Java.choose("com.xxx.live.business.LiveBusiness$2", {
onMatch: function (instance) {
if(b == 1){
console.log("LiveBusiness$2 .....", instance);
CommonInterface.requestRoomInfo(房间id, 0, "", instance);
b = 2;
}
}, onComplete: function () {
}
})
var App_get_videoActModel = Java.use("com.xxx.live.model.App_get_videoActModel")
LiveBusiness2.onSuccess.implementation = function(a){
var result = a.getDecryptedResult();
var resultModel = Json.parseObject(result, App_get_videoActModel.class);
var roomDetail = Java.cast(resultModel, App_get_videoActModel);
//这里只打印了 直播地址 (无用数据太多了) 拿到直播地址后 可以直接用 VLC 播放器打开 播放
// play_url 免费房 是用这个字段
// getPreview_play_url 收费房用这个字段
console.log("roomDetail: play_url: ", roomDetail.getPlay_url(), " getPreview_play_url: ", roomDetail.getPreview_play_url());
//console.log("roomDetail: ", gson.toJson(roomDetail));
return this.onSuccess(a);
}
附上结果图

接下来就要找加密算法了,然后实现脱机,这个过程中有遇到个小插曲,就是发现该app域名指向的地址是竟然本地的地址 ,很奇怪,记得当时我还问 r0ysue 大佬呢,后来我发现了app中的秘密;


既然用了sdk的话,所以就想到去官网下载sdk 玩下,后来发现貌似没有sdk,demo下载;而且大部分逻辑处理都在so层,功力不够,后面就放弃没去搞了,后来在 r0ysue 的星球里看到有人在问,用adb 端口转发,这个给了我启发,后来百度了下adb端口转发

既然这样的话,那我们是不是可以搞成,半脱机呢 (后来证明是可以的,) 安排上





另外关于这个直播流,有几点疑问,就是我拿到直播流的地址后,随便用什么客户端都可以播放,难道后端是不校验前端的吗?如果要校验的话,是怎么去校验的呢?
本人水平很菜,有哪里写不对的话,欢迎大佬们指点批评啊
本贴仅限学习交流使用,切勿用于非法行径,否则后果自付
[公告]看雪论坛2020激励机制上线了!多多参与讨论可以获得积分快速升级?
最后于 16小时前 被Snark编辑 ,原因: