首页
论坛
课程
招聘
[原创]暴力破解某直播平台收费房
2020-8-2 22:52 12440

[原创]暴力破解某直播平台收费房

2020-8-2 22:52
12440

目录

 

目录

内容摘要

  • 本贴仅限学习交流使用,切勿用于非法行径,否则后果自付
  • 周末适合在家写写文章, 前段时间手上拿到一款直播app,发现里面有很多房间都是收费的,需要充金币才能看,所以就有了如下文章

分析思路

  • 工具
    1. objection
    2. frida
  • 分析步骤
    1. 先放到jadx中 发现该app是360的壳
    2. 直接脱 (这里就不多介绍了,直接脚本就可以脱)具体可以看我上篇文章
    3. 查找关键点,直接打开app,跳到收费视频界面
    4. 知道关键点了,我们就需要快速定位到关键点,我们都知道弹窗 一般是通过 系统的 android.app.Dialog 类中的 show() 方法展示出来的,这里就hook 该方法,然后调用栈,直接用objection 安排上
      android hooking watch class_method android.app.Dialog.show --dump-args --dump-backtrace --dump-return
      
    5. 很快调用栈就轻而易举的定位到了
    6. 这里 有三个点,我们先选择其中第2个点和第3个点去看代码分析(因为这个两个点离逻辑层最近 ),先看第二个点的代码




    7. 发现最终都会调用 this.payLiveBlackBgView 这个类,然后看函数名字猜测这个是控制时间显示的 方法,然后就是验证自己的猜想了;
    8. 另外弹窗 根据 之前objection 打印的 关键点3 也找到了对应的类
    9. 自此所有点都找到了,附上代码验证了
    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);
        }
    })

效果展示

  • 至此简单的暴力破解已经结束,效果也还可以
  • 附几张效果图 有些房间比较yellow,找了个稍微不yellow点的
  • PS(最后发现大部分都是录播视频,都是套路啊)

协议破解

  • 作为一个逆向的爱好者,往往通过暴力破解,感觉没啥意思,最终还是要破解协议,协议才是一个app的灵魂所在, 直接安排上。
  • 说到协议,我们脑子第一个想到的就是抓包,(charles + postern) 安排上,后面 发现开了vpn后,app直接起不来了,然后又试了先让app起来后,然后在开vpn,依然消息发不出去,看来app肯定对vpn做了检测啥的;
  • 既然不能抓包(此路不通换条路呗),那就从代码入手呗,直接回到我们的第一张图的 关键点1,直接hook (AppHttpUtil) 那个类,看调用栈;发现下面的关键函数,则直接安排上

  • 然后我们在看调用 requestIndex方法 的上层,发现这个是请求的源头;
  • 既然找到关键点了,那我们去构造这个请求来一次主动调用,看看效果
  • 这里我只写了两个消息的主动调用 (房间列表,房间详情)其他接口都类似,就不举例了

    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中的秘密;

  • 就是该app 竟然用了阿里的游戏盾

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

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

  • 这里面涉及一些加密算法,都是用了标准的算法(aes/md5),所以数据构造起来就很简单了
  • 打开app查找本地端口,执行端口转发

  • 然后用python 脚本 安排上
  • 跑起来 ,效果还可以
  • 这里只写了一个接口,其他类似,就不重复了,到此 一个半脱机的脚步算写完了。
  • 吃个压压惊, 写文章好累啊,写了快一天了;

最后总结

  • 该app唯一的难点就是用了阿里的游戏盾,其他一些加密算法都是标准算法,直接照抄源码即可;
  • 这游戏盾后面有时间的话,在去看看吧,毕竟大厂写的,弟弟表示很畏惧
  • adb的端口转发功能是学到了,以前只会用在IDA调试中,现在发现原来也可以这么用;
  • 另外关于这个直播流,有几点疑问,就是我拿到直播流的地址后,随便用什么客户端都可以播放,难道后端是不校验前端的吗?如果要校验的话,是怎么去校验的呢?

  • 本人水平很菜,有哪里写不对的话,欢迎大佬们指点批评啊

  • 本贴仅限学习交流使用,切勿用于非法行径,否则后果自付

  • 如有侵权,请联系作者删除

[看雪官方]《安卓高级研修班》线下班,网课(12月)班开始同步招生!!

