Translate 破解教程

[复制链接]
查看1258 | 回复3 | 2025-7-5 07:36:21 来自手机 | 显示全部楼层 |阅读模式

立即注册,突破游客限制,与技术大牛交流切磋,畅享海量资源,让你的技术之路不再孤单!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1.先将ApkS格式转换成Apk格式(基本都会,我就不教了)

2.用Activity记录发现,这个App一直都是同一个Activity(包括会员购买界面)即“com.ikame.app.translate_3.MainViewModel”

3.用dex编辑器++,搜"com.ikame.app.translate_MainViewModel"搜索类型为类名

4.进入“MainViewModel”中并转Java分析
  1. package com.ikame.app.translate_3;
  2. import ak.f;
  3. import an.k0;
  4. import android.content.SharedPreferences.Editor;
  5. import androidx.lifecycle.e1;
  6. import androidx.lifecycle.k;
  7. import androidx.lifecycle.w0;
  8. import com.bumptech.glide.d;
  9. import com.ikame.app.translate_3.data.local.sharepref.SharePreferenceProvider;
  10. import com.ikame.app.translate_3.domain.model.iap.ReCheckIapStatus;
  11. import dn.q;
  12. import dn.r;
  13. import dn.v;
  14. import gn.c;
  15. import hk.x;
  16. import java.util.LinkedHashMap;
  17. import kotlin.Metadata;
  18. import kotlinx.coroutines.flow.o;
  19. import ph.e;
  20. import yg.a;
  21. import yg.p;
  22. @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})
  23. public final class MainViewModel extends e1 {
  24.     public final w0 b;
  25.     public final a c;
  26.     public final f d;
  27.     public final x e;
  28.     public final r f;
  29.     public final o g;
  30.     public final r h;
  31.     public MainViewModel(w0 w0Var, a aVar, f fVar, e eVar, c cVar, x xVar) {
  32.         qi.c.I(w0Var, "savedStateHandle");
  33.         qi.c.I(aVar, "processAppSession");
  34.         qi.c.I(fVar, "remoteConfigController");
  35.         qi.c.I(xVar, "moshi");
  36.         this.b = w0Var;
  37.         this.c = aVar;
  38.         this.d = fVar;
  39.         this.e = xVar;
  40.         Boolean bool = Boolean.FALSE;
  41.         LinkedHashMap linkedHashMap = w0Var.d;
  42.         String str = "KEY_SAVE_CONFIG_ADS_THROUGH_KILL_PROCESS";
  43.         Object obj = linkedHashMap.get(str);
  44.         if (obj == null) {
  45.             LinkedHashMap linkedHashMap2 = w0Var.a;
  46.             if (!linkedHashMap2.containsKey(str)) {
  47.                 linkedHashMap2.put(str, bool);
  48.             }
  49.             obj = v.b(linkedHashMap2.get(str));
  50.             linkedHashMap.put(str, obj);
  51.             linkedHashMap.put(str, obj);
  52.         }
  53.         this.f = new r((q) obj);
  54.         o b = v.b(ReCheckIapStatus.N_A);
  55.         this.g = b;
  56.         this.h = new r(b);
  57.         d.N(k.i(this), cVar, null, new 1(this, null), 2);
  58.         d.N(k.i(this), k0.c, null, new 1(this, null), 2);
  59.         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));
  60.     }
  61.     public final void e(boolean z, boolean z2) {
  62.         Boolean valueOf = Boolean.valueOf(z);
  63.         a aVar = this.c;
  64.         SharePreferenceProvider sharePreferenceProvider = aVar.b;
  65.         Editor edit = sharePreferenceProvider.a.edit();
  66.         String str = "KEY_SAVE_STATE_REMOVE_AD";
  67.         if (valueOf instanceof String) {
  68.             edit.putString(str, (String) valueOf);
  69.         } else if (valueOf instanceof Float) {
  70.             edit.putFloat(str, ((Number) valueOf).floatValue());
  71.         } else if (valueOf instanceof Integer) {
  72.             edit.putInt(str, ((Number) valueOf).intValue());
  73.         } else if (valueOf instanceof Long) {
  74.             edit.putLong(str, ((Number) valueOf).longValue());
  75.         } else {
  76.             edit.putBoolean(str, valueOf.booleanValue());
  77.         }
  78.         edit.apply();
  79.         valueOf = Boolean.valueOf(z2);
  80.         Editor edit2 = sharePreferenceProvider.a.edit();
  81.         String str2 = "KEY_SAVE_STATE_UNLOCK_FEATURE";
  82.         if (valueOf instanceof String) {
  83.             edit2.putString(str2, (String) valueOf);
  84.         } else if (valueOf instanceof Float) {
  85.             edit2.putFloat(str2, ((Number) valueOf).floatValue());
  86.         } else if (valueOf instanceof Integer) {
  87.             edit2.putInt(str2, ((Number) valueOf).intValue());
  88.         } else if (valueOf instanceof Long) {
  89.             edit2.putLong(str2, ((Number) valueOf).longValue());
  90.         } else {
  91.             edit2.putBoolean(str2, valueOf.booleanValue());
  92.         }
  93.         edit2.apply();
  94.         o oVar;
  95.         Object value;
  96.         do {
  97.             oVar = aVar.d;
  98.             value = oVar.getValue();
  99.             ((p) value).getClass();
  100.         } while (!oVar.i(value, new p(z, z2)));
  101.     }
  102. }
