工具:jadx、frIDA、雷电模拟器
方法:hook相关代码
app界面:
image.png (131.97 KB, 下载次数: 0)
下载附件
2024-7-29 19:59 上传
步骤:一:寻找下手点
1.直接isvip,不好意思一个都没,天杀的连vip都没(不然人家为啥叫高级版),观察app,发现每次点击会员功能就会跳出开通界面
image.png (32.87 KB, 下载次数: 0)
下载附件
2024-7-29 20:01 上传
image.png (79.01 KB, 下载次数: 0)
下载附件
2024-7-29 20:02 上传
2.那么我们就可以利用这点去回溯谁调用了它,直接
[color=]adb shell dumpsys activity | findstr "mResumedActivity
定位开通界面
image.png (54.99 KB, 下载次数: 0)
下载附件
2024-7-29 20:07 上传
image.png (8.78 KB, 下载次数: 0)
下载附件
2024-7-29 20:08 上传
image.png (194.13 KB, 下载次数: 0)
下载附件
2024-7-29 20:10 上传
二:回溯开通界面
1.查看是谁调用了
[color=]PremiumActivity
这个类,我尼玛36个,还好一眼就能发现有三个最像,然后就是一个个hook查看是不是调用了
image.png (188.2 KB, 下载次数: 0)
下载附件
2024-7-29 20:27 上传
2.尝试后发现是最后一个调用了开通界面,当我点击会员功能后,就会跳到开通界面,hook显示调用了
image.png (164.27 KB, 下载次数: 1)
下载附件
2024-7-29 20:34 上传
3.继续回溯看是谁调用了它,发现有30个,但是根据
[color=]com.spaceship.screen.textcopy.page.main.MainActivity@ad3a6b
可以判断基本就是那三个了,直接hook判断哪个才是对的
image.png (132.24 KB, 下载次数: 0)
下载附件
2024-7-29 20:43 上传
4.这里有个坑,我hook这三个后,发现点主页那个高级版都没有调用,最后在我点击“隐藏原始文字”这个会员功能后,第一个居然调用了
image.png (252.84 KB, 下载次数: 0)
下载附件
2024-7-29 21:05 上传
5.因为这是个布尔类型,我尝试hook让它返回true,结果发现直接可以用了,也不跳开通界面了吗,所以这个k()就是用来单独判断“隐藏原始文字”这个功能的;那么就说明k()方法中肯定有判断你是不是会员的代码
image.png (197.52 KB, 下载次数: 0)
下载附件
2024-7-29 21:11 上传
三:寻找判断会员代码
1.仔细观察k()方法,我们只要让它们其中一个为真,那么k()就返回true,我们重点观察右边的,直接跟进看看
image.png (63.41 KB, 下载次数: 1)
下载附件
2024-7-29 21:22 上传
2.我们发现d()也是一个布尔方法;直接hook测试看看
image.png (61.33 KB, 下载次数: 0)
下载附件
2024-7-29 21:26 上传
3.哦吼,一不小心就成功了,直接拿下高级版,说明d()这个方法就是用来判断是否为会员的地方,只要让它返回true,那么app就会判断你是会员
image.png (149.75 KB, 下载次数: 0)
下载附件
2024-7-29 21:32 上传
image.png (60.51 KB, 下载次数: 1)
下载附件
2024-7-29 21:34 上传
四:研究会员具体代码
我们双击
[color=]com.gravity.billing.v5.a
跟进后就到了会员信息的具体代码;总结就是它是用来管理用户购买和订阅的,而我们hook的d()方法就是判断
[color=]f10951d
或
[color=]f10952e
是否为空,因为它们里面存放了会员相关信息,app就是判断是否有购买或者订阅信息来判断你是不是高级版
image.png (129.1 KB, 下载次数: 1)
下载附件
2024-7-29 21:53 上传
总结:分析得有可能不是很准,但是整体逻辑就是app判断某个里面是否存放有购买信息,有,那你就是高级版,没有,那你就是普通版,这软件还是挺不错的,用来看国外电影、小说、漫画翻译还是挺好用的,感谢支持,大家一起交流学习