谷歌4.8高分软件,这软件破解难度不大,都是老生常谈的代码,破解思路和之前发的滴答清单差不多。总体上适合新手,看完正己的教程应该是会的。
软件教程用的是7.3.1版本,谷歌下载下来的是xapk格式,用mt管理器直接转换成apk安装。
首先重签名,不出意外的闪退了。还是老生常谈的signatures,dex和so都有校验,处理方式比较简单。
先看dex,校验位于com/dragonnest/my/i1/s,下图红框代码全删。

1.png (94.11 KB, 下载次数: 0)
下载附件
2025-5-22 10:14 上传
这个类在干什么有兴趣的可以自行查看。
接下来是so,发现是libdrawnote、libnotedraw罢工了。ida打开他们,我发现这两个so不仅连名字都很像,代码还很像,不知道为什么不合在一起。
先看libdrawnote,校验位于JNI_OnLoad。代码片段如下:
v14 = _JNIEnv::CallObjectMethod(v3, v11, v13);
v15 = v3->functions->GetObjectClass(&v3->functions, v14);
v16 = v3->functions->GetFieldID(&v3->functions, v15, "signatures", "[Landroid/content/pm/Signature;");
v17 = v3->functions->GetObjectField(&v3->functions, v14, v16);
v18 = v3->functions->GetObjectArrayElement(&v3->functions, v17, 0LL);
v19 = v3->functions->GetObjectClass(&v3->functions, v18);
v20 = v3->functions->GetMethodID(&v3->functions, v19, "toCharsString", "()Ljava/lang/String;");
v21 = _JNIEnv::CallObjectMethod(v3, v18, v20);
v22 = v3->functions->GetStringUTFChars(&v3->functions, v21, 0LL);
if ( *v22 == 51
&& v22[1] == 48
&& v22[2] == 56
&& v22[3] == 50
&& v22[4] == 48
&& v22[879] == 49
&& v22[880] == 51
&& v22[881] == 56
&& v22[882] == 97
&& v22[883] == 97
&& v22[1340] == 99
&& v22[1341] == 102
&& v22[1342] == 55
&& v22[1343] == 99
&& v22[1344] == 52
|| v22[879] == 50
&& v22[880] == 98
&& v22[881] == 101
&& v22[882] == 50
&& v22[883] == 98
&& v22[1757] == 54
&& v22[1756] == 51
&& v22[1755] == 102
&& v22[1754] == 99
&& v22[1753] == 51 )
{
a2 = 1;
LABEL_37:
if ( !e6(v3, v11) )
{
LABEL_8:
if ( a2 == 1 )
k4(v36[0], "com/dragonnest/app/home/folder/BaseFolderWrapperFragment", "h", 0LL);
goto LABEL_39;
}
如果签名值是正确的,应该运行到a2 = 1(loc_10628)这个地方,所以直接让他一开始就跳下来好了。

1.png (72.16 KB, 下载次数: 0)
下载附件
2025-5-22 10:34 上传
另一个同理,修改方法完全一致。

1.png (98.99 KB, 下载次数: 0)
下载附件
2025-5-22 10:38 上传
回填修改好的so,现在可以进入软件了。高级版破解还是老套路,arsc搜索字符串高级版,有几个结果,复制“已解锁高级版”的id,在dex内搜索,有几个结果,点进去,发现上方有个跳转。

1.png (106 KB, 下载次数: 0)
下载附件
2025-5-22 10:47 上传
很明显,上方应该返回1才能解锁高级版。跟进Lcom/dragonnest/app/s0;->W()Z,直接写死返回值即可。在我编辑这个帖子的时候,结果它突然闪退了
为了排除问题,我退回了备份文件,然而并没有异常。刚才闪退的原因也比较明显了,这种套路处理起来也比较简单,找一下他的调用即可。直接搜索结果比较多,建议打印调用。

1.png (72.55 KB, 下载次数: 0)
下载附件
2025-5-22 11:00 上传
相似的教程我记得发过几篇,和最近的帖子“滴答清单”原理差不多。
1、搜索字符串“Qsijjafc_Rdk”,上方的v0赋值0。
[Asm] 纯文本查看 复制代码 invoke-virtual {v0}, Lcom/dragonnest/app/s0;->W()Z
move-result v0
const/4 v0, 0x0
invoke-static {v0}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
move-result-object v0
invoke-virtual {v2, v0}, Landroidx/lifecycle/r;->q(Ljava/lang/Object;)V
sput-object v2, Lcom/dragonnest/app/s0;->r:Landroidx/lifecycle/r;
new-instance v0, Le/d/b/a/g;
const-string v2, "Qsijjafc_Rdk`"
invoke-static {v2}, Lcom/dragonnest/my/i1/w;->a(Ljava/lang/String;)Ljava/lang/String;
move-result-object v4
2、同类中有个方法名d0()V,代码全删。
[Asm] 纯文本查看 复制代码.method public final d0()V
.registers 3
.line 1
invoke-virtual {p0}, Lcom/dragonnest/app/s0;->W()Z
move-result v0
if-eqz v0, :cond_1c
const/4 v0, 0x0
.line 2
invoke-virtual {p0, v0}, Lcom/dragonnest/app/s0;->E0(Z)V
.line 3
sget-object v0, Lcom/dragonnest/app/s0;->r:Landroidx/lifecycle/r;
invoke-virtual {p0}, Lcom/dragonnest/app/s0;->W()Z
move-result v1
invoke-static {v1}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
move-result-object v1
invoke-virtual {v0, v1}, Landroidx/lifecycle/r;->q(Ljava/lang/Object;)V
const-wide/16 v0, -0x1
.line 4
invoke-virtual {p0, v0, v1}, Lcom/dragonnest/app/s0;->D0(J)V
:cond_1c
return-void
.end method
你也许已经发现猫腻了,如果硬改返回值,第一次启动的时候它在下面偷偷放了个0。
3、搜索Ljava/lang/System;->exit(I)V,再次搜索排除结果,只有一个地方。位于com/dragonnest/app/home/component/HomeTitleBarComponent,逻辑也比较简单,不再复述。
[Asm] 纯文本查看 复制代码.method static final C()V
.registers 5
.line 1
sget-object v0, Lcom/dragonnest/app/s0;->a:Lcom/dragonnest/app/s0;
invoke-virtual {v0}, Lcom/dragonnest/app/s0;->W()Z
move-result v1
const/4 v2, 0x0
.line 2
invoke-virtual {v0, v2}, Lcom/dragonnest/app/s0;->z0(Z)V
.line 3
invoke-virtual {v0}, Lcom/dragonnest/app/s0;->W()Z
move-result v0
if-eqz v0, :cond_42
.line 4
:try_start_10
sget-object v0, Le/d/b/a/o;->c:Le/d/b/a/o;
invoke-virtual {v0}, Le/d/b/a/o;->a()Landroid/content/Context;
move-result-object v0
.line 5
invoke-virtual {v0}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager;
move-result-object v3
.line 6
invoke-virtual {v0}, Landroid/content/Context;->getPackageName()Ljava/lang/String;
move-result-object v4
.line 7
invoke-virtual {v3, v4}, Landroid/content/pm/PackageManager;->getLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;
move-result-object v3
.line 8
invoke-static {v3}, Lh/g0/d/k;->d(Ljava/lang/Object;)V
const/high16 v4, 0x4000000
invoke-virtual {v3, v4}, Landroid/content/Intent;->addFlags(I)Landroid/content/Intent;
const v4, 0x8000
.line 9
invoke-virtual {v3, v4}, Landroid/content/Intent;->addFlags(I)Landroid/content/Intent;
.line 10
invoke-virtual {v0, v3}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V
.line 11
invoke-static {}, Landroid/os/Process;->myPid()I
move-result v0
invoke-static {v0}, Landroid/os/Process;->killProcess(I)V
.line 12
invoke-static {v2}, Ljava/lang/System;->exit(I)V
:try_end_3d
.catchall {:try_start_10 .. :try_end_3d} :catchall_3e
goto :goto_42
:catchall_3e
move-exception v0
.line 13
invoke-virtual {v0}, Ljava/lang/Throwable;->printStackTrace()V
.line 14
:cond_42
:goto_42
sget-object v0, Lcom/dragonnest/app/s0;->a:Lcom/dragonnest/app/s0;
invoke-virtual {v0, v1}, Lcom/dragonnest/app/s0;->z0(Z)V
return-void
.end method
改
[Asm] 纯文本查看 复制代码.method static final C()V
.registers 5
.line 1
sget-object v0, Lcom/dragonnest/app/s0;->a:Lcom/dragonnest/app/s0;
const/4 v2, 0x0
invoke-virtual {v0, v2}, Lcom/dragonnest/app/s0;->z0(Z)V
return-void
.end method
我试了一下,应该是正常了的。
这些检测套路换汤不换药,没什么难度,跟下去肯定能找到问题所在,对于新手来说是个不错的练习软件。当然了,有爱还是支持正版,谷歌4.8分可不是吹的