宅男福利?某不可描述APP的逆向破解
不
忍
直
视
走
起
0x01 前言
在电报群里偶然发现了一个违背社会主义价值观的APP
必须码上。
0x02 搞起
随便翻一翻,发现还有次数限制,果然短视频火了以后,什么行业都能说自己是短视频。
花钱是不可能花钱的,白嫖才是王道,话不多少,搞它。
0x03 初探
将apk丢进查壳工具里,发现没有壳?!很好,很有精神。
使用jeb反编译。
直接搜索VIP,isIs_vip进入视野,我重新进入软件界面发现并没有啥VIP内容,这里先忽略。
我想先看看长短视频的观看次数是如何定义的。
于是Resources=> values => strings.xml查找。
找到txt_play_number字段后进行全局查找,全局查找我倾向使用jadx,感觉比jeb好用些。
找到了这里,貌似没啥比较明显的发现。但是在这个方法往上翻时,我看到了这里。
这段代码意思很明显了,变量b代表短视频可以看多少次,b2是长视频,然后b3是可以看的次数减去已经看的,就是长视频还可以看多少次,b4是短视频还可以看多少次。
切到this.f1350a.b这个函数内部实现看看。
初步猜测,这里是根据传入的字符串不同,传出的数字也不同,类似于map[key,value]的数据结构,传入key,得到相应的储存值。
这里没有继续对getInt深入,因为我只想改变它的返回值,在外层加入判断修改逻辑即可,把b函数改成类似于这样即可。
0x04 破解观看次数
使用frida初步检测破解点
使用frida对b函数进行hook测试。
贴出脚本。
这里简单说明一下,以下命令行各个参数的意义,因为貌似面试题出现这个问题的次数还挺多的~
frida-U -f com.mitao.app3 -l view_count.js --no-pause
-U检测USB设备,真机或者模拟器,都算上。
-f frida会Spawned这个应用,在这个时候启动脚本,会在app执行onCreate之前提前完成脚本的启动。
-l 指定脚本
--no-pause程序正常运行,不因hook到函数而暂停。
如果想了解详细的同学,可以点这里:https://zhuanlan.zhihu.com/p/157604388
执行完之后,如图:
初步进行战术性观看长视频12次,短视频40次,发现次数仍然没有变化可以继续观看,理论上来说,这时候应该禁止我们继续看的,可见hook此处是成功破解了视频观看次数。
但是我们需要将其进行打包破解,因为不可能一直挂着frida观看。所以需要进一步修改smali代码来完成逻辑上的破解。
修改smali逻辑
使用apktool对apk进行解压至mitao。
修改逻辑我想到了三种办法:
1)、硬刚汇编
硬刚汇编,我的想法是将b函数修改成和我js脚本一致的逻辑,也就是说前面加上几个判断。但是有几个问题我不得不考虑,从这里看到在汇编层面,里边的line1,出现在了多个函数中,也就是说,如果按照java层代码编写习惯和汇编的是不一致的,还有寄存器的分配,对我来说显然是比较困难的。
2)、控制执行函数
还有一种办法,借鉴0x指纹大佬针对青青草视频的方法(详情),新建一个类,然后用java将逻辑写出来,编译成smali代码,最终生成新的类加入到app中,然后将所有调用b函数的地方,都将替换成我们修改过的函数,这样也能达到修改的目的。
3、控制执行逻辑
这个方法是最简单的,在最上层的逻辑上进行修改,找到所有调用b函数的地方,并将它们的逻辑全部变成相反的。比如这里,把b3= b2 - this改成b3= b2 + this,b4也是一样。
我们找到汇编代码处,将sub-int改成add-int即可。
当然了,需要修改的地方不止这一处,想练手的同学可以自己找找,按照同样的方法进行修改。
再次使用apktool将其打包后,我们看到逻辑已经被修改。
看一次剩余次数少一次,变成看一次剩余次数增加一次。
再次签名重新安装后,观看次数已经破解成功。
0x05 去广告
在使用的过程中,会出现一些广告,"x秒跳过广告"的字样,必须得看一会广告,再次出现跳过广告,才可以继续。
找到对应的广告代码,判断i2是否大于5,如果大于5就进入跳过广告。
点击跳过广告,可以直接进入正题。
同样的操作,如果我把i2> 5修改成i2> 0,这样等式永远成立,是不是就可以直接进行跳过广告了?
将0x5修改为0x0,重新打包,效果图。
直接进入主题,去广告成功。
附件
APP破解版和未破解版,以及脚本
只能“关注公众号”,然后加群,然后找帅气的miniboom要了
END
扫码关注我们
本文始发于微信公众号(WhITECat安全团队):宅男福利?某不可描述APP的逆向破解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论