安卓 APK 加固 · 上传即加固

安卓 APK 加固
DEX VMP · 防二次签名

上传已签名 APK 即可加固。业务方法进虚拟机,再封进 DEX 胶囊。把钥匙绑在现场签名和目录上,改签或二次打包就解不开。

DEX VMP 加固业务方法进自定义虚拟机
正式版硬绑签名改签即解不开
多 ABI 覆盖arm64 / armv7 / x86_64 / x86
app-release.apk 已加固
封囊 · DEX 胶囊硬绑现场签名证书
DEX VMP 智能抽离业务方法进自定义指令集
白盒密钥保护密钥不以明文驻留内存或表中
assets加密加密包内资源,打开后照常显示

Core Protection

安卓 APK 加固的基座:DEX 胶囊 + VMP

把钥匙硬绑现场签名,改签或二次打包就跑不起来。

封囊 · DEX 胶囊

把 DEX 与 Native 保护封装进单个加密胶囊(AES-GCM)。钥匙从「现场签名证书 + ZIP 目录指纹」派生,二次签名或二次打包即解不开。

DEX VMP 智能虚拟化

每次加固都会做:业务方法抽进自己的虚拟机,Java 里只留跳板,反编译到这就断。界面和系统回调不进去。核心 DEX 分片加密。

Native 运行时自保护

启动时在 Native 层解开胶囊并执行 VMP。正式版同时校验签名与目录,对不上就拒绝运行;壳库与加壳 SO 做内存防 dump。arm64 / armv7 / x86_64 / x86 均覆盖。

How it works

无需源码:四步完成 APK 加固

面向已经打好、签过名的安卓 APK,无需改造工程。

1

上传已签名 APK

在 App 内选择目标包,识别包名与套餐绑定状态。

2

按需勾选模块

开启 assets加密、点名 Dex2C、选择要加壳的 SO、打开环境防护。

3

服务端一体化加固

DEX 胶囊 + VMP 默认执行,硬绑签名,按需 assets加密、Dex2C 与白盒。

4

取回并签名发布

下载未签名产物,须用原证书签名,否则无法运行。

Depth Defenses

DEX VMP 默认执行,纵深防护按需叠加

DEX VMP 随每次 APK 加固默认执行。assets加密、Dex2C、白盒与环境防护按需开启,互不影响。

默认执行

DEX VMP · 业务方法进自定义虚拟机

业务方法抽进自己的虚拟机,Java 里只留跳板。脱完壳也看不到方法体,反编译到这就断了。

界面和系统回调留在原处。字符串会加密。开了 Dex2C 的先转 native,转不了的还是走 VMP。

  • 每次加固都会做,不用单独勾选
  • 私有指令集,一次一包,通用反编译器看不懂
  • 优先抽离加解密、校验等业务逻辑
  • 界面与系统回调保持原样,兼容优先
  • 方法体不完整就不会进虚拟机
正式版可选

assets加密

把应用里的图片、配置、脚本和插件资源加密保存。加固后照常打开,不用改你的代码。

  • 打开后资源正常显示
  • 含广告插件的应用同样适用
  • 部分游戏包会自动跳过
原生编译

关键方法 Dex2C

点名的包或类,能转的编成 native,Java 里不再留方法体。转不了的还是走 VMP。

  • App 内先选 APK,再按包 / 类勾选保护范围
  • 先做 Dex2C,再做 VMP,同一方法不会重复保护
  • 不支持的写法自动留下,交给 VMP
  • 建议只点名加密、校验等关键代码
密钥保护

白盒密钥保护

胶囊密钥经「密钥相关、不可压缩的查表网络」与公开置换交替求值,全程不以连续明文存在于内存或表中,静态与动态都拿不到成型密钥。

  • 抗密钥提取:从表反推密钥等价于黑盒密钥恢复
  • 抗代码搬移:查表体积大且不可压缩,须整体搬走才能复刻
  • 出包前核对求值结果,避免表和实现不一致
  • 诚实说明:是把攻击门槛抬高,并非数学不可破
运行环境

按需环境防护

抓包代理、模拟器、Root、调试、多开分身、反 Hook、截屏限制、完整性看门狗、脱壳探测、SO 加壳,都能单独开关。用得上就开,用不上就关,不给应用平白加负担。

  • 逐个模块独立开关,互不牵连,随便组合都做过兼容
  • 命中高风险环境会给出信号,接不接由你的风控决定
  • 不做「全都打开」的堆料,免得误伤正常用户
  • 完整清单见下方「可选模块」

