返回列表 发新帖

【教程】记Audio Jam的一次逆向

  [复制链接]

124

主题

2513

回帖

9033

积分

硕士生

秋枫Mod

Rank: 6Rank: 6

金币
2907
好评
63
信誉
98

MT论坛最佳新人MT论坛帅哥MT论坛新人考神MT论坛活跃会员MT论坛灌水老大

QQ
发表于 2025-12-6 11:41:59 来自手机  | 显示全部楼层 | 阅读模式  来自 河南
本帖最后由 秋枫Mod 于 2025-12-6 13:46 编辑

首先来看看软件的官方介绍
 ̄﹁ ̄

工欲善其事必先利其器,Audiolam为专业乐手的你打造了一款超强的音乐学习工具。
AI伴奏提取乐器音轨、AB循环片段、调整速度音调...更高效地扒谱、练习歌曲。


好像有点打广告的感觉?
算了算了,这些不重要

说正事

来看APP里的内容,还是挺简洁的
有一“个BASE”的非会员提示,还有几个PRO功能的标识


一点击会员功能的按钮,就弹弹窗了


那就搜关键词呗
资源查询了一下,就找到了


复制ID为7f1001d2
结果一搜就一个字段名


那就继续搜索,搜索结果依旧令人头疼,怎么这么少?


不过我有好办法,先进去看看是怎么回事,然后就收获了一坨代码
  1. .method private static final ChordOptions$setRecognitionAccuracyHandle(ZLandroid/content/Context;Ljava/lang/String;)V
  2.     .registers 6

  3.     .line 49
  4.     const-string v0, "chordBase"

  5.     invoke-static {p2, v0}, Lkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z

  6.     move-result v0

  7.     if-nez v0, :cond_2e

  8.     if-nez p0, :cond_2e

  9.     .line 51
  10.     sget-object p0, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->INSTANCE:Lcom/kirakuapp/aum/ui/pages/app/GlobalData;

  11.     invoke-virtual {p0}, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->getProTipDialogParam()Lkotlinx/coroutines/flow/MutableStateFlow;

  12.     move-result-object p0

  13.     .line 398
  14.     :cond_10
  15.     invoke-interface {p0}, Lkotlinx/coroutines/flow/MutableStateFlow;->getValue()Ljava/lang/Object;

  16.     move-result-object p2

  17.     .line 399
  18.     move-object v0, p2

  19.     check-cast v0, Lcom/kirakuapp/aum/ui/pages/app/ProTipDialogParam;

  20.     .line 52
  21.     new-instance v0, Lcom/kirakuapp/aum/ui/pages/app/ProTipDialogParam;

  22.     .line 53
  23.     sget v1, Lcom/kirakuapp/aum/R$string;->pro_chord_limit:I

  24.     invoke-virtual {p1, v1}, Landroid/content/Context;->getString(I)Ljava/lang/String;

  25.     move-result-object v1

  26.     const-string v2, "getString(...)"

  27.     invoke-static {v1, v2}, Lkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V

  28.     .line 52
  29.     invoke-direct {v0, v1}, Lcom/kirakuapp/aum/ui/pages/app/ProTipDialogParam;-><init>(Ljava/lang/String;)V

  30.     .line 400
  31.     invoke-interface {p0, p2, v0}, Lkotlinx/coroutines/flow/MutableStateFlow;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z

  32.     move-result p2

  33.     if-eqz p2, :cond_10

  34.     return-void

  35.     .line 57
  36.     :cond_2e
  37.     sget-object p0, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->INSTANCE:Lcom/kirakuapp/aum/ui/pages/app/GlobalData;

  38.     invoke-virtual {p0}, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->getRecognitionAccuracy()Lkotlinx/coroutines/flow/MutableStateFlow;

  39.     move-result-object p0

  40.     .line 403
  41.     :cond_34
  42.     invoke-interface {p0}, Lkotlinx/coroutines/flow/MutableStateFlow;->getValue()Ljava/lang/Object;

  43.     move-result-object p1

  44.     .line 404
  45.     move-object v0, p1

  46.     check-cast v0, Ljava/lang/String;

  47.     .line 405
  48.     invoke-interface {p0, p1, p2}, Lkotlinx/coroutines/flow/MutableStateFlow;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z

  49.     move-result p1

  50.     if-eqz p1, :cond_34

  51.     .line 58
  52.     sget-object p0, Lcom/kirakuapp/aum/utils/StoreUtils;->INSTANCE:Lcom/kirakuapp/aum/utils/StoreUtils;

  53.     invoke-virtual {p0, p2}, Lcom/kirakuapp/aum/utils/StoreUtils;->setRecognitionAccuracy(Ljava/lang/String;)V

  54.     return-void
  55. .end method
