本帖最后由 泄密无花 于 2023-3-2 12:52 编辑
0x00 前言
本帖是对前篇帖子:https://www.52hb.com/thread-57930-1-1.html 修改的一个补充。
主要的区别点在于:
前篇帖子修改VIP之后还是存在速记技巧试用的提醒,但是修改了试用速记技巧的次数为增加;本帖修改了方法,做到了去除试用速记技巧的提示,也可以说是成为了“真正”的VIP,而不是“虚假”的VIP。
PS:除了试用次数的修改,其他修改与之前的帖子没有区别(自行尝试)
“虚假”的VIP的截图:

“真正”的VIP的截图:

0x01 准备工作
懒人驾考最新版本:https://www.wandoujia.com/apps/8106296
使用工具:MT管理器
0x02 逆向思路
在之前的帖子中有个永久VIP关键词:key_mmkv_vip_list_forever

那么这里直接全局搜索该关键词,全部点击。并根据下面思路修改

点开第三个结果,主要关注一下类似的代码

转成Java代码可以看到,这个c是判断永久会员的开通的方法。那么只要让这个if的判断通通为0即可成为真正的VIP(截图太长,我直接贴代码)
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
action.hashCode();
char c = 0;
switch (action.hashCode()) {
case -1744024835:
if (action.equals("android.lrjk.action.refresh.user_info_vip")) {
c = 0;
break;
}
break;
case -1106495621:
if (action.equals("wx_pay_0")) {
c = 0;
break;
}
break;
case -1106495620:
if (action.equals("wx_pay_1")) {
c = 0;
break;
}
break;
case -1106495619:
if (action.equals("wx_pay_2")) {
c = 3;
break;
}
break;
case 748682015:
if (action.equals("android.lrjk.action.refresh.user_info")) {
c = 0;
break;
}
break;
}
String str = "恭喜您成功开通永久会员";
switch (c) {
case 0:
if (b.G(1)) {
OpenVipActivityNew.O(this.a, 1, str);
return;
}
return;
case 1:
OpenVipActivityNew openVipActivityNew = this.a;
if (OpenVipActivityNew.c0(openVipActivityNew) != 0) {
str = "恭喜您成功开通30天会员";
}
OpenVipActivityNew.O(openVipActivityNew, 1, str);
o.g("key_sp_is_vip", true);
k.a().encode(OpenVipActivityNew.c0(this.a) == 0 ? "key_mmkv_vip_list_forever" : "key_mmkv_vip_list_30", true);
b.K("android.lrjk.action.refresh.pay");
AppLog.onEventV3("pay_full_payment_success", m.h("from", OpenVipActivityNew.n0(this.a), "isUseCoupon", OpenVipActivityNew.o0(this.a) != 0 ? "1" : "0", "payMoney", Double.parseDouble(OpenVipActivityNew.p0(this.a).getText().toString().trim()), "couponMoney", OpenVipActivityNew.q0(this.a) != null ? OpenVipActivityNew.q0(this.a).getPreferentialMoney() : 0, "practiceCount", k.a().decode=1Int("key_mmkv_static_question_count", 0)));
AppLog.onEventV3("pay_payment_success", m.h("from", OpenVipActivityNew.n0(this.a), "isUseCoupon", OpenVipActivityNew.o0(this.a) != 0 ? "1" : "0", "payMoney", Double.parseDouble(OpenVipActivityNew.p0(this.a).getText().toString().trim()), "couponMoney", OpenVipActivityNew.q0(this.a) != null ? OpenVipActivityNew.q0(this.a).getPreferentialMoney() : 0, "practiceCount", k.a().decode=1Int("key_mmkv_static_question_count", 0)));
com.jx885.lrjk.c.b.b B = com.jx885.lrjk.c.b.b.B();
B.u0(OpenVipActivityNew.r0(this.a) + "", "1");
return;
case 2:
OpenVipActivityNew.O(this.a, 2, "支付失败");
return;
case 3:
OpenVipActivityNew.O(this.a, 3, "支付取消");
return;
case 4:
OpenVipActivityNew.P(this.a);
return;
default:
return;
}
}
}
修改如下:全部把Java中的if判断的条件都改成0,即可成功进入真正VIP的判断
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
.registers 20
move-object/from16 v0, p0
.line 1
invoke-virtual/range {p2 .. p2}, Landroid/content/Intent;->getAction()Ljava/lang/String;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/String;->hashCode()I
invoke-virtual {v1}, Ljava/lang/String;->hashCode()I
move-result v2
const/4 v3, 0x3
const/4 v4, 0x2
const/4 v5, 0x0
const/4 v6, 0x1
const/4 v7, 0x0 # 修改
sparse-switch v2, :sswitch_data_178
goto :goto_4c
:sswitch_16
const-string v2, "android.lrjk.action.refresh.user_info"
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_1f
goto :goto_4c
:cond_1f
const/4 v7, 0x0 # 修改
goto :goto_4c
:sswitch_21
const-string v2, "wx_pay_2"
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_2a
goto :goto_4c
:cond_2a
const/4 v7, 0x0 # 修改
goto :goto_4c
:sswitch_2c
const-string v2, "wx_pay_1"
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_35
goto :goto_4c
:cond_35
const/4 v7, 0x0 # 修改
goto :goto_4c
:sswitch_37
const-string v2, "wx_pay_0"
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_40
goto :goto_4c
:cond_40
const/4 v7, 0x0 # 修改
goto :goto_4c
:sswitch_42
const-string v2, "android.lrjk.action.refresh.user_info_vip"
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-nez v1, :cond_4b
goto :goto_4c
:cond_4b
const/4 v7, 0x0
:goto_4c
const-string v1, "恭喜您成功开通永久会员"
额外修改的一个判断:
com/jx885/Irjk/c/c/b 中的一个method public static F()Z
.method public static F()Z
.registers 2
const/4 v0, 0x1
.line 1
invoke-static {v0}, Lcom/jx885/lrjk/c/c/b;->G(I)Z
move-result v1
if-nez v1, :cond_1e
const/4 v1, 0x5
invoke-static {v1}, Lcom/jx885/lrjk/c/c/b;->G(I)Z
move-result v1
if-nez v1, :cond_1e
const/4 v1, 0x7
invoke-static {v1}, Lcom/jx885/lrjk/c/c/b;->G(I)Z
move-result v1
if-nez v1, :cond_1e
const/4 v1, 0x6
invoke-static {v1}, Lcom/jx885/lrjk/c/c/b;->G(I)Z
move-result v1
if-eqz v1, :cond_1d
goto :goto_1e
:cond_1d
const/4 v0, 0x1 # 修改
:cond_1e
:goto_1e
return v0
.end method
0x03 修改对比
完全去除了试用的提示



0x04 总结
这次直接搜索关键词:key_mmkv_vip_list_forever,把涉及该关键词的方法全部修改判断,就可以做到完全成为真正的VIP,节省了分析的弯路。(帖子写得比较匆忙,有问题可以评论区讨论)