GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

逆向工程 --- 安卓加固

加固有两种方式,一个是使用成熟的第三方安全厂家比如360,这样的加固方法相对稳定,质量中上,还有一种是自己写加固算法,比如签名验证方法

一、 核心代码加固 (针对 DEX 和 SO 文件)

这是加固技术的核心,直接保护应用的逻辑代码。


1. DEX 文件保护 (Java/Kotlin 代码)
* 整体加壳 (Packer): 这是最常见的加固方式。将原始的 DEX 文件加密或压缩后,存放到一个“壳”DEX
中。应用启动时,首先运行壳代码,在内存中解密并动态加载(DexClassLoader)原始的 DEX。
* 落地加载: 解密后的 DEX 文件会临时存放在设备的私有目录中再加载,容易被从内存中 dump 出来。
* 不落地加载 (内存加载): 解密后的 DEX 直接在内存中加载,不写入磁盘,增加了提取难度。
* 指令抽取/虚拟化 (VMP): 更高级的技术。将一部分或全部核心方法的 Java
字节码指令抽取出来,替换为一个指向原生(Native)代码的调用。这些原生代码实现了一个自定义的虚拟机(VM),用于解释执行原始的字节码。这使得通过 Jadx
等工具直接反编译 DEX 变得几乎不可能,是目前强度最高的保护方式之一。
* 字符串加密: 将代码中硬编码的敏感字符串(如 API Key、URL、加密密钥)进行加密,在运行时动态解密使用,防止静态分析时直接被搜索到。
* 代码混淆 (Obfuscation):
* 名称混淆: 使用无意义的短字符(如 a, b, c)重命名类、方法、变量名。这是最基础的混淆,Android 官方的 R8/ProGuard 就提供此功能。
* 控制流混淆 (Control Flow Obfuscation): 通过插入无用的、复杂的逻辑(如 if-else, switch,
goto),打乱代码的执行流程,使其难以被人类阅读和理解,也可能干扰一些反编译工具的分析。


2. SO 文件保护 (C/C++ Native 代码)
* SO 加壳/加密: 与 DEX 加壳类似,对 .so 文件进行加密,在加载时由壳代码在内存中解密,然后手动加载(类似 dlopen 的原理),而不是由系统直接加载。
* 代码虚拟化 (VMP): 与 DEX VMP 类似,将 SO 文件中的原生 ARM 指令用自定义的虚拟机指令集来替换,极大地提升了逆向分析的难度。
* 代码混淆: 使用如 LLVM-Obfuscator 等工具,对 C/C++ 编译的中间代码(IR)进行混淆,包括:
* 指令替换 (Instruction Substitution): 将简单的指令(如加法)替换为功能相同但更复杂的指令序列。
* 虚假控制流 (Bogus Control Flow): 插入复杂的、永不满足或永远满足的条件跳转,干扰 IDA Pro 等工具的 F5(反汇编到 C 代码)功能。
* 控制流平坦化 (Control Flow Flattening): 将原有的结构化代码(if/else, for/while)改造成一个巨大的 switch-case 循环,使得代码逻辑变得难以追踪。

二、 资源文件加固


1. 资源文件加密: 对 assets 目录、res 目录下的图片、配置文件、数据库等进行加密,并在程序中解密使用。
2. `resources.arsc` 保护: 防止攻击者通过修改 resources.arsc 文件来篡改应用内的文本、图片等资源。


三、 运行环境安全 (反调试、反注入)

这类技术用于检测和对抗动态分析,确保应用运行在可信的环境中。


1. 反调试 (Anti-Debugging):
* Java 层检测: 使用 Debug.isDebuggerConnected() 方法。
* Native 层检测: 这是更可靠的方式。通过轮询 /proc/self/status 文件,检查 TracerPid 字段是否为 0。非 0 值表示有进程(如 gdb, IDA)正在 trace
当前应用。也可以通过 ptrace(PTRACE_TRACEME, 0, 0, 0) 的返回值来判断。
* 时间检测: 通过计算代码执行时间差,判断是否有断点调试导致了非正常的执行暂停。


2. 反篡改/签名校验 (Anti-Tampering):
* 在运行时检查应用自身的签名摘要,与预置在代码中的正版签名摘要进行比对。如果不一致,说明 APK 被重打包,可以执行闪退等逻辑。


3. Root 检测:
* 检查是否存在 su 命令。
* 检查是否存在 Superuser.apk 等 معروف的 root 授权管理应用。
* 尝试向系统目录(如 /system)写入文件,判断是否可写。


4. 模拟器检测:
* 检查 Build 类中的硬件信息(如 Build.MODEL, Build.MANUFACTURER)是否包含 "sdk", "emulator", "generic" 等关键字。
* 检查是否存在 QEMU(模拟器底层)相关的驱动或配置文件。


5. Hook 框架检测 (反注入):
* 检测 Xposed、Frida、Substrate 等框架的特征。例如,检查 Java 虚拟机的调用栈,看是否有来自 Xposed Bridge 的调用;或扫描内存,查找 Frida 的 frida-agent.so
模块。

四、 第三方商业加固平台


以上技术实现复杂,因此市面上出现了许多提供一键加固服务的平台。它们通常会组合使用上述多种技术,并持续更新对抗策略。国内主流的平台包括:


* 腾讯云应用安全 (乐固)
* 网易易盾
* 360 加固保
* 爱加密
* 梆梆安全

总结:


一个强大的加固方案,绝不是单一技术的应用,而是 纵深防御 (Defense in Depth) 的思想。它会将 代码加密/虚拟化、运行时环境检测 和 资源保护
等多种手段结合起来,层层设防。即使一层被攻破,其他层次的保护依然有效,从而最大限度地提升攻击者的成本和时间。

posted on 2025-07-14 11:36  GKLBB  阅读(55)  评论(0)    收藏  举报