讨论APP的一些保护技术。
1.概述
主要内容
- 保护APP的组件
- 通过定制权限保护组件
- 保护content provider的路径
- 防御SQL注入攻击
- 验证APP的签名(防篡改)
- 通过检测安装程序,模拟器,调试标志位反逆向工程
- 用ProGuard删除所有日志消息(ProGuard是个开源的Java代码混淆器,Android SDK里自带了这个工具。可利用ProGuard的孪生工具ReTrace,分析由被混淆过的App生成的stack trace/bug report。)
- 用DexGuard进行高级代码混淆(如API隐藏(使用API反射机制隐藏对敏感API和代码的调用)和字符串加密等。)
注意:在使用ProGuard和DexGuard进行代码混淆时,需要在release模式下生成/导出,才能生成混淆策略生效后的APK。
2.内容要点
(1)保护APP的组件
保护APP组件的途径有两条:正确的使用AndroidManifest.xml文件;在代码级别上强制进行权限检查。
(2)通过定制权限保护组件
定义自己的定制权限
定义一个权限组
关于元素的理解
(3)保护content provider
统一资源定位符(Uniform resource identifiers,URI)是content provider用来标识给定数据库的。
(4)防御SQL注入攻击
(5)验证APP的签名(防篡改)
- 利用Keytool工具获取自己的签名证书的SHA1签名/指纹:keytool -list -v -keystore your_app.keystore——输入命令后,在输出的内容中的
Certificate fingerprints
下面可以看到16进制的SHA1 hash。 - 上一步获取的16进制字符串还需要进行去冒号的操作,一个简单快速的方法是将SHA1复制粘贴到这里,然后点击
Convert!
按钮。 - 编写在运行时获取.apk文件当前签名的代码,如下。
总结:上述主要思路如下:获取自己的证书的SHA1签名/指纹,将其硬编码在APP中,并在APP运行时获取其SHA1签名,然后与正确的证书信息进行比较。但是硬编码并不安全,容易被逆向分析篡改,所以可以考虑从服务器获取正确的证书信息,与运行时的证书信息进行比较。另外,也可以利用DexGuard
隐藏调用验证APP签名的方法的代码,达到代码混淆的效果,使攻击者很难分析出到底是哪里的代码在做防篡改验证。
(6)代码混淆
DexGuard与ProGuard各项性能的对比如下图。