硕士生
LINGYUE
 
- 金币
- 3195
- 好评
- 45
- 信誉
- 105
   

|
发表于
2025-11-25 00:55:00
来自手机
|
显示全部楼层
| 阅读模式
来自 江西
前言:久违的教程
我自己也是有点惊讶,时隔多年未发教程帖子的我已经处于退圈的边缘了,但是我在日常生活中又难免会遇到"逆向"这类事。
我也是刚上大学的大一生,对于这大学生活也是有点迷茫,一天除了水课,就是游戏 所以也是时间非常的多。
那我就讲讲写这篇教程的缘由吧:
1.逆向爱好的频发
2.闲的蛋疼来打发时间
3.此教程内容与我现所学的Java语言具有一点联系 好吧,废话讲的太多了,那就开始正经的吧
正言:(此教程较详细)
软件:Video Converter(谷歌商店)
开始分析
众所周知逆向一款软件会员的通常方法是vip、isvip、会员等,但老外的软件怎么可能会有如此的表达  也就是这些方法是搜索不出来什么 
我们进入软件的会员界面看到Premium,翻译为高级的,与解锁会员权限有挂勾
直接常量过滤Premium,果不其然,is_premium_user表示为“是否为高级用户”
搜索is_premium_user,逐个转Java分析后qi.c2类简洁明了
qi.c2类invoke方法转Java后不难发现该段Java代码进行了高级用户的识别判断
- public final Object invoke(Object obj) {
- SharedPreferences sharedPreferences;
- int i = this.a;
- c0 c0Var = c0.a;
- MainActivity mainActivity = this.b;
- switch (i) {
- case 0:
- int i2 = MainActivity.d0;
- l.e(((a) mainActivity).c, "<get-TAGBASE>(...)");
- if (((Boolean) obj).booleanValue()) {
- f2 f2Var = ((a) mainActivity).f;
- f2Var.setValue(Boolean.FALSE);
- Boolean bool = Boolean.TRUE;
- f2Var.setValue(bool);
- if (!e.A()) {
- try {
- ApplicationLoader applicationLoader = ApplicationLoader.f;
- if (applicationLoader != null) {
- sharedPreferences = applicationLoader.getSharedPreferences("videoToMp3Convertor", 0);
- } else {
- sharedPreferences = null;
- }
- if (sharedPreferences != null) {
- SharedPreferences.Editor edit = sharedPreferences.edit();
- edit.putBoolean("is_premium_user", true);
- edit.apply();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- n1 n1Var = mainActivity.K().n;
- Boolean bool2 = Boolean.TRUE;
- n1Var.getClass();
- n1Var.k((Object) null, bool2);
- m.c.setValue(bool);
- }
- }
- return c0Var;
- case 1:
- boolean booleanValue = ((Boolean) obj).booleanValue();
- int i3 = MainActivity.d0;
- if (booleanValue) {
- a0 a0Var = a.K;
- l.c(a0Var);
- hk.e eVar = p0.a;
- e0.z(e0.b(d.b), (h) null, (ak.c0) null, new y(mainActivity, a0Var, (ej.c) null), 3);
- }
- return c0Var;
- default:
- int i4 = MainActivity.d0;
- if (((nd.a) obj).b == 11) {
- mainActivity.K().f();
- }
- return c0Var;
- }
- }
- }
复制代码
识别高级用户过程分析:首先要调用invoke方法需要布尔类型,所以会将obj强制转为布尔类型(Boolean),然后再通过调用booleanValue()来获取真假值,如果为假直接结束运行,如果为真则会进行高级用户的识别并获取高级用户。(这就是我所说的与我现所学的Java语言有点联系,前几个星期老师刚讲的布尔类型 )
还不清楚?那就请看流程图吧!
通过以上分析,已经一目了然了 返回smali中对应Java中booleanValue()获取真假值的地方,直接强制赋值p1获取高级用户,即简单又暴力
赋值后的Java
什么?解锁高级用户后打开软件却出现这样了?
解决方法:com.google.android.play.core.common.PlayCoreDialogWrapperActivity下面的activity删除即可,这样就不会跳转谷歌了(这方法适合大部分谷歌软件)
成品:https://share.feijipan.com/s/YGZCChiZ
尾声:
本次教程已经结束,希望能够帮助到大家 
本人的下次教程估计又是要"几年后的相见"
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|