复制代码

看似没什么用,实则就没什么用

还好我慧眼识珠,一眼就看出了猫腻
  1.     .line 51
  2.     sget-object p0, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->INSTANCE:Lcom/kirakuapp/aum/ui/pages/app/GlobalData;

  3.     invoke-virtual {p0}, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->getProTipDialogParam()Lkotlinx/coroutines/flow/MutableStateFlow;
  4.     #方法名翻译:获取会员提示弹窗
  5.     move-result-object p0
复制代码

不是会员就调用弹窗,那这个方法的调用处肯定有会员判断。

我直直直接就是查调用,查到了10结果


然后我就在第三个结果中找到了我想要的
  1. .method private static final Library$addHandle(Ljava/util/List;Lkotlin/jvm/functions/Function0;Landroid/content/Context;)V
  2.     .registers 6
  3.     .annotation system Ldalvik/annotation/Signature;
  4.         value = {
  5.             "(",
  6.             "Ljava/util/List<",
  7.             "Lcom/kirakuapp/aum/database/MusicModel;",
  8.             ">;",
  9.             "Lkotlin/jvm/functions/Function0<",
  10.             "Lkotlin/Unit;",
  11.             ">;",
  12.             "Landroid/content/Context;",
  13.             ")V"
  14.         }
  15.     .end annotation

  16.     .line 67
  17.     sget-object v0, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->INSTANCE:Lcom/kirakuapp/aum/ui/pages/app/GlobalData;

  18.     invoke-virtual {v0}, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->isPro()Lkotlinx/coroutines/flow/MutableStateFlow;

  19.     move-result-object v0

  20.     invoke-interface {v0}, Lkotlinx/coroutines/flow/MutableStateFlow;->getValue()Ljava/lang/Object;

  21.     move-result-object v0

  22.     check-cast v0, Ljava/lang/Boolean;

  23.     invoke-virtual {v0}, Ljava/lang/Boolean;->booleanValue()Z

  24.     move-result v0

  25.     if-nez v0, :cond_3d

  26.     invoke-interface {p0}, Ljava/util/List;->size()I

  27.     move-result p0

  28.     const/4 v0, 0x3

  29.     if-lt p0, v0, :cond_3d

  30.     .line 68
  31.     sget-object p0, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->INSTANCE:Lcom/kirakuapp/aum/ui/pages/app/GlobalData;

  32.     invoke-virtual {p0}, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->getProTipDialogParam()Lkotlinx/coroutines/flow/MutableStateFlow;

  33.     move-result-object p0

  34.     .line 271
  35.     :cond_1f
  36.     invoke-interface {p0}, Lkotlinx/coroutines/flow/MutableStateFlow;->getValue()Ljava/lang/Object;

  37.     move-result-object p1

  38.     .line 272
  39.     move-object v0, p1

  40.     check-cast v0, Lcom/kirakuapp/aum/ui/pages/app/ProTipDialogParam;

  41.     .line 69
  42.     new-instance v0, Lcom/kirakuapp/aum/ui/pages/app/ProTipDialogParam;

  43.     .line 70
  44.     sget v1, Lcom/kirakuapp/aum/R$string;->pro_project_limit:I

  45.     invoke-virtual {p2, v1}, Landroid/content/Context;->getString(I)Ljava/lang/String;

  46.     move-result-object v1

  47.     const-string v2, "getString(...)"

  48.     invoke-static {v1, v2}, Lkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V

  49.     .line 69
  50.     invoke-direct {v0, v1}, Lcom/kirakuapp/aum/ui/pages/app/ProTipDialogParam;-><init>(Ljava/lang/String;)V

  51.     .line 273
  52.     invoke-interface {p0, p1, v0}, Lkotlinx/coroutines/flow/MutableStateFlow;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z

  53.     move-result p1

  54.     if-eqz p1, :cond_1f

  55.     return-void

  56.     .line 74
  57.     :cond_3d
  58.     invoke-interface {p1}, Lkotlin/jvm/functions/Function0;->invoke()Ljava/lang/Object;

  59.     return-void
  60. .end method
