|
|
本帖最后由 Mtawei 于 2026-5-10 01:16 编辑
Mt去签黑屏,np去签部分功能失效,输入法键盘无法调出,本人小白-技术有限。
随便签名看崩溃日志,这也去脱修必看的。
一、问题分析
- 1778328230.144 12690 7147 7147 I Process : Quit itself, Pid:7147 StackTrace:java.lang.reflect.Method.invoke:-2 app.flz.g:62 app.flz.e:3 app.epo.a:54 com.iflytek.inputmethod.FlyApp.<init>:14
- java.lang.Class.newInstance:-2 android.app.AppComponentFactory.instantiateApplication:76 androidx.core.app.CoreComponentFactory.instantiateApplication:0 android.app.Instrumentation.newApplication:1367 android.app.LoadedApk.makeApplicationInner:1566异常日志
复制代码
问题:签名不匹配 → 触发自杀机制
二、第一层防护:签名校验自杀(app/flz + app/epo)2.1 分析 app/flz(反射自杀器)
- # app/flz.smali
- # 各种场景调用入口
- .method public static e(Ljava/lang/String;)V
- const-string v0, "Signature"
- invoke-static {v0, p0}, Lapp/flz;->g(Ljava/lang/String;Ljava/lang/String;)V
- .end method
- # 核心自杀逻辑
- .method private static g(Ljava/lang/String;Ljava/lang/String;)V
- :try_start_0
- # 字符串反转还原:
- # "ssecorP.so.diordna" → "android.os.Process"
- # "ssecorPllik" → "killProcess"
- # "diPym" → "myPid"
-
- invoke-static {p0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
- invoke-virtual {p0, p1, v1}, Ljava/lang/Class;->getDeclaredMethod(...)Ljava/lang/reflect/Method;
- invoke-virtual {p0, v2, v1}, Ljava/lang/reflect/Method;->invoke(...)Ljava/lang/Object;
- :try_end_40
- .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_40} :catch_40
-
- :catch_40
- return-void
- .end method
复制代码
原理:通过反射调用 android.os.Process.killProcess(android.os.Process.myPid()) 自杀
2.2 分析 app/epo(签名校验类)
- # app/epo.smali
- .method public static a()V
- :try_start_0
- invoke-static {}, Lapp/epo;->b()Landroid/content/pm/PackageInfo;
- move-result-object v0
-
- if-nez v0, :cond_b
- # 获取签名失败,标记异常
- sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean;
- sput-object v0, Lapp/jxi;->e:Ljava/lang/Boolean;
- return-void
-
- :cond_b
- # 获取签名并计算 SHA1
- iget-object v0, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;
- aget-object v0, v0, v1
- invoke-virtual {v0}, Landroid/content/pm/Signature;->toByteArray()[B
- invoke-static {v0}, Lcom/iflytek/common/util/security/HashUtils;->sha1([B)Ljava/lang/String;
- move-result-object v0
-
- # 与硬编码哈希比较
- const-string v1, "454c01daeadca0eefa742dcb1171b7ac07e22b84"
- invoke-static {v1}, Lcom/iflytek/common/util/data/StringUtils;->reverse(Ljava/lang/String;)Ljava/lang/String;
- move-result-object v1
- invoke-static {v0, v1}, Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
- move-result v1
-
- # 写入校验结果到 jxi.e
- invoke-static {v1}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
- move-result-object v2
- sput-object v2, Lapp/jxi;->e:Ljava/lang/Boolean;
-
- # 关键判断:签名不匹配时调用 flz.e() 自杀
- if-eqz v1, :cond_3d # 如果 v1 == false (不匹配),跳转到 :cond_3d
- invoke-static {v0}, Lapp/flz;->e(Ljava/lang/String;)V # ← 签名匹配时反而调用?不对...
- :try_end_38
- .catchall {:try_start_0 .. :try_end_38} :catchall_39
复制代码
注意:这里的 if-eqz 逻辑需要确认方向
2.3 修改方案:绕过签名校验
方案A:修改 epo.a() 强制通过
# 方法1:直接返回,不执行任何校验
.method public static a()V
# 强制设置 jxi.e = true
sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean;
sput-object v0, Lapp/jxi;->e:Ljava/lang/Boolean;
return-void
.end method
方案B:修改比较逻辑
# 第52行,改成无条件跳转
goto :cond_3d # 跳过 flz.e() 调用
方案C:修改硬编码哈希为自己的签名
1. 获取自己签名的 SHA1:
Mt获取,np获取
2.
计算反转字符串:
String original = "你的SHA1";
String reversed = new StringBuilder(original).reverse().toString();
3. 替换 epo.a() 中的硬编码值
三、第二层防护:综合安全检测(app/jxi)
3.1 分析 app/jxi(6项检测中心)
- # app/jxi.smali
- # 6个检测标志位
- .field static a:Ljava/lang/Boolean;
- .field static b:Ljava/lang/Boolean;
- .field static c:Ljava/lang/Boolean;
- .field static d:Ljava/lang/Boolean;
- .field static e:Ljava/lang/Boolean; # ← epo 设置(签名校验)
- .field static f:Ljava/lang/Boolean;
- # 自杀执行方法
- .method public static a()V
- invoke-static {}, Lapp/jxi;->b()Z
- move-result v0
- if-nez v0, :cond_46 # b() 返回 false 时执行自杀
-
- # 反射自杀代码(同 flz.g)
- ...
- .end method
- # 综合校验方法
- .method private static b()Z
- # 检查 6 个标志位,全部为 true 才返回 true
- sget-object v0, Lapp/jxi;->a:Ljava/lang/Boolean;
- if-eqz v0, :cond_49
- sget-object v2, Lapp/jxi;->b:Ljava/lang/Boolean;
- if-eqz v2, :cond_49
- # ... 检查 c/d/e/f
-
- # 逐个判断值
- invoke-virtual {v0}, Ljava/lang/Boolean;->booleanValue()Z
- move-result v0
- if-eqz v0, :cond_49 # a == false → 返回 false
-
- # 检查 b
- sget-object v0, Lapp/jxi;->b:Ljava/lang/Boolean;
- invoke-virtual {v0}, Ljava/lang/Boolean;->booleanValue()Z
- if-eqz v0, :cond_49 # b == false → 返回 false
-
- # ... 检查 c/d/e/f
- # 全部通过
- const/4 v1, 0x1
- return v1
-
- :cond_49
- :goto_49
- return v1 # v1 初始为 0,返回 false
- .end method
复制代码
3.2 修改方案:强制通过所有检测
.method private static b()Z
.registers 1
# 强制所有标志位为 true
sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean;
sput-object v0, Lapp/jxi;->a:Ljava/lang/Boolean;
sput-object v0, Lapp/jxi;->b:Ljava/lang/Boolean;
sput-object v0, Lapp/jxi;->c:Ljava/lang/Boolean;
sput-object v0, Lapp/jxi;->d:Ljava/lang/Boolean;
sput-object v0, Lapp/jxi;->e:Ljava/lang/Boolean;
sput-object v0, Lapp/jxi;->f:Ljava/lang/Boolean;
const/4 v0, 0x1
return v0
.end method
四、第三层防护:插件降级机制(app/o91 + app/oc6)
4.1 分析插件降级
五、第四层防护:LLM 拼音功能限制
5.1 分析 LLMPinyinHelper 省略不贴……
5.2 修改方案
修改1:强制环境检查通过 省略代码不贴……
修改2:强制拼音可用(中文不可以)
- .method public final setPinyinAvailable(Z)V
- .registers 3
- const-string v0, "c_llm_py_available"
- const/4 v1, 0x1 # 强制 true
- invoke-static {v0, v1}, Lcom/iflytek/inputmethod/depend/config/settings/RunConfigBase;->setBoolean(Ljava/lang/String;Z)V
- .end method
复制代码- 文件 方法 修改内容
- `app/epo.smali` `a()V` 强制 `jxi.e = true`,跳过 `flz.e()`
- `app/jxi.smali` `b()Z` 强制 6 个标志位全部为 true
- `app/o91.smali` `i(Lapp/n91;Ljava/util/Set;)Z` 直接返回 false
- `app/oc6.smali` `forceDegrade(...)Z` 直接返回 false
- `LLMPinyinHelper.smali` `checkInstallEnvAvail(...)I` 直接返回 0
- `LLMPinyinHelper.smali` `setPinyinAvailable(Z)V` 强制写入 true
- `LLMPinyinHelper.smali` `getPinyinAvailable()Z` 直接返回 true
复制代码
录了GIF的,提示文件过大。不能上传就不上传了。软件以可以正常进入,上面省略的都是修改后无效的。
论坛:大佬(帅比宝宝)以过签无中文限制包:
https://pan.baidu.com/s/1yDh2luypadfm_KnRPiAO7g?pwd=zu03#/home/%2F/%2F
怎么过中文限制的好奇。
15.0.12过签 过英文 7天有效链接:https://share.feijipan.com/s/ctaAuMgJ
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|