VexoraWebServices/CyberArmor
GitHub: VexoraWebServices/CyberArmor
一款 Android APK 加固与防护工具包,通过 DEX 加密、RASP 运行时自我保护和多种反逆向手段,使发布的 APK 能够抵抗反编译、重打包和运行时篡改。
Stars: 0 | Forks: 0
# CyberArmor
**一套内部自研的 Android APK 加固/强化工具包** — 属于与
[360 加固](https://jiagu.360.com/) 同类的工具。它接收已构建好的 APK,提取并加密其 DEX,
隐藏在原生 stub 加载器之后,将清单文件重定向至该加载器,应用运行时
自我保护 (RASP),并对结果重新签名 —— 从而使发布的 APK 能够抵抗
反编译、重打包和运行时篡改。
已在真实设备 (Redmi, Android 14, arm64) 上完成运行时验证:经过加固的应用可通过
stub 启动,在内存中解密其 DEX,并与原始应用运行表现完全一致。
- **各功能详细文档:** [`docs/`](docs/README.md)
- **功能状态矩阵:** [`FEATURES.md`](FEATURES.md)
- **360 加固分析与示例 APK 审查:** [`JIAGU-ANALYSIS.md`](JIAGU-ANALYSIS.md)
- **路线图:** [见下文](#roadmap)
## 目录
1. [架构](#architecture)
2. [前置条件](#prerequisites)
3. [安装与设置](#installation--setup)
4. [快速开始](#quick-start)
5. [CLI 参考](#cli-reference)
6. [保护配置](#protection-profiles)
7. [REST 服务](#rest-service)
8. [工作原理](#how-it-works)
9. [在设备上验证](#verifying-on-a-device)
10. [路线图](#roadmap)
11. [限制与注意事项](#limitations--caveats)
12. [法律声明](#legal)
## 架构
构建时的加壳器是 JVM (Kotlin)。设备上的保护壳**必须**是原生的——它
在 JVM 应用代码之前运行,执行反调试,在内存中解密 DEX,并 hook
运行时。因此该项目必然是多语言的。
| 模块 | 语言 | 运行环境 | 角色 |
|--------|----------|------|------|
| `packer-core` | Kotlin | server | 加固流水线 (库) — DEX 加密、二进制 AXML 清单补丁、zip 重打包、签名 |
| `packer-service` | Kotlin + **Spring Boot 4** | server | REST API:上传 → 加固 → 下载 |
| `packer-cli` | Kotlin + Clikt | server | 命令行加壳器 |
| `shell-native` | C++ / NDK | phone | `libcyberarmor.so` — 反调试、anti-ptrace、RASP 检测器、PLT hooker、透明 asset 解密 |
| `shell-stub` | Java → DEX | phone | `StubApp` 引导加载器 + `CyberArmorAssets` API |
```
INPUT apk ─► extract DEX ─► AES-256-GCM encrypt ─► patch manifest (→ StubApp)
─► inject stub dex + native shell + payload ─► zipalign ─► apksigner ─► OUTPUT apk
```
## 前置条件
| 工具 | 所用版本 | 备注 |
|------|--------------|-------|
| JDK | 21 | Spring Boot 4 基线;需设置 `JAVA_HOME` |
| Android SDK build-tools | 36.1.0 | 提供 `zipalign`、`apksigner`、`d8`、`aapt2` |
| Android NDK | 27.x | 构建原生 shell |
| CMake + Ninja | 3.22 (SDK 内置) | 原生构建 |
| Gradle | 8.14.3 (通过 wrapper) | `./gradlew` — 请勿使用低于 8.14 的系统 Gradle |
Gradle wrapper 固定了 Gradle 8.14.3 (Spring Boot 4 要求 ≥ 8.14)。无需全局 Gradle。
流水线仅会调用 SDK 的 `zipalign`/`apksigner`/`d8`;**不需要 apktool**
(清单文件的编辑是通过内置的二进制 AXML 编辑器完成的,资源永远不会被重新编码)。
## 安装与设置
### 1. 克隆并指向您的 SDK
在仓库根目录下创建 `local.properties`:
```
sdk.dir=/home//Android/Sdk
cyberarmor.buildToolsVersion=36.1.0
cyberarmor.ndkVersion=27.1.12297006
```
(或者导出 `ANDROID_HOME`。如果省略,build-tools/NDK 版本会自动检测为已安装的最新版本。)
### 2. 构建设备端产物 (原生 shell + stub)
```
./shell-native/build-native.sh # -> shell-native/build//libcyberarmor.so (4 ABIs)
./shell-stub/build-stub.sh # -> shell-stub/build/classes.dex
```
### 3. 构建 JVM 模块
```
./gradlew build # compiles + tests packer-core / service / cli
./gradlew :packer-cli:installDist # produces the CLI launcher
```
### 4. 创建签名 keystore (一次即可)
加固后的 APK 总是会被重新签名,因此您需要一个由您控制的密钥:
```
keytool -genkeypair -v -keystore keys/cyberarmor.jks -storepass changeit \
-alias cyberarmor -keypass changeit -keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=CyberArmor"
```
## 快速开始
使用推荐的默认保护配置来加固 APK:
```
./packer-cli/build/install/cyberarmor/bin/cyberarmor \
-i app-release.apk \
-o app-hardened.apk \
--stub-dex shell-stub/build/classes.dex \
--shell-arm64 shell-native/build/arm64-v8a/libcyberarmor.so \
--shell-arm32 shell-native/build/armeabi-v7a/libcyberarmor.so \
--ks keys/cyberarmor.jks --ks-pass changeit --ks-alias cyberarmor
```
输出结果将是已签名 (v1+v2+v3)、已对齐、加固完毕且可随时安装的 APK。
## CLI 参考
```
cyberarmor -i -o [options]
```
| 选项 | 描述 |
|--------|-------------|
| `-i, --input ` | **(必填)** 待加固的原始 APK |
| `-o, --output ` | **(必填)** 加固后 APK 的输出路径 |
| `--stub-dex ` | **(必填)** 编译好的 `StubApp` dex (`shell-stub/build/classes.dex`) |
| `--shell-arm64 ` | 针对 arm64-v8a 的 `libcyberarmor.so` |
| `--shell-arm32 ` | 针对 armeabi-v7a 的 `libcyberarmor.so` |
| `--ks ` | 签名 keystore (省略则不签名 — 仅用于调试) |
| `--ks-pass ` | keystore 密码 |
| `--ks-alias ` | 密钥别名 |
| `--protection ` | `default` (推荐) · `strict` · `none`。见下文 |
| `--protect-asset ` | 加密匹配的 assets,并在运行时透明解密。可重复使用。例如 `--protect-asset "assets/config/keys.json"` |
| `--protect-so` | 加密应用自有的原生库;在内存中透明解密并加载,密钥与签名证书绑定 |
| `--anti-ptrace` | 可选:阻止/检测 ptrace (ART 安全;会禁用原生崩溃 tombstone) |
| `--root-detection` | 可选:拒绝在已 root/Magisk 的设备上运行 |
| `--emulator-detection` | 可选:拒绝在模拟器上运行 |
| `--double-open` | 可选:检测应用分身/双开容器 |
| `--accessibility` | 可选:检测已启用的无障碍服务自动化 |
| `--log-suppress` | 可选:静默应用的 logcat 输出 (PLT hook) |
| `--keep-work` | 将中间构建文件保留在 `work/cli` 下 |
### 示例
最严格的配置 + asset 保护:
```
cyberarmor -i app.apk -o app-hardened.apk \
--stub-dex shell-stub/build/classes.dex \
--shell-arm64 shell-native/build/arm64-v8a/libcyberarmor.so \
--shell-arm32 shell-native/build/armeabi-v7a/libcyberarmor.so \
--protection strict \
--protect-asset "assets/*.json" \
--ks keys/cyberarmor.jks --ks-pass changeit --ks-alias cyberarmor
```
仅加壳 (无运行时防护),适用于调试启动过程:
```
cyberarmor -i app.apk -o app-packed.apk --protection none \
--stub-dex shell-stub/build/classes.dex \
--shell-arm64 shell-native/build/arm64-v8a/libcyberarmor.so \
--ks keys/cyberarmor.jks --ks-pass changeit --ks-alias cyberarmor
```
## 保护配置
| 防护项 | `none` | `default` | `strict` |
|-------|:---:|:---:|:---:|
| DEX 加密 + 内存加载 | ✓ | ✓ | ✓ |
| 重新签名 (v1+v2+v3) | ✓ | ✓ | ✓ |
| 签名校验 (防重打包) | | ✓ | ✓ |
| 文件完整性校验 | | ✓ | ✓ |
| 反调试 (TracerPid) | | ✓ | ✓ |
| Anti-Frida / Xposed | | ✓ | ✓ |
| 防截屏 (FLAG_SECURE) | | ✓ | ✓ |
| 防劫持 (触摸遮挡检测) | | ✓ | ✓ |
| Anti-ptrace | | | ✓ |
| Root / 模拟器检测 | | | ✓ |
| 双开 / 无障碍服务检测 | | | ✓ |
| 日志抑制 | | | ✓ |
任何仅限 `strict` 的防护项都可以通过其单独的标志添加到 `default` 中。
Asset 保护是独立的 —— 可将 `--protect-asset` 添加到任何配置中。
## REST 服务
Spring Boot 4 服务通过 HTTP 暴露相同的流水线。请在 `packer-service/src/main/resources/application.yml` (`cyberarmor.stub-dex`、
`cyberarmor.native-shells`、`cyberarmor.signing`) 中配置服务端的产物
路径,然后:
```
./gradlew :packer-service:bootRun
```
| 方法 | Endpoint | 用途 |
|--------|----------|---------|
| `POST` | `/api/harden` (multipart `apk`) | 提交 APK → 返回作业 id (202) |
| `GET` | `/api/harden/{id}` | 作业状态及步骤报告 |
| `GET` | `/api/harden/{id}/download` | 下载加固后的 APK |
```
curl -F apk=@app-release.apk http://localhost:8080/api/harden # -> {"id": "...", ...}
curl http://localhost:8080/api/harden/ # status
curl -OJ http://localhost:8080/api/harden//download # hardened apk
```
## 工作原理
**构建时** (`packer-core`):直接从 APK zip 中读取原始 `classes*.dex` 和二进制 `AndroidManifest.xml`
→ 使用 AES-256-GCM 将 DEX 加密进 `assets/cyberarmor.payload` 中 (数据
密钥由原生 shell 持有的 KEK 加密包裹) → 精准地将清单文件的
`application android:name` 修补为 `com.cyberarmor.stub.StubApp` (按 resource-id 排序的二进制 AXML 编辑;
资源不会被触及) → 将包含 stub dex、原生 shell、payload 和
防护元数据的内容重新打包至 zip → `zipalign` → `apksigner`。
**运行时** (`shell-stub` + `shell-native`):`StubApp.attachBaseContext` 会加载
`libcyberarmor.so`,运行已启用的防护,验证签名证书和 payload 哈希,
使用来自原生的 KEK 解密 DEX,并将其注入到应用的 classloader 中
(`InMemoryDexClassLoader` 合并至基础的 `PathClassLoader` 中),从而使原始代码——包括
清单文件中声明的组件——能够正常解析。受保护的 asset 会被解密,并
通过 `AssetManager.nativeOpenAsset` 的原生 hook 透明地提供服务。
## 在设备上验证
```
adb install -r -d app-hardened.apk
adb shell monkey -p -c android.intent.category.LAUNCHER 1
adb logcat | grep -i CyberArmor # guard/init messages (unless --log-suppress)
```
当使用 `--protection default`/`strict` 时,`FLAG_SECURE` 会开启,因此**应用的屏幕截图会显示为
纯黑** —— 这说明防截屏功能已生效,而不是出现了 bug。如果您需要对 UI 进行截图,请使用 `--protection none` 进行构建。
## 路线图
各功能的详细状态请见 [`FEATURES.md`](FEATURES.md);每个已交付的功能在
[`docs/`](docs/README.md) 下都有对应的页面。本项目按阶段进行组织:
### ✅ 阶段 1 — 加壳器 MVP (已完成)
DEX AES-256-GCM 加密 + 内存加载、精准的二进制 AXML 清单重定向、
原始 zip 重打包 (资源不重新编码)、`zipalign` + `apksigner` (v1+v2+v3)。
### ✅ 阶段 2 — 完整性与核心 RASP (已完成)
签名校验 (防重打包)、文件完整性检查、每次构建唯一的指纹、
反调试、anti-Frida/Xposed、`FLAG_SECURE` 防截屏、防劫持。
### ✅ 阶段 3 — Assets、运行时防护与 Hook (已完成)
透明 asset 加密 (原生 `AssetManager` hook)、root/模拟器/双开/无障碍服务
检测 (可选)、ART 安全的 anti-ptrace (可选)、PLT/GOT hooker、日志泄露防护。
### 🟡 阶段 3b — 强力混淆 (进行中)
- ✅ **SO 保护/防盗 (B1/B2)** — 加密应用自有的 `.so`;原生内存
加载器 (`memfd` + `android_dlopen_ext` hook),与签名证书绑定。已在设备上验证
(`--protect-so`)。同时已落地:健壮的自定义 Application 替换机制 (适用于 Hilt/Dagger 应用)。
- ⬜ **字符串加密 (A2)** — DEX 指令重写:`const-string` → 解密调用。
- ⬜ **本地文件保护 (D2)** — 针对应用私有存储 / SharedPreferences 的运行时加密。
- ⬜ **透明 asset/SO hook 强化** — 对 libandroidfw ABI 耦合的多 Android 版本验证。
### 🧊 阶段 4 — VMP 层级 (长期 R&D)
DEX VMP、生命周期/注册类 VMP、Dex2C、QDEX、Dex Shadow、完全/自定义 VMP,以及
内存篡改检测 (代码段校验和)。这些需要自定义字节码 VM 和/或
原生代码生成 — 见 [`docs/roadmap.md`](docs/roadmap.md)。
## 限制与注意事项
- **透明 asset 保护与 ABI 存在耦合**,依赖于 `libandroidfw` 符号
(`Asset::createFromFd`、`AssetManager2::Open`),已在 Android 14 上验证。它会
按名称解析符号,如果符号缺失则安全地执行空操作 (no-op但建议在每个主要 Android 版本上进行重新验证。
- **`--anti-ptrace` 会禁用原生崩溃 tombstone** (通过 `PR_SET_DUMPABLE(0)`)。如果应用
自带了 NDK 崩溃报告器,请保持关闭。
- **脚手架 KEK 是一个占位符**,与原生 shell 共享。对于生产环境,请将
每次构建唯一的 KEK 烧录进新编译的 shell 中 (见 `shell-native/README.md`)。
- 高级 VMP / Dex2C / 字符串加密层级尚未实现 — 见 `FEATURES.md`。
## 法律声明
请仅对您的组织拥有或获得明确授权可进行重打包和重新签名的 APK 进行加固。
重新签名会改变应用的标识,并使原始签名失效。
标签:Android开发, C++, Kotlin, Spring Boot, 代码保护, 后台面板检测, 应用加固, 数据擦除, 移动端安全