
1.jpg (63.52 KB, 下载次数: 0)
下载附件
2025-4-10 20:03 上传
不知道有多少人遇到了强制更新的问题,而且我看了网上的破解版,并没有人针对这个问题作出对抗。目前并不清楚APP为什么要强制更新,也许频繁更新是不想让你用破解版。
对于以后的破解版,我建议破解者应该去掉强制更新的问题,除非真的不能看漫画了再更新。
我本以为这个问题很简单,因为dex里面有字符串“立即升级”,改了e方法强制返回0后,本以为大功告成,结果安装后依然提示升级……

1.png (43.89 KB, 下载次数: 0)
下载附件
2025-4-10 20:15 上传
看来不是这里的问题,那就卸载后重装,看看是不是还提示升级。果然,卸载重装后一启动马上提示升级了,断网重试,结果一样。我刚开始以为是云端控制,然后换了另一部,神奇的是居然可以正常进入,并没有提示升级。那么可以判定之前就已经缓存了什么文件在本地,卸载时并没有删除。首先排除Android文件夹,肯定是放在了其它的地方。
手机显示所有隐藏文件,很快发现了病根所在。手机里有.mkv文件夹和.mkv_device_2文件夹,创建日期和安装日期很接近。
先进入.mkv文件夹,里面有Dir.CD.txt和Update-com.meimanyuan.app.eup.txt,打开Update-com.meimanyuan.app.eup.txt,里面的代码为:
[Java] 纯文本查看 复制代码{"act":0,"edu":"https://z-video-1252954235.cos.ap-nanjing.myqcloud.com/comic/mantianxing-ym/ym.apk","ein":"亲爱的漫友们,因受应用市场影响,本应用暂停使用,请您使用我们的另一款漫画App","emd5":"a5002370e7f2d3a91a22aa1b27c9cc9e","epa":"cn.ym.community"}
很明显了,问题就在这里。删除后APP不再提示更新,可正常浏览漫画。
从文件名可以看出是命名规则Update-+APP名字+.eup,dex内搜索Update-有1个结果。

1.png (44.01 KB, 下载次数: 0)
下载附件
2025-4-10 20:32 上传
.mkv_device_2文件夹我看了一下应该是和漫画浏览历史有关,删除后浏览历史不见了。
去除强制更新方案我建议随机更改dex的字符串Update-,然后再添加删除动作,每次启动时删除.mkv文件夹。
.class public Lcom/yayi/meimanyuan;
.super Ljava/lang/Object;
# direct methods
.method public constructor ()V
.registers 1
invoke-direct {p0}, Ljava/lang/Object;->()V
return-void
.end method
.method public static ddd()V
.registers 4
const-string v0, "/storage/emulated/0/"
const-string v1, ".mkv"
new-instance v2, Ljava/io/File;
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;->()V
invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-direct {v2, v3}, Ljava/io/File;->(Ljava/lang/String;)V
invoke-static {v2}, Lcom/yayi/meimanyuan;->deleteFolder(Ljava/io/File;)V
return-void
.end method
.method public static deleteFolder(Ljava/io/File;)V
.registers 6
invoke-virtual {p0}, Ljava/io/File;->exists()Z
move-result v0
if-nez v0, :cond_7
return-void
:cond_7
invoke-virtual {p0}, Ljava/io/File;->listFiles()[Ljava/io/File;
move-result-object v0
if-eqz v0, :cond_23
array-length v1, v0
const/4 v2, 0x0
:goto_f
if-ge v2, v1, :cond_23
aget-object v3, v0, v2
invoke-virtual {v3}, Ljava/io/File;->isDirectory()Z
move-result v4
if-eqz v4, :cond_1d
invoke-static {v3}, Lcom/yayi/meimanyuan;->deleteFolder(Ljava/io/File;)V
goto :goto_20
:cond_1d
invoke-virtual {v3}, Ljava/io/File;->delete()Z
:goto_20
add-int/lit8 v2, v2, 0x1
goto :goto_f
:cond_23
invoke-virtual {p0}, Ljava/io/File;->delete()Z
return-void
.end method
添加调用ddd()V到入口,首次启动时,APP找不见升级文件,所以不会提示升级,获取sd卡权限以后,下次启动的时候就可以把文件删除了,无须担心权限不足导致删除失败。
目前只是简单分析,但没有深入分析这个文件是如何产生的,是哪里控制的,多长时间就会触发。
然后接着找找还有没有垃圾文件,又发现了一个“.0114eab9327976d15fa331ee9b9d3068.dat”,位于用户根目录下。而且每次启动都会产生,直接用算法助手抓来源,相关调用为:
[Asm] 纯文本查看 复制代码 public static String getDevicesId(Context context) {
return DeviceUtils.d(context);
}
public static String getNewDevicesId(Context context) {
return DeviceUtils.d(context);
}
public static String getOldDevicesId(Context context) {
return DeviceUtils.f(context);
}
目前还不知道这个是用来干嘛的,但生成的设备id属于比较敏感的内容,我认为应该进行随机化处理。