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, 代码保护, 后台面板检测, 应用加固, 数据擦除, 移动端安全