之前下载的是别人的修改版,自己动手时发现一键过签失败,只好上电脑分析了。
(久不发帖已经不知道怎么写了。。。
包名:com.mhj.menghuijie,版本1.0.0
使用64位so和ida。去广告比较简单,我直接用幸运破解器生成去广告的APK,这类都有固定方案,手动太麻烦了。屏蔽广告后的应用打开速度有了一些提升。
一、去除签名保护

Screenshot_2024-11-24-22-01-07-102_com.mhj.menghuijie-edit (2).jpg (108.45 KB, 下载次数: 1)
下载附件
2024-11-24 22:02 上传
虽然换了很多名字,但是这个界面一直没变,老司机应该知道这是什么漫画软件。
首先重签名,闪退。发现是so报错,定位到libfcore,用ida打开。还是老生常谈的方案,直接搜索signatures,有几个结果,随便一个都行,点进去。查看伪代码。

1.png (91.21 KB, 下载次数: 1)
下载附件
2024-11-24 22:06 上传
比较经典的获取签名值。上方有个pthread_create,创建了一个新的动作
sub_2A5B8
,经常搞破解的对这个应该比较熟悉,这个东西经常搞鬼搞怪。跟进sub_2A5B8。

2.png (70.48 KB, 下载次数: 1)
下载附件
2024-11-24 22:10 上传
不难发现它其实在获取安装包的安装路径,然后抽取签名值。所以用一键过签会失败,当然魔高一尺道高一丈,还是有强力过签工具可以解决这个问题的。
继续往下看。

3.png (56.26 KB, 下载次数: 0)
下载附件
2024-11-24 22:14 上传
这里有一个对比,就非常明显了。s1对比v62,不一样就给你卡死。解决方案也非常简单,给他自己对比自己就行。如下图,MOV X1, X20,改成MOV X1, X0。

4.png (101.08 KB, 下载次数: 0)
下载附件
2024-11-24 22:20 上传

5.png (53.32 KB, 下载次数: 0)
下载附件
2024-11-24 22:20 上传
二、解锁漫画
随便点开一个漫画,提示要看视频或者推广才给你阅读漫画。入手点就是这个提示框。观察到有“看视频解锁”和“去推广解锁”两个解锁方式,也是随便选一个。在dex中搜索相关字符串,看看有什么发现。
public ContinueReadDialog(Context context, j.a0.c.a[U] aVar, l lVar) {
super(context, _Context.c(AppExt.a()) ? R$style.AppTheme_Dialog_Night : R$style.AppTheme_Dialog);
j.e(context, "context");
j.e(aVar, "cancelListener");
j.e(lVar, "rewardVerify");
this.f6388p = aVar;
this.f6389q = lVar;
AppConfig r2 = AppConfig.r();
j.d(r2, "AppConfig.getAppConfig()");
this.b = r2.p0();
AppConfig r3 = AppConfig.r();
j.d(r3, "AppConfig.getAppConfig()");
boolean o0 = r3.o0();
this.c = o0;
if (o0 && this.b) {
setContentView(R$layout.dialog_continue_read_with_popularize);
} else {
setContentView(R$layout.dialog_continue_read);
}
this.d = (SimpleTextView) findViewById(R$id.tv_look_video);
this.e = (SimpleTextView) findViewById(R$id.tv_not);
this.f6378f = (SimpleTextView) findViewById(R$id.tv_read_time);
this.f6379g = (SimpleTextView) findViewById(R$id.tv_gold);
this.f6380h = findViewById(R$id.ll_add_coins);
if (this.c) {
AppConfig r4 = AppConfig.r();
j.d(r4, "AppConfig.getAppConfig()");
String valueOf = String.valueOf(r4.F());
SpannableString spannableString = new SpannableString("看视频解锁" + valueOf + "分钟阅读时间");
spannableString.setSpan(new a(context), 5, valueOf.length() + 5, 33);
SimpleTextView simpleTextView = this.f6378f;
j.d(simpleTextView, "mTvReadTime");
simpleTextView.setText(spannableString);
SimpleTextView simpleTextView2 = this.f6378f;
j.d(simpleTextView2, "mTvReadTime");
simpleTextView2.setText("看视频可获得继续阅读资格");
if (this.b) {
a(R$id.tv_popularize, this);
}
只有一个结果,点进去。代码片段如上。
然后看一下它是怎么跳下来的,根据跳转往上爬,找到根源。

1.png (102.17 KB, 下载次数: 0)
下载附件
2024-11-25 18:25 上传
发现它上面有个boolean类型的返回,根据smali代码可知来源于Lcom/junyue/repository/bean/AppConfig;->o0()Z,继续跳转到声明。

1.png (21.22 KB, 下载次数: 0)
下载附件
2024-11-25 18:30 上传
发现还有一个跳转。继续进入x0。这里就是对话框的开关。
public final boolean x0(int i2, j.a0.c.l lVar, boolean z, boolean z2, boolean z3) {
AdInfo invoke;
boolean z4 = false;
z4 = false;
z4 = false;
z4 = false;
z4 = false;
z4 = false;
if (z2 && z0()) {
return false;
}
if (z && i0()) {
return false;
}
AllAdConfig z5 = z();
if (z5 != null) {
try {
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (!z5.adSwitch) {
return false;
}
long currentTimeMillis = System.currentTimeMillis() - App.r().getPackageManager().getPackageInfo(App.r().getPackageName(), 0).firstInstallTime;
if (z3 && z5.installAfterAd != 0) {
if (currentTimeMillis
修改方法也比较简单,代码开头进行了初始化。保留那一行就行了,其余全部删掉。
[Asm] 纯文本查看 复制代码.method public final x0(ILj/a0/c/l;ZZZ)Z
.registers 11
const/4 v0, 0x0
return v0
.end method