一、对抗反编译
对抗反编译是指apk文件无法通过反编译工具(如apktool,baksmali,dex2jar)对其进行反编译,或者反编译后无法得到软件正确的反汇编代码。常用的做法有两种:
- 阅读反编译工具源码
这种办法需要分析人员具较强的代码阅读与理解能力,因此,这种方法具体实施起来困难。
- 压力测试
比起阅读反汇编工具的源码,这种方法思路就简单多,而且实施起来较容易。通常的做法是:收集大量的apk文件(几百个吧)存放进一个目录,编写脚本或程序调用反编译工具对目录下的所有apk文件进行反编译。不同的软件从大小、内容到结构组织都不尽相同,反编译工具在处理它们时有可能会出现异常。这种方法的思路是,通过查看反编译工具(如dex2jar)执行工作查看其log,分析得出能另其执行出现的指令,从而我们在编写软件时让代码生成该指令。
二、对抗静态分析
不要指望反编译工具永运无法编译你的软件,现在新版本的反编译工具(如dex2jar)已经很好的进行工作,很少会有处理不了的指令了。因为,我们需要想其它办法防止软件被人破解。
- 代码混淆技术
这个现在的主要的做法是ProGuard。
- NDK保护
- APK加壳 参考
三、对抗动态调试
如果认为自已编写的代码已经足够对付别人静态分析了,可以考虑在代码中另入动态调试检测,让破解者无从对自已的软件下手。
- 检测调试器
动态调试使用调试器来挂钩软件,获取软件运行时的数据,我们可以在软件中加入检测调试器的代码,当检测到软件被调试器连接时,中止软件的运行。参考
- 检测模拟器
软件发布后会安装到用户手机中运行,如果发现软件运行在模拟器中,很显然不合常理,可能是有人试图破解或分析它,这种情况我们要予以阻止。
四、防止重编译
确解者可能注入代码来分析我们的软件,也可能修改软件逻辑直接确解,不管怎样修改,软件本身的一些特性已经改变了。
- 检查签名
每一个app在发布时都需要开发人员对其进行签名,而签名使用的密钥文件是开发人员所独有的,确解者通常不可能拥有相同的密钥文件(密钥文件被盗除外),因此,签名成了android软件一种有效的身份标识,如果软件运行时的签名与自已发布时的不同,说明软件被篡改过,这个时间我们就可以让软件中止运行。
- 校验保护
重编译android软件的实质是重新编译classes.dex文件,代码经过重新编译后,生成的classes.dex文件的Hash值已经改变。我们可以检查程序安装后classed.dex文件的Hash值,来判断软件是否被重打包过。