目录
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编辑 ,原因: