================================================================
【本版核心】免 Root 一键改包(Agent 从"给方案"升级到"直接出包")
================================================================
之前 Agent 只能告诉你怎么改,现在它能自己把 APK 改好、签好名、推给安装器。
· patch_apk —— 一键改包:把目标方法改成无条件返回指定常量,
输出已重新签名的可安装 APK
· install_patched_apk —— 把改包产物交给系统安装器
· generate_smali_patch —— 只出文本补丁(适合想自己在 MT 里手动改的用户)
配合原有工具组成的完整链路:
analyze_apk → search_strings / list_classes → decompile_class
→ generate_smali_patch(看方案)/ patch_apk(直接出包)
→ install_patched_apk
================================================================
【新增文件】
================================================================
- core/SmaliPatch.kt 把「方法直接返回某值」翻译成 dex 指令 + smali 文本
- core/ApkRebuilder.kt 解 zip → 重建目标方法体 → 剔旧签名 → 重签名
- assets/reversekit_sign.p12 内置固定签名(多次改包可覆盖安装,不用反复卸载)
================================================================
【关键技术点】
================================================================
1. dex 方法体重建用 dexlib2 的 ImmutableMethod 整段替换。
frame 寄存器数 = 参数字宽 + this + 补丁所需寄存器。
dex 规范要求参数寄存器固定占据 frame 末尾,补丁只用低位寄存器,
数学上不可能与参数区重叠,所以不会触发校验失败。
2. 方法匹配严格校验「方法名 + 参数类型 + 返回类型」三者全等,
避免同名重载方法被误伤。
3. resources.arsc 必须保持 STORED 未压缩(targetSdk 30+ 的硬性要求)。
4. META-INF 下的 .SF / .RSA / .DSA / .EC / .MF 全部剔除,
否则 v1 与 v2 签名会相互冲突。
5. 支持的类型:
void / boolean / int(byte,short,char) / long / String / 任意引用类型(null)
暂不支持:float、double(需位转换指令)、构造方法 <init>(拒绝改写)
================================================================
【注意事项】
================================================================
1. 改包后签名与原应用不同,安装前必须先卸载原应用。
若想直接覆盖安装,得让原应用本身就用这个内置签名。
2. 安装后若闪退,说明应用做了签名校验或完整性自检(so 层或 dex 层),
需要另行定位校验方法,这不是改包引擎的问题。
3. 若 APK 用了加固/壳(classes.dex 是壳代码),改包会失败或无效,
提示信息里会说明,需要先脱壳。
4. 提示「在全部 dex 里都没找到方法」时,说明类名/方法签名写错了,
请先 decompile_class 把真实签名看清楚再改。