SO 加壳换成一条装载路径:密文只在内存里,明文只写应用私有目录,Flutter 的 libapp 直接载进进程、磁盘不留明文。
- 加壳 SO 的密文只放在堆内存,解开后马上擦掉,不落盘、也不进 memfd
- 明文只写进应用私有的 lib 目录(0500 权限),加载时也只认这一条路径
- Flutter 的 libapp 由进程内直载,引擎映射完就删掉,磁盘上看不到明文
- 不再按机型 / 厂商分叉,所有版本走同一条路径,少一处出错的地方
Core Protection
把钥匙硬绑现场签名,改签或二次打包就跑不起来。
把 DEX 与 Native 保护封装进单个加密胶囊(AES-GCM)。钥匙从「现场签名证书 + ZIP 目录指纹」派生,二次签名或二次打包即解不开。
每次加固都会做:业务方法抽进自己的虚拟机,Java 里只留跳板,反编译到这就断。界面和系统回调不进去。核心 DEX 分片加密。
启动时在 Native 层解开胶囊并执行 VMP。正式版同时校验签名与目录,对不上就拒绝运行;壳库与加壳 SO 做内存防 dump。arm64 / armv7 / x86_64 / x86 均覆盖。
How it works
面向已经打好、签过名的安卓 APK,无需改造工程。
在 App 内选择目标包,识别包名与套餐绑定状态。
开启 assets加密、点名 Dex2C、选择要加壳的 SO、打开环境防护。
DEX 胶囊 + VMP 默认执行,硬绑签名,按需 assets加密、Dex2C 与白盒。
下载未签名产物,须用原证书签名,否则无法运行。
Depth Defenses
DEX VMP 随每次 APK 加固默认执行。assets加密、Dex2C、白盒与环境防护按需开启,互不影响。
业务方法抽进自己的虚拟机,Java 里只留跳板。脱完壳也看不到方法体,反编译到这就断了。
界面和系统回调留在原处。字符串会加密。开了 Dex2C 的先转 native,转不了的还是走 VMP。
把应用里的图片、配置、脚本和插件资源加密保存。加固后照常打开,不用改你的代码。
点名的包或类,能转的编成 native,Java 里不再留方法体。转不了的还是走 VMP。
胶囊密钥经「密钥相关、不可压缩的查表网络」与公开置换交替求值,全程不以连续明文存在于内存或表中,静态与动态都拿不到成型密钥。
抓包代理、模拟器、Root、调试、多开分身、反 Hook、截屏限制、完整性看门狗、脱壳探测、SO 加壳,都能单独开关。用得上就开,用不上就关,不给应用平白加负担。
Optional Modules
以下均可在 App 中逐项勾选。DEX 胶囊与 VMP 默认执行,开通套餐即可硬绑签名并组合其余模块。
加密包内资源,打开后照常显示。
点名方法编成 native,转不了的还是走 VMP。
白盒求值保护胶囊密钥,抗搬移。
指定 Native 库加密加载,并做内存防 dump。
识别 VPN 与抓包代理环境。
识别模拟器与虚拟运行环境。
识别 Root / Magisk / su 环境。
检测调试附加与 Hook 框架影响。
识别双开、分身与容器环境。
识别脱壳与运行时 dump 行为。
持续校验关键运行数据防篡改。
限制敏感页面被截屏或录屏。
Flutter Hardening
跨平台应用的业务逻辑主要在 Dart AOT 产物 libapp.so 里。扬帆安全把它加密封装,运行时只在内存里解开、直载进进程,磁盘上不留明文。
libapp.so 以 AES-GCM 加密打进包里,正式版密钥硬绑现场签名证书。运行时在 Flutter 引擎启动之前,把明文只在内存里解开、直接载入进程,磁盘上不留明文。我们不去 hook libflutter 的内部符号,也不改引擎自己的加载路径,所以引擎升级了照样能跑。
加载后对内存镜像做防 dump(DONTDUMP / WIPEONFORK),并对 libflutter 引擎做完整性基线校验,被替换即拒绝运行。
诚实说明:Dart AOT 代码运行时总要在内存里跑,能在进程内执行代码的攻击者还是有机会把它 dump 出来。这是所有 SO 加壳都绕不开的上限,不是这套方案单独的短板。想让逆向更难啃,建议打包时加上 flutter build --obfuscate,把 Dart 的符号和字符串一起混淆,和加壳一起用效果最好。
Honest by Design
安全没有一招通吃的东西,我们也不摆好看的数字。这一页写到的每一项,都是 App 里能勾到、能自己验的真功能,没抄别人的,也没虚标。
DEX VMP 每次加固都会做:业务方法进自定义虚拟机。需要更深时再点名 Dex2C。把钥匙硬绑现场签名证书和包目录,二次签名或二次打包就解不开。白盒密钥保护在出包前核对结果,确保和设计一致。
处理不了的边角情况,要么保持原逻辑,要么中止出包,不会勉强交出一份有问题的包。
Changelog
服务端版本记录。加固引擎与虚拟机随版本一并发布。
SO 加壳换成一条装载路径:密文只在内存里,明文只写应用私有目录,Flutter 的 libapp 直接载进进程、磁盘不留明文。
新增可选模块 assets加密:包内资源加密保存,打开后照常显示。
类型按来源一次判定:宿主业务进虚拟机,打进安装包的库对象留在原运行时。
反射与 Handler.post 不再靠跳数:认落点,不还原看不见的边。
不再按跳数截断:能摸到 native 入口的调用链一律留原运行时,VMP 与 Dex2C 同一条规则。
CameraX / Camera2 / 播放器走同一条 native 表面管线;空壳与身份方法不再进虚拟机。
加固记录恢复中文软件名;虚拟机 1 参数调用不再走 Call*A,invoke 热路径去掉多余的引用探测。
修播放页 JNI 崩溃:直接调到媒体/native 胶水的方法留在原运行时,虚拟机热路径不再套一层易被 hook 的 Call*A。
收紧跳过范围、抬高虚拟机参数上限:方法体对象锁与 Handler 下游业务进入保护,单方法最多 16 个参数。
虚拟机与原生保护统一按系统运行期契约裁决:触达系统边界的方法留在原运行时,业务编排继续抽离。
业务包识别与大包处理:按清单结构定位宿主,加固过程按分片推进,避免整包压进内存。