应用安全 --- 应知应会 之 app加固方法大全
App 加固技术全景图
App加固的核心思想是 “隐藏” 和 “混淆”。它覆盖了从代码、资源到运行环境的各个层面。
一、代码层面加固
这是最核心的加固领域,直接针对应用的执行逻辑进行保护。
加固方法 | 原理描述 | 优点 | 缺点 |
---|---|---|---|
DEX 加壳 | 对原始DEX文件进行加密或压缩,并与一个外壳DEX一起打包。运行时由外壳DEX负责解密并在内存中加载原始DEX。 | 有效防止静态分析,对抗反编译工具。 | 影响启动速度;内存dump可破解。 |
名称混淆 (Obfuscation) | 重命名类、方法、字段名为无意义的字符(如a, b, c)。 | 大幅降低代码可读性;简单有效。 | 不影响逻辑执行,可通过动态分析理解。辅助ai去理解函数作用 |
控制流扁平化 (Control Flow Flattening) | 打破代码原有的线性或分支结构,将所有基本块压平到同一个层级,通过一个调度器来控制执行流程。 | 极大增加逆向分析难度,使反编译工具生成的代码难以理解。 | 有一定性能开销;经验丰富的分析者仍可跟踪。控制流追踪加ai辅助理解 |
指令虚拟化VMP | 将标准的Dalvik字节码或Native指令转换为自定义的指令集(字节码),并在App内嵌一个自定义的“虚拟机”来解释执行这些新指令。保护APP的生命周期函数,例如onResume、onStart等,onCreate函数除外。 | 强度极高,逆向分析者必须首先理解这个自定义的VM,否则无法还原原始逻辑。 | 性能开销巨大;通常只用于保护最核心的算法。可以用最小指令,原始指令集追踪的方法还原,加ai |
Native化 (Dex2C) | 将关键的Java/Kotlin代码翻译成C/C++代码,并编译为本地库(.so文件)。 | 利用Native代码逆向难度远大于Java的特点进行保护。 | 开发调试复杂;存在跨平台问题(ARM, x86等)。用ai分析 |
花指令插入 (Junk Code Insertion) | 在代码中插入永远不会被执行的无效指令或代码块。 | 干扰反编译工具,导致其分析错误或崩溃。 | 容易被识别并手动去除。 |
apk代码压缩 |
APK大小优化的原理核心目标: 减少APK文件的体积,使用户下载更快、安装成功率更高、占用磁盘空间更少。 实现原理:
|
增强性能 | |
字符串加密 |
将url,密钥等其他字符串进行加密混淆 |
二、资源文件加固
保护应用的静态资源,防止被窃取和篡改。
加固方法 | 原理描述 | 优点 | 缺点 |
---|---|---|---|
1. 资源压缩/加密 | 对 resources.arsc 、图片、音频等资源进行压缩或加密存储,运行时再动态解密。 |
防止资源被直接提取和查看。 | 增加运行时内存占用和加载时间。ai分析解密方法 |
2. 资源混淆 | 将资源文件的名称(如 layout/main.xml 混淆为 a/b/c.xml )。 |
防止通过资源名称猜测功能模块。 | 需要维护混淆映射表。ai分析代码作用 |
三、运行时环境加固 (RASP - Runtime Application Self-Protection)
应用在运行时进行自我检测和保护,对抗动态分析。
加固方法 | 原理描述 | 优点 | 缺点 |
---|---|---|---|
1. 反调试 (Anti-Debugging) | 检测调试器连接(检查TracerPid 、ptrace 自身等),一旦发现则触发退出或执行错误逻辑。 |
有效阻止使用IDA Pro 、GDB 等进行的动态调试。 |
存在多种对抗方法(如Hook检测函数)。 |
2. 反模拟器 (Anti-Emulator) | 检测应用是否运行在模拟器中(检查IMEI、IMSI、传感器、Build属性等)。 | 防止分析者在模拟器中快速批量分析App。 | 真机也可能有类似特征,存在误报风险。去除模拟器特征 |
3. 反Hook/注入 (Anti-Hook) | 检测自身内存是否被Frida、Xposed等Hook框架修改(校验内存关键代码段CRC、扫描加载的库等)。 | 能有效发现常见的注入和Hook行为。 | 与Hook框架的对抗是持续的“军备竞赛”。 |
4. 环境完整性检测 | 检测设备是否已Root、SuperSU/Magisk、等管理工具、是否安装了Xposed框架。app多开 | 防止应用在高风险环境中运行。 | 存在多种隐藏Root和Xposed的方法。 |
5. 内存保护 | 防止核心数据和代码在内存中被Dump(如短信验证码、加密密钥)。底层实现原理是:通过自定义加载器对加密代码进行碎片化动态解密,确保明文字节码从未以完整形态驻留内存,而是按需解密、执行后立即销毁。 | 保护运行时数据安全。 | 技术实现复杂,难以完全防护。 |
反抓包 | 防止npv抓包,系统代理抓包 | ||
RASP 策略在线下发 |
|||
反脱壳机 |
反fart环境,检测到自动退出 | ||
反模拟点击 |
|||
反虚拟定位 |
|||
反热修复 |
防止代码动态在线加载执行 | ||
防止日志泄露 |
关闭打印到logcat中的日志信息导致的泄露 | ||
本地数据文件保护 |
对应用运行中产生的数据文件比如db、xml等文件进行高强度加密保护 |
四、完整性校验
防止应用被二次打包和篡改。
加固方法 | 原理描述 | 优点 | 缺点 |
---|---|---|---|
1. 签名校验 | 在运行时校验APK的签名证书是否与官方发布的一致。如果不一致就闪退。反sandhook框架。 | 简单有效,防止重打包。 | 校验逻辑本身可能被Hook绕过。 |
2. DEX/So文件CRC校验 | 计算主要DEX文件和So文件的校验和(CRC、SHA等),与预埋的值对比。 | 防止文件被修改。 | 同样可能被Hook。 |
资源校验 | 保证资源文件的完整性 | ||
3. 服务器端校验 | 将关键校验逻辑放在服务器端,App启动时与服务器交互验证。 | 强度高,难以本地绕过。 | 依赖网络,影响用户体验和启动速度。 |
so防盗用 | so与app绑定防止解包后单独调用so文件 |
五、高级与综合加固技术
加固方法 | 原理描述 | 优点 | 缺点 |
---|---|---|---|
1. 多引擎协同保护 | 混合使用上述多种技术,形成立体的防护体系。不同功能模块可能采用不同的加固策略。 | 防御纵深大,破解难度呈指数级增长。 | 可能带来显著的性能开销和兼容性问题。 |
2. 窃密攻击防护 | 防止应用被录屏、截屏、监听键盘输入。 | 保护用户敏感操作不被记录。 | 对用户体验有一定影响。 |
3. SO文件加固 | 对Native库(.so文件)进行加壳、混淆、压缩和反调试保护(如使用OLLVM 控制流混淆)。 |
保护核心算法,Native层逆向难度大。 | 技术门槛高。 |
4. 证书锁定 (SSL Pinning) | 将服务器证书或公钥硬编码在App中,只信任该指定证书。 | 防止中间人攻击(MITM),保护通信安全。 | 证书过期或更换时需更新App。 |
唯一特征 | 对每个app都有自己的加固特征,没有相同的加固特征。 |
总结:没有银弹
没有任何一种单一的加固方法是完美的。 逆向工程师总是可以找到突破口,加固的目的是极大地增加其所需的时间、技术和资源成本,使其变得不经济或不可行。