起因
那日,基佬群发了个APP,男人,你懂的,结果还是收费的,怎么办,作为一个Android的开发者,不会逆向的就不是个好歌手,直接开电脑分析他。
哈哈哈哈
首先说一下这类APP我以前见过的一种加密方式,他是服务端进行验证,如果不是VIP,就给你返回一个虚假的视频url,无论Android端你怎么搞,都会无济于事,另一种就是Android进行校验,判断是否是VIP,不是VIP弹出Dialog提示你,不让你继续XXXXX,这类好处理,找到判断的地方,修改smali,重新编译签名即可。
分析
对这行还是没深入研究过,只是在以前学习过,会点皮毛,可能连皮毛都不是,不知现在主流方式是什么,但所有人开始学习逆向应该都使用过dex2jar-2.0、apktool吧,但是一套太麻烦了,使用AndroidKiller应该就非常方便了,但是AndroidKiller只能查看smali,如果有很深厚的功底,直接分析smali、修改也可以,但是一般还是要借助其他工具反编译成java代码进行分析,然后找到关键点,在AndroidKiller中修改即可。
这个工具就是jadx-gui-0.6.1.jar 。
下面就是找关键点,我所想到的入手点有以下几处:
- 在播放界面找判断逻辑,将他修改
- APP可能把vip状态保存到本地,我们只需找到并修改他
- APP可能有一个全局变量,保存用户信息,其中可能有vip字段,其他地方拿到这个数据,判断是不是vip,找到并修改他。
最终我选了第三个,所以,我们要找到”我的”的界面中VIP状态显示的数据来源,将他修改。
现在很多界面都是采用单Activity多Fragment方式,所以,”我的”可能会处在一个Fragment中,要找到他很容易,找到当前Activity,找出其中Fragment切换的地方。然后就能找出”我的”界面的Fragment。
打开APP页面,输入
adb shell dumpsys window | findstr mCurrentFocus
就能查看当前的activity完整包名,(下图是我自己的一个APP包名,不是要分析的)。
然后在jadx-gui-0.6.1中找出这个Activity,分析里面代码,经过几秒钟的滑轮滚动,一眼就看到关键点,就是showMainUI(),这个方法,看名字就知道这是个展示主界面的函数,vpMain是ViewPagerSlide,tabMain是TabLayout,然后通过MainTabAdapter适配器进行关联。
这几行正好实现多页面左右滑动切换。
来到MainTabAdapter下,回点Android的都明白了,”我的”界面的Fragment是MineFragment。
所以,在定位到MineFragment下,最终,这段代码引起我的法眼,UserManager、isVip,没错了,用户管理,和判断是否是VIP,下面也判断了如果是VIP,然后显示VIP信息,如果不是,显示”不是VIP布局”,隐藏”VIP布局”。
UserManager下的isVip方法,判断当前时间是否消息过期时间,如果小于则返回true,表示是VIP,否则返回false。
所以我们直接改这里就行, 让他直接返回true。
修改smali
打开AndroidKiller.exe,将APP拖动进去,等待反编译完成即可,完成后定位到UserManager.smali下,找到isVip方法,改成下面即可,表示返回true。
.method public isVip()Z
.registers 2
.prologue
.line 6
const/4 v0, 0x1
return v0
7 E
.end method
然后编译、安装即可。
安装后,发现新大陆,思路没有错,过期日期是1970年1月1,而vip灯却亮着,所有电影都可以看。
基佬直呼过瘾