Optional Modules

可选模块 · 正式版按需开启

以下均可在 App 中逐项勾选。DEX 胶囊与 VMP 默认执行,开通套餐即可硬绑签名并组合其余模块。

assets加密

加密包内资源,打开后照常显示。

关键方法 Dex2C

点名方法编成 native,转不了的还是走 VMP。

白盒密钥保护

白盒求值保护胶囊密钥,抗搬移。

SO 加壳

指定 Native 库加密加载,并做内存防 dump。

抓包 / 代理检测

识别 VPN 与抓包代理环境。

模拟器检测

识别模拟器与虚拟运行环境。

Root 检测

识别 Root / Magisk / su 环境。

调试 / 反 Hook

检测调试附加与 Hook 框架影响。

多开 / 分身检测

识别双开、分身与容器环境。

脱壳 / Dump 探测

识别脱壳与运行时 dump 行为。

完整性看门狗

持续校验关键运行数据防篡改。

截屏 / 录屏限制

限制敏感页面被截屏或录屏。

Flutter Hardening

Flutter 应用加固:libapp 零明文落盘

跨平台应用的业务逻辑主要在 Dart AOT 产物 libapp.so 里。扬帆安全把它加密封装,运行时只在内存里解开、直载进进程,磁盘上不留明文。

跨平台专项

内存直载 · 不 hook 引擎 · 引擎升级不失效

libapp.so 以 AES-GCM 加密打进包里,正式版密钥硬绑现场签名证书。运行时在 Flutter 引擎启动之前,把明文只在内存里解开、直接载入进程,磁盘上不留明文。我们不去 hook libflutter 的内部符号,也不改引擎自己的加载路径,所以引擎升级了照样能跑。

加载后对内存镜像做防 dump(DONTDUMP / WIPEONFORK),并对 libflutter 引擎做完整性基线校验,被替换即拒绝运行。

  • libapp 明文只在内存,磁盘零明文落盘
  • 不 hook libflutter 内部符号,不随引擎升级失效
  • 内存镜像防 dump,libflutter 完整性基线校验
  • 兼容标准 Flutter 构建,无需改造工程

诚实说明:Dart AOT 代码运行时总要在内存里跑,能在进程内执行代码的攻击者还是有机会把它 dump 出来。这是所有 SO 加壳都绕不开的上限,不是这套方案单独的短板。想让逆向更难啃,建议打包时加上 flutter build --obfuscate,把 Dart 的符号和字符串一起混淆,和加壳一起用效果最好。

Honest by Design

只做真实有效的防御

安全没有一招通吃的东西,我们也不摆好看的数字。这一页写到的每一项,都是 App 里能勾到、能自己验的真功能,没抄别人的,也没虚标。

DEX VMP 每次加固都会做:业务方法进自定义虚拟机。需要更深时再点名 Dex2C。把钥匙硬绑现场签名证书和包目录,二次签名或二次打包就解不开。白盒密钥保护在出包前核对结果,确保和设计一致。

处理不了的边角情况,要么保持原逻辑,要么中止出包,不会勉强交出一份有问题的包。

Changelog

更新日志

服务端版本记录。加固引擎与虚拟机随版本一并发布。

1.0.72 2026-08-26

SO 加壳换成一条装载路径:密文只在内存里,明文只写应用私有目录,Flutter 的 libapp 直接载进进程、磁盘不留明文。

  • 加壳 SO 的密文只放在堆内存,解开后马上擦掉,不落盘、也不进 memfd
  • 明文只写进应用私有的 lib 目录(0500 权限),加载时也只认这一条路径
  • Flutter 的 libapp 由进程内直载,引擎映射完就删掉,磁盘上看不到明文
  • 不再按机型 / 厂商分叉,所有版本走同一条路径,少一处出错的地方
1.0.71 2026-08-24

新增可选模块 assets加密:包内资源加密保存,打开后照常显示。

  • 图片、配置、脚本、广告插件资源一并加密
  • 加固后照常打开,不用改应用代码
  • 部分游戏包会自动跳过
1.0.68 2026-08-18

类型按来源一次判定:宿主业务进虚拟机,打进安装包的库对象留在原运行时。

  • DEX 里但不属于宿主的类型按库处理,不再靠「长得像」认 HTTP 客户端
  • android.jar 文档 API(JSON / XML / SAX)与 String 同一层,宿主解析逻辑可进虚拟机
  • R8 抽出来的空转发壳不再进虚拟机,避免全站请求绑到解释器
  • 安装包里已经没有的第三方库不当可保护类型,缺类即留原运行时
1.0.67 2026-08-18

反射与 Handler.post 不再靠跳数:认落点,不还原看不见的边。

  • Handler.post 里才碰到 native 的,挡被 post 的 run();不去 post 的方法、也不按 Runnable 子类型展开
  • Method.invoke / Constructor.newInstance / MethodHandle.invoke* 本身是 native,方法体调用了就留 ART;getMethod 不挡,调用方不反收
1.0.66 2026-08-17

不再按跳数截断:能摸到 native 入口的调用链一律留原运行时,VMP 与 Dex2C 同一条规则。

  • 播放器、CameraX、声明 native、Runtime.exec:invoke 图上到得了就留 ART,不按一跳/两跳截断
  • WebView / 蓝牙胶水只挡方法本身,避免界面编排被掏空;被胶水调用的工具方法、空实现继续保护
1.0.65 2026-08-17

CameraX / Camera2 / 播放器走同一条 native 表面管线;空壳与身份方法不再进虚拟机。

  • 方法体碰到 Surface、CameraX、Camera2、Camera1、ImageReader、MediaCodec、EGL 的是管线种子,其直接调用方留在原运行时;WebView / 蓝牙不收这一跳
  • 布局 ID getter、equals / hashCode / toString 没有保护价值则不抽;XOR、密钥、控制流仍进虚拟机
1.0.64 2026-08-17

加固记录恢复中文软件名;虚拟机 1 参数调用不再走 Call*A,invoke 热路径去掉多余的引用探测。

  • 列表与最近记录显示「软件名 260817083201 1.4.0」,下载文件名同样保留中文
  • 0/1 参数走 Call*;加载器锚点与句柄入表不再 GetObjectRefType
  • 媒体/native 胶水仍留 ART,业务编排继续进虚拟机
1.0.63 2026-08-16

修播放页 JNI 崩溃:直接调到媒体/native 胶水的方法留在原运行时,虚拟机热路径不再套一层易被 hook 的 Call*A。

  • ART 的 Java→Java 不是 JNI。虚拟机 Call* 进「马上再进 native」的播放器胶水,会在友盟 crashsdk 里打成 _fg_jni,主线程被冻住后变成输入 ANR
  • 只把直接 invoke 到 Surface / android.media / 方法体 native 的那一层留在 ART,再往上的编排继续抽离;空实现同名方法不扇出
  • 0 参数调用与 setSurface 走 Call* 而不是 Call*A,调用前不再做 GetObjectRefType / 多余的 IsInstanceOf
1.0.62 2026-08-16

收紧跳过范围、抬高虚拟机参数上限:方法体对象锁与 Handler 下游业务进入保护,单方法最多 16 个参数。

  • 方法体里的 monitor-enter / monitor-exit 由虚拟机执行,不再因此整方法留在原运行时
  • Handler.handleMessage、vsync 回调只挡入口本身,调用下去的业务逻辑继续抽离
  • 虚拟机形参与内部调用最多 16 个参数,覆盖带默认参数的 Kotlin / Java 接口
  • 同步方法、构造器、无法完整翻译的指令仍原样保留
1.0.61 2026-08-15

虚拟机与原生保护统一按系统运行期契约裁决:触达系统边界的方法留在原运行时,业务编排继续抽离。

  • 虚拟机按系统 JNI 规范管理对象引用与异常,异常路径不再导致进程异常退出
  • 原生保护与虚拟机共用同一套判定,只看方法体本身,调用方业务逻辑继续进入保护
  • 方法体触达系统 native、进程或图形表面边界时保留原执行路径,避免破坏系统契约
  • 无法完整翻译的指令与构造器、同步方法原样保留,编不过即退回,不影响加固任务
1.0.60 2026-08-14

业务包识别与大包处理:按清单结构定位宿主,加固过程按分片推进,避免整包压进内存。

  • 业务主包不再只看安装包名:以 Application、启动页所在模块为准,兼容渠道改名与二次签名包
  • Unity、Flutter、uni-app、React Native、Cocos、Capacitor 等运行时宿主不会被误判为业务代码
  • 关键方法点名页取消类数量上限,主业务包与加固引擎使用同一套识别规则
  • 大安装包按类分片写入、只读取 ZIP 目录做指纹,封装阶段不再因堆内存耗尽失败