泄密无花 发表于 2023-3-2 12:50

【原创】安卓逆向实例 - 懒人驾考【补充修改思路】

本帖最后由 泄密无花 于 2023-3-2 12:52 编辑

# 0x00 前言

本帖是对前篇帖子:https://www.52hb.com/thread-57930-1-1.html 修改的一个补充。

主要的区别点在于:

前篇帖子修改VIP之后还是存在速记技巧试用的提醒,但是修改了试用速记技巧的次数为增加;本帖修改了方法,做到了去除试用速记技巧的提示,也可以说是成为了“真正”的VIP,而不是“虚假”的VIP。

**PS:除了试用次数的修改,其他修改与之前的帖子没有区别(自行尝试)**

**“虚假”的VIP的截图:**

![虚假VIP.png](data/attachment/forum/202303/02/123129lhfdwiwpeewzndwf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "虚假VIP.png")

**“真正”的VIP的截图:**

![正确破解.png](data/attachment/forum/202303/02/123152n52d4846ad5z22zr.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "正确破解.png")

# 0x01 准备工作

懒人驾考最新版本:https://www.wandoujia.com/apps/8106296

使用工具:MT管理器

# 0x02 逆向思路

在之前的帖子中有个永久VIP关键词:**key_mmkv_vip_list_forever**

![关键词.png](data/attachment/forum/202303/02/123400zz6kbiko6y6qduq6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "关键词.png")

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

![关键词搜索.png](data/attachment/forum/202303/02/123507p2w62h96hf459sjv.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "关键词搜索.png")

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

![关注点.png](data/attachment/forum/202303/02/123630q7miq1k1t19f349d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "关注点.png")

转成Java代码可以看到,这个**c**是判断永久会员的开通的方法。那么只要让这个if的判断通通为0即可成为真正的VIP(截图太长,我直接贴代码)

```java
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的判断

```Java
.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

```Java
.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 修改对比

**完全去除了试用的提示**

![对比.png](data/attachment/forum/202303/02/124540lckwcr3vwhmcecre.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "对比.png")

![对比2.png](data/attachment/forum/202303/02/124618vjwwpmfwhmrtpiiu.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "对比2.png")

![对比3.png](data/attachment/forum/202303/02/124731uws7n17je4h5twtt.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "对比3.png")

# 0x04 总结

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

DDK4282 发表于 2023-3-2 22:14

没有分了,回帖支持一下

一生逍遥 发表于 2023-3-25 15:16

大佬,你的功夫每次都是让我膜拜
页: [1]
查看完整版本: 【原创】安卓逆向实例 - 懒人驾考【补充修改思路】