hidden-dex-minidemo 把业务实现编成加密 DEX。运行时由 so 解密后在内存里加载。主 DEX 只保留公开接口。
hidden-dex-minidemo 隐藏的是 自管理来电实现,不是整个 App。宿主只依赖公开 SDK。真正的 HiddenLandingPage 在构建期打成加密 DEX,放入 AAR 的 assets/。进程启动后,由 libhiddendecrypt.so 解密,并在内存里加载。
这只能提高静态分析成本,并不能彻底防止反编译。so 仍可被 hook,密钥仍须由接入方保管。用 JADX 打开主 DEX,只能看到
HiddenSdk.invoke(Int, Any?, Any?)。下载示例
可运行工程与本文档对应,归在 Android 分类。解压后用 Android Studio 打开。
hidden-dex-minidemo
Android把业务实现编成加密 DEX。运行时由 so 解密后在内存里加载。主 DEX 只保留公开接口。
hidden-dex-minidemo.zip · 139 KB
产物如何拆分
接入方拿到的 AAR:
hidden-sdk-1.0.0.aar
├── classes.jar
│ ├── HiddenSdk
│ └── HiddenInitResult
├── jni/*/libhiddendecrypt.so
├── assets/payload/hidden.dex.enc
└── proguard.txt
公开接口只剩:
object HiddenSdk {
fun init(context: Context, payloadKey: String?): HiddenInitResult
fun invoke(op: Int, a: Any? = null, b: Any? = null): Any?
}
:hidden-landing-page 只在 SDK 仓库里编 jar → d8 → AES-256-GCM,不要给宿主 implementation。
| 模块 | 给接入方吗 | 进主 DEX? |
|---|---|---|
:hidden-sdk | 只交付这个 AAR | 接口、JNI、KeepAlive 占位类 |
:hidden-landing-page | 不交付 | 否,只进加密 payload |
:app | 不发布 | 权限、清单占位、Compose 页 |
十种加固方式
运行时序
宿主先 init
Application.onCreate 传入 64 个 hex 字符。密钥为空则直接失败,不读取 assets。
so 读密文
AAssetManager 打开 XOR 后的路径 payload/hidden.dex.enc。
AES-GCM 解密
校验 HDX1 头和 GCM tag。明文必须以 dex 开头。
内存里 loadClass
InMemoryDexClassLoader 加载 XOR 后的 HiddenLandingPage,并核对 ABI。
invoke 分发
Java 只传整数指令,native 再通过 GetMethodID 调用实现。
可读的方法名应放在宿主自己的包装里,例如 Demo 的
HostBridge。不要把对照表写进 SDK 源码。下一步
- 从 安卓代码加固(1):加密DEX 了解密文如何生成
- 对照仓库
接入与使用.md查看接入约定 - 到 示例项目 按分类浏览全部可下载工程