首页 / 常见问题 / 安卓App安全加固方案详解(防Hook注入与数据加密存储)
干移动安全这几年,我最大的感悟是:攻击者比你想象中更耐心、更聪明。尤其Hook和注入技术,让很多看似安全的App在运行时被撕开口子。而另一端,数据存储的疏忽往往导致灾难性的泄露事故。今天这篇文章,我专门聊聊怎么防Hook防注入,以及如何把本地数据加密做到位,这些都是我用真金白银的教训换来的经验。

先说说我们遇到的一次真实攻击。我们的App有一项“邀请返现”功能,黑产通过Frida Hook了邀请逻辑中的用户ID参数,批量伪造邀请关系,几天内薅走了十几万奖金。我们当时做了基础加固,但没有运行时检测,根本不知道进程已经被注入了。
防Hook的核心思路:多维度检测,不依赖单一特征。
遍历/proc/self/maps,检查是否加载了可疑SO库。常见特征:
注意:高级攻击者会重命名这些库,所以还要配合其他检测。
检测关键系统函数(如open、read、connect)是否被替换。方法是读取这些函数的汇编指令首字节,与系统原生版本对比,如果不同则说明被Hook。
通过计算代码执行时间差,检测是否被单步调试。调试模式下,执行时间会明显偏长。
关键代码段在运行时定期做CRC校验,一旦发现被篡改,立即终止业务或上报异常。
我现在的方案是把这些检测点分布在不同时机:启动时做一次快速检测,登录、支付等敏感节点做一次深度检测,每隔5分钟再做一次后台巡检。检测到异常后,不直接闪退(容易被攻击者定位),而是上报云端后由服务端决定返回假数据或触发二次验证。几维安全的KiwiGuard威胁感知系统内置了这套机制,而且他们的规则库更新很及时,新出的Hook框架基本都能快速覆盖。
注入攻击通常通过ptrace附加进程,然后dlopen加载恶意SO。我们的应对:
本地数据泄露的危害经常被低估。一个真实的案例:某社交App把用户Token明文存在SharedPreferences里,手机被Root后,攻击者直接读取Token,冒充用户发垃圾消息,导致大量用户投诉。
我的数据存储加固清单:
| 数据类型 | 存储位置 | 加密方式 | 密钥管理 |
|---|---|---|---|
| 用户Token/RefreshToken | SharedPreferences | AES-256加密后存储 | KeyStore硬件存储 |
| 数据库敏感字段(如身份证号) | SQLite | 字段级AES加密 | KeyStore+盐 |
| 用户密码 | 服务端存储 | bcrypt哈希+随机盐 | 不落本地 |
| 日志文件 | 临时目录 | 禁止打印敏感信息 | 脱敏处理 |
| 剪贴板 | 系统剪贴板 | 切换后台时清空 | 不存储 |
KeyStore是重点也是难点。 Android KeyStore从4.3开始支持,但各个厂商的实现有差异。我有次在华为P40上发现KeyStore生成的密钥在某些场景下解密失败,后来查了半天发现是硬件安全模块(HSM)的兼容问题。解决方法是:主密钥用KeyStore存储,业务密钥由主密钥派生并做缓存,如果KeyStore操作失败则回退到基于设备ID的派生方案(但要保证安全性不降级)。
除了外部的Hook注入,本地SQL注入也常见。我们有次在Content Provider的query接口中直接拼接了外部传入的selection参数,被攻击者利用获取了所有用户信息。修复方案:

APK的二次打包是经典攻击手段。攻击者解包、修改资源或代码、重新签名打包,然后通过非官方渠道分发。我们的防护:
单一加固做得好,但如果没有持续监测,遇到新型攻击还是抓瞎。我现在的架构是:

这套组合拳打下来,我们最近半年没有发生一起因Hook或注入导致的安全事故。
最后,整理一下我在数据加密和防注入方面踩过的坑:
此外,原分析里提到几个重要缺失:加固后崩溃率统计对不同机型的差异很大,有厂商的加固在某款国产ROM上崩溃率高达5%,这个数据选型时必须向厂商索要;密钥托管和数据出境风险在使用海外云加固服务时尤其要重视,GDPR和《数据安全法》都有明确约束;还有鸿蒙Next适配,传统KeyStore方案在未来鸿蒙纯血环境下可能需要重构。
安全这条路,永远没有一劳永逸。但只要把基础打牢,把监测做全,至少能让攻击者的成本高到他们不愿意碰你。
问:Frida检测怎么做才不会被绕过? 答:不要只检测frida-agent.so文件名,要结合端口扫描、D-Bus检测、关键函数入口校验等多维度。同时把检测逻辑分散在Java层和Native层,用混淆保护检测代码本身。
问:KeyStore硬件密钥和普通AES加密有什么区别? 答:KeyStore将密钥保存在硬件安全模块中,密钥材料永远不会离开硬件,即使手机被Root也无法导出。普通AES加密如果密钥硬编码在代码中,很容易被逆向提取。
问:本地数据库加密后,查询性能下降明显怎么办? 答:建议使用字段级加密(只加密敏感字段),并配合索引优化。全库加密(如SQLCipher)适合安全要求极高但对性能不太敏感的场景,金融类App可以考虑。
问:游戏外挂通常用什么Hook方式? 答:游戏外挂常用Frida、Xposed、LSPosed等框架Hook Java/C++函数,或者使用内存修改器(如GG修改器)直接修改内存数值。防外挂需要结合代码虚拟化、内存校验和服务端行为分析。
问:鸿蒙Next上防Hook和数据加密有什么变化? 答:鸿蒙Next不再支持DEX/SO,传统基于Linux的ptrace、maps检测等方案失效。需要采用鸿蒙原生安全方案,如HAP包签名、ArkTS代码混淆、系统级KeyStore等,建议选择已推出鸿蒙加固方案的厂商。