保护APP

讨论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的签名(防篡改)

  1. 利用Keytool工具获取自己的签名证书的SHA1签名/指纹:keytool -list -v -keystore your_app.keystore——输入命令后,在输出的内容中的Certificate fingerprints下面可以看到16进制的SHA1 hash。
  2. 上一步获取的16进制字符串还需要进行去冒号的操作,一个简单快速的方法是将SHA1复制粘贴到这里,然后点击Convert!按钮。
  3. 编写在运行时获取.apk文件当前签名的代码,如下。

总结:上述主要思路如下:获取自己的证书的SHA1签名/指纹,将其硬编码在APP中,并在APP运行时获取其SHA1签名,然后与正确的证书信息进行比较。但是硬编码并不安全,容易被逆向分析篡改,所以可以考虑从服务器获取正确的证书信息,与运行时的证书信息进行比较。另外,也可以利用DexGuard隐藏调用验证APP签名的方法的代码,达到代码混淆的效果,使攻击者很难分析出到底是哪里的代码在做防篡改验证。

(6)代码混淆

DexGuard与ProGuard各项性能的对比如下图。

3.参考

Ant是什么东西(初级)
Ant 简易教程