Hook破解B站客户端大会员缓存视频
0x0 前言
最近咸鱼收了个LG G8,这还是我第一回自己花钱买手机,哈哈。
因为以前的手机都是爸妈替下来的各种解不了锁的国内品牌机器,基本上没什么可折腾性,所以我一直没怎么对安卓有什么研究。买这个手机原因无外乎两条,第一买来折腾,第二在学校自己用。手机到手bl解了,但是root掉了,于是在学校通宵一个晚上在宿舍把root补了回来,面具lsp统统安排上了,于是我就对hook这种东西产生了兴趣。这个东西是我在学校抽了一个晚自习搞得,博客的图都是放假回家的情景再现。提高知识水平的同时还能顺便水一篇blog
这是我们的主角,这个看起来好欺负的弹窗↓
就决定是你了!
0x1 原料
硬件
- 一台root了并且激活了lsp框架的手机
软件
- b站play版(com.bilibili.app.in)版本号7420600
- SimpleHookR (需要把b站加入作用域)
- mt管理器(有vip最好,因为可以转java逻辑更清晰)
知识储备
- 最好有一点安卓开发的知识
如果没有mt vip也可以用电脑上的jadx之类的代替分析java逻辑。
0x2 过程
首先用mt打开b站的apk,在arsc编辑器++ 中搜索这个弹窗的内容:
我们知道,安卓应用的各种资源在源码中是以id的形式被引用的,所以我们把它的id复制下来:
然后我们使用dex编辑器++在代码中搜索这个id:
于是我们接着深入,看看这个id在哪里被使用了,也就是这个弹窗究竟是在哪里弹出的:
转java看一下:
可以发现这个弹窗所在的方法是tv.danmaku.bili.ui.offline.g1.B
,但是我们在里面并没有找到判断会员的逻辑,说明这个逻辑还在B的上层。那么我们再去找是谁调用了这个B:
我们从DownloadPageActivity里的调用看起:
可以发现弹窗函数g1.B()
(40行)的条件是g1.s(cVar) != 0
(35行),那我们再看看g1.s
的逻辑:
发现这个函数调用了ml2.c.h
,我们在dalvik代码视图中可以直接跳过去:
看逻辑很明显,ml.c.h()
就是判断用户vip状态的函数:
因为我懒不想搞清楚dVar究竟是什么东西,所以我们直接对231行的BiliAccountInfo.g().m()下手:
在dalvik视图中找到m的类,跳转:
其实这里我当初还有一步用SimpleHookR记录该函数的返回值的过程,这里略去,结论就是当登陆用户是大会员的时候这个函数会返回true
。那么接下来就很简单了,只需要hook这个函数的返回值让它永远返回true即可绕过大会员检测。
0x3 效果&总结
现在在不登陆大会员状况下也能直接看大会员缓存视频了:
总结就是难度不大,适合我这样刚接触hook的小白~