🧩 Pairip Patches

July 13, 2026 · View on GitHub

🧩 Pairip Patches

一套用于还原被加固 / 抽离应用的 Morphe 补丁集合

Release Morphe Stars


✨ 简介

这是一套基于 Morphe Patcher 的纯字节码补丁,专注于还原被 pairip 加固或代码抽离的 Android 应用

所有补丁在打包阶段直接操作 DEX 字节码,无需 root、无需 Termux、无需运行任何脚本——只要把补丁源加到 Morphe Manager,选好 APK 一键打包即可。

Note

这些补丁基于对开源还原工具逻辑的移植,目标是在 Morphe 生态里复刻“应用内自足”的还原流程。


🚀 一键添加到 Morphe

👉 点此添加到 Morphe Manager 👈

在手机浏览器中打开上面的链接,会自动唤起 Morphe Manager 并添加本补丁源。

或者手动添加:打开 Morphe Manager → 左下角文件夹图标 → Patch Sources 旁的 + → 选择 Remote 标签 → 粘贴下面的地址:

https://github.com/sjshb57/Pairip-Patches

🧩 包含的补丁

v1.10.2  •  main  •  4 patches total

🌐 Universal  •  4 patches
💊 Patch📜 Description⚙️ Options
Inline pairip call wrappersInlines pairip's static call-wrapper stubs ($) back into their call sites and removes the stubs.
Remove pairip protectionRestores obfuscated strings and removes pairip bytecode protection.
Restore extracted methodsInlines methods hidden in $c helper classes back into the host class, then removes those helper and reflection method-holder classes.
Strip debug infoRemoves .line (line numbers) and .source (source file name) debug data from every class. Optional, disabled by default.

Tip

默认情况下,前三个还原补丁已勾选(开箱即用),Strip debug info 为可选项需手动勾选。

📌 补丁原理详解

🔓 Remove pairip protection — 还原 pairip 字符串混淆与 VMRunner 保护

针对使用 pairip 加固的应用,完成以下还原工作:

步骤作用
字符串还原Application 类(或 appkiller / ObjectLogger 风格)提取被混淆的字符串映射,把使用方的 sget-object 还原成 const-string,并清除配套的垃圾 const/4 指令
VMRunner 清空把所有调用 VMRunner 的方法体替换为按返回类型的最小返回
残留清理删除引用 Lcom/pairip/ 的 invoke / 字段访问指令,删除被清空后只剩 return-void 的空 <clinit>
类清除真正删除 com/pairip/ 类与字符串占位类
常量类删除删除 pairip 注入的整数常量容器类(superObject、无方法、无实例字段、仅 static final int 字段且全 app 零引用)
🧬 Restore extracted methods — 还原被抽离到辅助类的方法

针对把方法体抽离到 <主类>$c<数字> 辅助类、主类仅保留反射桩的加固方式:

  • 识别:类名形如 <主类>$c<数字>,且主类存在对应的反射桩(方法体含 Method.invoke)才还原——类名负责“不漏”,桩验证负责“不误伤”,正常的 Kotlin 内部类没有桩会自动跳过
  • 将抽离方法体原样搬回主类对应方法,替换掉原本的 Method.invoke 反射桩,并保留原方法注解(如 @Nullable)
  • 还原完成后删除已处理的 $c 辅助类
  • 删除反射 Method 占位类(带残留引用检查:仍被 sget-object 引用的保留,避免悬空)
🔗 Inline pairip call wrappers — 内联调用转发桩

针对 pairip 把普通调用(invoke-virtual / invoke-static 等)包装成 static synthetic 转发桩、调用点改成 invoke-static 调桩的保护方式:

  • 识别:从已还原的方法体出发,扫调用点的 invoke-static 目标——名字带 $<数字> 后缀、定义在本 app、且桩体是纯转发结构(唯一一条真实 invoke + 可选 move-result + return)三者皆满足才认定为桩
  • 内联:把调用点的 invoke-static {寄存器}, 桩 还原成桩里那条真实调用 invoke-XXX {同一寄存器}, 真实目标,寄存器完全不动
  • 全部调用点替换完后删除桩方法
  • 限定范围:仅处理上一补丁还原过的主类(依赖 Restore extracted methods),正常类一律不碰
🧹 Strip debug info — 清除调试信息(可选)

清除所有类的调试元数据,默认不启用:

  • .source:清除每个类的源文件名(setSourceFile(null))
  • .line:就地清除每条指令所在位置的 debugItems(行号、局部变量等),不重建指令,不影响跳转 / switch / try
  • 适合在还原完成后进一步精简产物体积、去除调试痕迹

Note

该补丁会遍历并修改几乎所有类,打包耗时会明显增加;若仅需还原功能,保持默认不勾选即可。


📖 使用方法

  1. 按上方 一键添加 把补丁源加入 Morphe Manager
  2. 在 Manager 中选择你要修补的 APK 文件
  3. 在补丁列表中勾选需要的补丁(三个还原补丁默认已勾选)
  4. 点击 Patch 开始打包,完成后安装即可

⚠️ 注意事项

Warning

  • 还原补丁(Remove pairip protection / Restore extracted methods / Inline pairip call wrappers)需要真正删除类,会强制启用 FULL 编译模式(完整重写 DEX),代价是打包更慢、更耗内存,低内存设备打包大型应用时可能失败。
  • FULL 模式按线程分段编译,产物可能是多个 DEX,属正常现象,不影响运行(Android 原生支持 multidex)。
  • 还原属于逆向性质的操作,仅供学习研究,请在合法合规的前提下使用。

🛠️ 自行构建

本仓库基于 morphe-patches-template,使用 semantic-release 自动发版。

提交信息遵循 Conventional Commits,版本变化规则如下:

前缀含义版本变化
release:常规发布patch (+0.0.1)
feat:较大新功能minor (+0.1.0)
fix: / perf: / bump:修复 / 优化 / 更新支持patch (+0.0.1)

本地构建:

./gradlew :patches:buildAndroid

产物 .mpp 位于 patches/build/libs/。推送到 main 后,GitHub Actions 会自动构建并发布到 Releases


🙏 致谢

  • Morphe — 补丁引擎与 Manager
  • ReVanced — Morphe 的前身与基础

仅供学习与研究使用 · Made with ❤️ by sjshb57