面试复习题---加固技术原理
Android 加固技术的核心目标是对抗逆向分析、防止代码篡改、保护敏感数据,本质是通过 “加密、混淆、校验、运行时保护” 等手段,大幅提升攻击者的破解成本。其技术体系覆盖 Java 层、Native 层、资源文件、运行时环境 四大维度,以下从核心原理、分层实现、关键技术细节展开解析:
一、Android 加固的核心逻辑
Android 应用的原始包(APK)存在天然安全缺陷:
- Java 层代码(DEX 文件)可通过
dex2jar
+JD-GUI
轻易反编译为可读代码; - Native 层库(SO 文件)可通过
IDA Pro
逆向分析逻辑; - 资源文件(图片、XML)可直接替换篡改;
- 无保护的 APK 可被重打包(修改代码后重新签名)。
加固的核心逻辑是 **“破坏原始代码的可读性,阻断篡改与逆向流程,并在运行时验证完整性”**,整体流程可分为两步:
- 加固阶段(开发者侧):对原始 APK 的关键部分(DEX/SO/ 资源)加密、混淆、注入保护代码,生成 “加固包”;
- 运行阶段(用户侧):加固包启动时,先执行 “壳程序”(Loader),完成解密原始代码、校验完整性、启动保护机制,再加载并执行原始应用。
二、分层加固技术原理
根据 Android 应用的结构(Java 层→Native 层→资源→签名),加固技术按层设计,每层针对性解决该层的安全漏洞。
1. Java 层加固:对抗 DEX 反编译
Java 层是 Android 应用的业务逻辑核心,DEX 文件(Dalvik/ART 可执行文件)是逆向的主要目标,加固重点是 “让 DEX 无法被直接反编译,或反编译后无法理解”。
(1)代码混淆(基础防护)
- 原理:通过重命名类、方法、字段名(如
MainActivity
→a
,onClick
→b
)、删除无用代码(死代码、注释)、打乱代码结构,降低反编译后的可读性。 - 核心工具:
- ProGuard/R8(Android 官方工具):默认集成在 Gradle 构建流程中,支持配置 “保留关键类 / 方法”(如
@Keep
注解),避免混淆后反射失效。 - 自定义混淆工具:商业加固平台(如 360 加固)会在 ProGuard 基础上增加 “控制流混淆”(插入冗余分支、跳转指令,打乱代码执行逻辑)、“字符串加密”(将硬编码字符串(如 API 密钥)加密存储,运行时解密,防止静态搜索)。
- ProGuard/R8(Android 官方工具):默认集成在 Gradle 构建流程中,支持配置 “保留关键类 / 方法”(如
- 局限性:仅防 “静态反编译”,无法阻止攻击者通过动态调试(如 Frida)获取运行时的清晰代码。
(2)DEX 加壳(核心防护)
- 原理:将原始 DEX 文件加密(如 AES/DES 加密),再生成一个 “壳 DEX”(包含解密逻辑和加载逻辑);用户运行时,壳 DEX 先解密原始 DEX,再通过动态加载技术(
DexClassLoader
/BaseDexClassLoader
)加载解密后的 DEX 并执行。 - 关键流程(以 “单 DEX 加壳” 为例):
- 加固阶段: