立即注册,突破游客限制,与技术大牛交流切磋,畅享海量资源,让你的技术之路不再孤单!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1.先将ApkS格式转换成Apk格式(基本都会,我就不教了)
2.用Activity记录发现,这个App一直都是同一个Activity(包括会员购买界面)即“com.ikame.app.translate_3.MainViewModel”
3.用dex编辑器++,搜"com.ikame.app.translate_MainViewModel"搜索类型为类名
4.进入“MainViewModel”中并转Java分析
-
- package com.ikame.app.translate_3;
-
- import ak.f;
- import an.k0;
- import android.content.SharedPreferences.Editor;
- import androidx.lifecycle.e1;
- import androidx.lifecycle.k;
- import androidx.lifecycle.w0;
- import com.bumptech.glide.d;
- import com.ikame.app.translate_3.data.local.sharepref.SharePreferenceProvider;
- import com.ikame.app.translate_3.domain.model.iap.ReCheckIapStatus;
- import dn.q;
- import dn.r;
- import dn.v;
- import gn.c;
- import hk.x;
- import java.util.LinkedHashMap;
- import kotlin.Metadata;
- import kotlinx.coroutines.flow.o;
- import ph.e;
- import yg.a;
- import yg.p;
-
- @Metadata(d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\b\u0007\u0018\u00002\u00020\u0001:\u0001\u0002¨\u0006\u0003"}, d2 = {"Lcom/ikame/app/translate_3/MainViewModel;", "Landroidx/lifecycle/e1;", "nc/a", "Translate_3_v1.5.4_(15401)_23_12_2024-13_56_release"}, k = 1, mv = {1, 9, 0})
- public final class MainViewModel extends e1 {
- public final w0 b;
- public final a c;
- public final f d;
- public final x e;
- public final r f;
- public final o g;
- public final r h;
-
- public MainViewModel(w0 w0Var, a aVar, f fVar, e eVar, c cVar, x xVar) {
- qi.c.I(w0Var, "savedStateHandle");
- qi.c.I(aVar, "processAppSession");
- qi.c.I(fVar, "remoteConfigController");
- qi.c.I(xVar, "moshi");
- this.b = w0Var;
- this.c = aVar;
- this.d = fVar;
- this.e = xVar;
- Boolean bool = Boolean.FALSE;
- LinkedHashMap linkedHashMap = w0Var.d;
- String str = "KEY_SAVE_CONFIG_ADS_THROUGH_KILL_PROCESS";
- Object obj = linkedHashMap.get(str);
- if (obj == null) {
- LinkedHashMap linkedHashMap2 = w0Var.a;
- if (!linkedHashMap2.containsKey(str)) {
- linkedHashMap2.put(str, bool);
- }
- obj = v.b(linkedHashMap2.get(str));
- linkedHashMap.put(str, obj);
- linkedHashMap.put(str, obj);
- }
- this.f = new r((q) obj);
- o b = v.b(ReCheckIapStatus.N_A);
- this.g = b;
- this.h = new r(b);
- d.N(k.i(this), cVar, null, new 1(this, null), 2);
- d.N(k.i(this), k0.c, null, new 1(this, null), 2);
- kotlinx.coroutines.flow.e.i(qi.c.n0(((com.ikame.app.translate_3.data.iap.a) eVar.a).d(), new 1(this, null)), k.i(this));
- }
-
- public final void e(boolean z, boolean z2) {
- Boolean valueOf = Boolean.valueOf(z);
- a aVar = this.c;
- SharePreferenceProvider sharePreferenceProvider = aVar.b;
- Editor edit = sharePreferenceProvider.a.edit();
- String str = "KEY_SAVE_STATE_REMOVE_AD";
- if (valueOf instanceof String) {
- edit.putString(str, (String) valueOf);
- } else if (valueOf instanceof Float) {
- edit.putFloat(str, ((Number) valueOf).floatValue());
- } else if (valueOf instanceof Integer) {
- edit.putInt(str, ((Number) valueOf).intValue());
- } else if (valueOf instanceof Long) {
- edit.putLong(str, ((Number) valueOf).longValue());
- } else {
- edit.putBoolean(str, valueOf.booleanValue());
- }
- edit.apply();
- valueOf = Boolean.valueOf(z2);
- Editor edit2 = sharePreferenceProvider.a.edit();
- String str2 = "KEY_SAVE_STATE_UNLOCK_FEATURE";
- if (valueOf instanceof String) {
- edit2.putString(str2, (String) valueOf);
- } else if (valueOf instanceof Float) {
- edit2.putFloat(str2, ((Number) valueOf).floatValue());
- } else if (valueOf instanceof Integer) {
- edit2.putInt(str2, ((Number) valueOf).intValue());
- } else if (valueOf instanceof Long) {
- edit2.putLong(str2, ((Number) valueOf).longValue());
- } else {
- edit2.putBoolean(str2, valueOf.booleanValue());
- }
- edit2.apply();
- o oVar;
- Object value;
- do {
- oVar = aVar.d;
- value = oVar.getValue();
- ((p) value).getClass();
- } while (!oVar.i(value, new p(z, z2)));
- }
- }
复制代码
可以发现“KEY_SAVE_STATE_REMOVE_AD”和
“KEY_SAVE_STATE_UNLOCK_FEATURE”这2个关键词中文翻译分别是保存“移除广告”状态的键和保存“解锁功能”状态的键 再接合会员购买界面中会员的权益,可以判断这个类是关键,进一步分析Java代码可以发现 这些代码将两个布尔值分别存储到 SharedPreferences 中,使用"KEY_SAVE_STATE_REMOVE_AD"和 "KEY_SAVE_STATE_UNLOCK_FEATURE"作为键
说明在这段代码中,存储的两个布尔参数z和z2是关键,因此要给它们赋值。经分析我们可以跳转 invoke-direct {v3, p1, p2}, Lyg/p;-><init>(ZZ)V 进行赋值。
5.之后我们跳转到了
- .method public constructor <init>(ZZ)V
- .registers 3
-
- invoke-direct {p0}, Ljava/lang/Object;-><init>()V
-
- iput-boolean p1, p0, Lyg/p;->a:Z
-
- iput-boolean p2, p0, Lyg/p;->b:Z
-
- return-void
- .end method
复制代码
经分析可知存储的两个布尔参数z和z2是通过
“iput-boolean p1, p0, Lyg/p;->a:Z”
和“iput-boolean p2, p0, Lyg/p;->b:Z”获得的,因此直接
“ const/4 p2, 0x1”“const/4 p1, 0x1”即可
即
- method public constructor <init>(ZZ)V
- .registers 3
-
- invoke-direct {p0}, Ljava/lang/Object;-><init>()V
- const/4 p1, 0x1#按如图所示赋值即可
- iput-boolean p1, p0, Lyg/p;->a:Z
- const/4 p2, 0x1#按如图所示赋值即可
- iput-boolean p2, p0, Lyg/p;->b:Z
-
- return-void
- .end method
复制代码
.最后保存并退出即可。
最后再与大家分享“ttytt”的破解教程
链接
https://nixiang.tech/forum.php?mod=viewthread&tid=244&mobile=2 |