复制代码

可以发现“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.之后我们跳转到了
  1. .method public constructor <init>(ZZ)V
  2.     .registers 3
  3.     invoke-direct {p0}, Ljava/lang/Object;-><init>()V
  4.    
  5.     iput-boolean p1, p0, Lyg/p;->a:Z
  6.    
  7.     iput-boolean p2, p0, Lyg/p;->b:Z
  8.     return-void
  9. .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”即可
即
  1. method public constructor <init>(ZZ)V
  2.     .registers 3
  3.     invoke-direct {p0}, Ljava/lang/Object;-><init>()V
  4.     const/4 p1, 0x1#按如图所示赋值即可
  5.     iput-boolean p1, p0, Lyg/p;->a:Z
  6.     const/4 p2, 0x1#按如图所示赋值即可
  7.     iput-boolean p2, p0, Lyg/p;->b:Z
  8.     return-void
  9. .end method
复制代码

.最后保存并退出即可。

最后再与大家分享“ttytt”的破解教程
链接
https://nixiang.tech/forum.php?mod=viewthread&tid=244&mobile=2
IMG_20250704_205150.png
Screenshot_2025_0704_204338.png
IMG_20250704_205131.png
Screenshot_2025_0704_204505.png
IMG_20250704_205111.png
IMG_20250704_205008.png
IMG_20250704_205053.png
Screenshot_2025_0704_204742.png
IMG_20250704_205038.png
IMG_20250704_205023.png
这个人还没有签名
zaq123 | 2025-7-5 12:22:35 来自手机 | 显示全部楼层
补充一下一个快速破解法(基于上述分析)
搜正则表达式
\.method public constructor <init>\(ZZ\)V\s+\.registers 3\s+invoke-direct \{(.*)\}, Ljava/lang/Object;-><init>\(\)V\s+iput-boolean (.*), (.*), Lyg/p;->a:Z\s+iput-boolean (.*), (.*), Lyg/p;->b:Z\s+return-void\s+\.end method
搜索类型为“代码”

之后替换成
.method public constructor <init>(ZZ)V
    .registers 4
    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
类型为“代码”(替换时要勾选正则表达式)
Screenshot_2025_0705_074503.png
Screenshot_2025_0705_121622.png
这个人还没有签名
logic | 2025-7-5 23:40:46 来自手机 | 显示全部楼层
支持大佬
这个人还没有签名
661784 | 2025-7-16 18:42:12 来自手机 | 显示全部楼层
看看吧
这个人还没有签名
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文推荐
大神求
大神求
6 天前
热门排行