复制代码

直接找到了一个大大的isPro方法
可真费劲
  1. invoke-virtual {v0}, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->isPro()Lkotlinx/coroutines/flow/MutableStateFlow;
复制代码


不过下面才是重点
  1. .method public final isPro()Lkotlinx/coroutines/flow/MutableStateFlow;
  2.     .registers 2
  3.     .annotation system Ldalvik/annotation/Signature;
  4.         value = {
  5.             "()",
  6.             "Lkotlinx/coroutines/flow/MutableStateFlow<",
  7.             "Ljava/lang/Boolean;",
  8.             ">;"
  9.         }
  10.     .end annotation

  11.     .line 20
  12.     sget-object v0, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->isPro:Lkotlinx/coroutines/flow/MutableStateFlow;

  13.     return-object v0
  14. .end method
复制代码

看代码我们发现这个方法是object类型返回值,和一般的Z类型返回值不太一样

那要怎么赋值呢?꒰ *•ɷ•* ꒱

仔细看,这个方法的返回值来自isPro字段,那我们从这个字段入手试试
我们不知道怎么赋值,就“问”开发者,直接差调用


一个结果,我们进去看。

为了让你们能看懂,所以我为每句代码都加上了注释ε٩(๑> ₃ <)۶з
  1. .method static constructor <clinit>()V
  2.     .registers 4

  3.     #此处省略其他代码
  4.     const/4 v1, 0x0
  5.     #为v1赋值0
  6.     .line 42
  7.     invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
  8.     #将v1的值转换Int类型的I类型值
  9.     move-result-object v2
  10.     #将v1转换后的值给v2
  11.     .line 20
  12.     invoke-static {v1}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
  13.     #将v2的值转换Int类型的Z类型值
  14.     move-result-object v1
  15.     #将v2转换后的值给v1
  16.     invoke-static {v1}, Lkotlinx/coroutines/flow/StateFlowKt;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow;
  17.     #引用自定义类型MutableStateFlow将v1转换为指定类型值
  18.     #你可以理解为为v1的值加上密码,只有指定的人能看懂
  19.     move-result-object v3
  20.     #将v1的值给v3
  21.     sput-object v3, Lcom/kirakuapp/aum/ui/pages/app/GlobalData;->isPro:Lkotlinx/coroutines/flow/MutableStateFlow;
  22.     #使用put指令将v3的值存入字段isPro

  23.     #此处省略亿点代码
  24.     return-void
  25. .end method
复制代码


现在可以看明白了
整个过程就是赋值→转换→赋值→再转换→继续转换→存入

那么赋值的方法也就明白了,直接有样学样
  1. .method public final isPro()Lkotlinx/coroutines/flow/MutableStateFlow;
  2.     .registers 2
  3.     .annotation system Ldalvik/annotation/Signature;
  4.         value = {
  5.             "()",
  6.             "Lkotlinx/coroutines/flow/MutableStateFlow<",
  7.             "Ljava/lang/Boolean;",
  8.             ">;"
  9.         }
  10.     .end annotation

  11.     const/4 v0, 0x1

  12.     invoke-static {v0}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;

  13.     move-result-object v0

  14.     invoke-static {v0}, Lkotlinx/coroutines/flow/StateFlowKt;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow;

  15.     move-result-object v0

  16.     return-object v0
  17. .end method
复制代码

看结果


目的已经达成,但是时间显示还是有点不美观

那就改!

累了,不说了,以图代文吧(눈‸눈)







已有2人评分好评 金币 理由
youme72020 + 1 + 1 赞一个!
青春向上 + 1 感谢分享。

