一,已知防护策略
1.不可或缺的混淆
Java 是一种跨平台、解释型语言,Java 源代码编译成的class文件中有大量包含语义的变量名、方法名的信息,很容易被反编译为Java 源代码。为了防止这种现象,我们可以对Java字节码进行混淆。混淆不仅能将代码中的类名、字段、方法名变为无意义的名称,保护代码,也由于移除无用的类、方法,并使用简短名称对类、字段、方法进行重命名缩小了程序的大小。
ProGuard由shrink、optimize、obfuscate和preverify四个步骤组成,每个步骤都是可选的,需要哪些步骤都可以在脚本中配置。 参见ProGuard官方介绍。
- 压缩(Shrink): 侦测并移除代码中无用的类、字段、方法、和特性(Attribute)。
- 优化(Optimize): 分析和优化字节码。
- 混淆(Obfuscate): 使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名。
上面三个步骤使代码size更小,更高效,也更难被逆向工程。
- 预检(Preveirfy): 在java平台上对处理后的代码进行预检。
一般来说优化和预检选项在Android中是关闭的,脚本如下:
-dontoptimize
表示不进行优化,建议使用此选项,因为根据proguard-android-optimize.txt中的描述,优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行。
-dontpreverify
表示不进行预校验。这个预校验是作用在Java平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度。 (在安装apk过程中系统会对dex校验及优化成odex)
作为防护来说对于混淆的需求就是Obfuscate,增加阅读代码的难度。
2、签名校验
校验各个文件的信息,比如微信的dex文件校验,阿里聚安全的签名文件校验等高强度操作。
第一:直接在本地做防护,如果发现签名不一致直接退出应用
第二:将签名信息携带请求参数中参与加密,服务端进行签名校验,失败就返回错误数据即可
Android的签名机制可以有效防止应用二次签名后不能覆盖安