最后于 2020-8-2 22:53 被Snark编辑 ,原因:
收藏
点赞10
打赏
分享
最新回复 (28)
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Evan927 活跃值 2020-8-3 01:07
2
0
我之前抓过这种app的m3u8地址  播放地址都是127本地端口  但是播放了几秒之后就转到了网络地址去了  ,但是真实地址还是找不到  一直找不到原因 也无法解决  你说的这种接口也是127的  不知道能不能适用我的这个问题
雪    币: 3265
活跃值: 活跃值 (1027)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
Snark 活跃值 1 2020-8-3 08:12
3
0
有没有用第三方的类似阿里的游戏盾的?如果有的话,可以用我这种方法试试;
雪    币: 4886
活跃值: 活跃值 (146)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
cqzhou 活跃值 2020-8-3 09:18
4
0
apk在哪里?
雪    币: 224
活跃值: 活跃值 (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SANCDAYE 活跃值 2020-8-3 09:27
5
0
免费看大秀
雪    币: 102
活跃值: 活跃值 (414)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Imxz 活跃值 2020-8-3 09:55
6
0

重点是文章内容吗???
重点是APK哪里下!

最后于 2020-8-3 09:55 被Imxz编辑 ,原因:
雪    币: 196
活跃值: 活跃值 (274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
初学小潘 活跃值 2020-8-3 10:00
7
0
虽然感谢分享,但是身体吃不消啊
雪    币: 192
活跃值: 活跃值 (124)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 活跃值 9 2020-8-3 11:51
8
0
同问apk下载地址,小弟也想研究研究如何破解~
雪    币: 3265
活跃值: 活跃值 (1027)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
Snark 活跃值 1 2020-8-3 12:44
9
0
发apk 会不会违规呀
雪    币: 189
活跃值: 活跃值 (99)
能力值: ( LV12,RANK:218 )
在线值:
发帖
回帖
粉丝
scpczc 活跃值 1 2020-8-3 13:33
10
1
虽然感谢分享,但是身体吃不消啊 
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_Null_732 活跃值 2020-8-4 00:45
11
0
大佬给个APK阿
看完没法自己实践一遍,着实难受
雪    币: 174
活跃值: 活跃值 (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
双汇火腿肠 活跃值 2020-8-4 13:11
12
0

     ~

最后于 2020-10-21 14:21 被双汇火腿肠编辑 ,原因:
雪    币: 2940
活跃值: 活跃值 (567)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Love Lenka 活跃值 2020-8-4 13:35
13
0

雪    币: 1986
活跃值: 活跃值 (160)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
毅种循环 活跃值 2 2020-8-4 22:41
14
0
插眼,太强了。等个apk地址
雪    币: 216
活跃值: 活跃值 (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaozhu头 活跃值 2020-8-4 23:22
15
0
等一个地址。
雪    币: 11
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
岁寒123 活跃值 2020-8-4 23:43
16
0
我也要APK自己动手试试
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_jgzwnuxx 活跃值 2020-8-5 06:21
17
0
感谢分享
雪    币: 202
活跃值: 活跃值 (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pkiot 活跃值 2020-8-5 10:07
18
0
这个小奶猫直播平台真是坚挺啊,竟然还没被抓,那个方维互动卖直播平台,真是造就了一大堆的黄播平台,罪大恶极,害了不少人
雪    币: 185
活跃值: 活跃值 (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangren 活跃值 2020-8-5 13:31
19
0
插眼,太强了。等个apk地址
主要是我想学习调试
雪    币: 20
活跃值: 活跃值 (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
soatm 活跃值 2020-8-5 13:32
20
0
pkiot 这个小奶猫直播平台真是坚挺啊,竟然还没被抓,那个方维互动卖直播平台,真是造就了一大堆的黄播平台,罪大恶极,害了不少人
谢谢分享
雪    币: 422
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
BMWGTR 活跃值 2020-8-5 18:21
21
0
厉害了~ 感谢大佬分享~~ 认证学习下~
雪    币: 0
活跃值: 活跃值 (67)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
音混不散 活跃值 2020-8-5 22:56
22
0
我有个朋友也想康康
雪    币: 1621
活跃值: 活跃值 (758)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
ttimasdf 活跃值 2 2020-8-6 14:30
23
0
我有个朋友想知道这个平台的名字 
雪    币: 176
活跃值: 活跃值 (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
失业 活跃值 2020-8-6 14:51
24
0
发现一堆无中生友。
雪    币: 911
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
rookie江 活跃值 2020-8-24 11:23
25
0
老铁apk可以私发下,学习学习嘛
游客
登录 | 注册 方可回帖
返回