查看全部评分 总评分:好评 +1  金币 +2 

回复

使用道具 举报

124

主题

2513

回帖

9033

积分

硕士生

秋枫Mod

Rank: 6Rank: 6

金币
2907
好评
63
信誉
98

MT论坛最佳新人MT论坛帅哥MT论坛新人考神MT论坛活跃会员MT论坛灌水老大

QQ
发表于 2025-12-6 11:43:21 来自手机  | 显示全部楼层  来自 河南
回复

使用道具 举报

341

主题

2337

回帖

7960

积分

硕士生

Rank: 6Rank: 6

金币
1048
好评
9
信誉
101
发表于 2025-12-6 11:52:58 来自手机  | 显示全部楼层  来自 美国
looklook
回复

使用道具 举报

2

主题

4507

回帖

1万

积分

禁止访问

iKUN

金币
1214
好评
16
信誉
111
发表于 2025-12-6 12:33:25 来自手机  | 显示全部楼层  来自 广西
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

19

主题

3754

回帖

9555

积分

硕士生

Rank: 6Rank: 6

金币
1518
好评
21
信誉
143
发表于 2025-12-6 14:13:57 来自手机  | 显示全部楼层  来自 广西
感谢分享
回复

使用道具 举报

43

主题

2043

回帖

5540

积分

硕士生

喵~

Rank: 6Rank: 6

金币
856
好评
7
信誉
103

考神MT论坛新人MT论坛最佳新人

QQ
发表于 2025-12-6 14:15:49 来自手机  | 显示全部楼层  来自 广西
看看隐藏喵
回复

使用道具 举报

16

主题

2126

回帖

5619

积分

硕士生

Rank: 6Rank: 6

金币
122
好评
1
信誉
110

考神MT论坛新人MT论坛最佳新人MT论坛帅哥

QQ
发表于 2025-12-6 14:17:51 来自手机  | 显示全部楼层  来自 广西
感谢分享
回复

使用道具 举报

4

主题

1018

回帖

5298

积分

硕士生

Rank: 6Rank: 6

金币
2745
好评
0
信誉
101

MT论坛最佳新人

发表于 2025-12-6 14:24:43 来自手机  | 显示全部楼层  来自 重庆
看看隐藏
回复

使用道具 举报

0

主题

1737

回帖

4591

积分

大学生

Rank: 5Rank: 5

金币
2027
好评
0
信誉
100
发表于 2025-12-6 14:26:57 来自手机  | 显示全部楼层  来自 福建
感谢分享
回复

使用道具 举报

152

主题

1418

回帖

5728

积分

硕士生

Rank: 6Rank: 6

金币
1489
好评
55
信誉
112

考神MT论坛新人MT论坛帅哥MT论坛最佳新人

QQ
发表于 2025-12-6 14:34:58 | 显示全部楼层  来自 广东
感谢分享
回复

使用道具 举报

0

主题

2

回帖

39

积分

幼儿园

Rank: 1

金币
19
好评
0
信誉
100
发表于 2025-12-6 14:35:46 | 显示全部楼层  来自 广东
感谢分享11
回复

使用道具 举报

9

主题

968

回帖

5418

积分

硕士生

Rank: 6Rank: 6

金币
937
好评
0
信誉
98
发表于 2025-12-6 14:41:47 | 显示全部楼层  来自 江苏
学习学习
回复

使用道具 举报

24

主题

4586

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4377
好评
7
信誉
91
发表于 2025-12-6 14:47:43 来自手机  | 显示全部楼层  来自 湖南
看看隐藏
回复

使用道具 举报

1

主题

860

回帖

1906

积分

高中生

Rank: 4

金币
13
好评
0
信誉
98
发表于 2025-12-6 14:48:22 来自手机  | 显示全部楼层  来自 湖南
看看隐藏
回复

使用道具 举报

22

主题

2392

回帖

7412

积分

硕士生

Rank: 6Rank: 6

金币
1435
好评
21
信誉
101

MT论坛新人考神

发表于 2025-12-6 15:09:05 来自手机  | 显示全部楼层  来自 湖南
看看隐藏
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表