您的位置:首页 > 移动开发 > Android开发

说说如何防范android应用(APK)被破解的思路

2012-08-10 14:49 344 查看

前面写了一篇文章说《技术探析Android安全有多弱,从鳄鱼爱洗澡致300万用户中毒说开去~》种说到apk的破解是非常简单的,文章最后我也说到:

很多人也问,如何防范,如何杜绝?

按照俺们技术的思路给出的答案是:基本无解!但是可以使用代码混淆提高下被反编译的难度。

目前为止唯一可以依靠的就是:底线!!
很多人表示非常不淡定,继续问如何防范,那么再仔细说一种思路:
第一种方法:代码混淆

前面已经说过了,为了加大反编译后代码分析的难度,对代码进行混淆。但是其缺点是,治标不治本,同样可以修改,只是复杂一点而已(甚至据说还有反混淆工具,没用过,不多做评论)。具体可以参考 ProGuard:http://proguard.sourceforge.net/
第二种办法:将核心代码用JNI写进so库中

由于so库的反编译和破解的难度都被加大,所以这种方式防止反编译效果不错;但是其缺点是,对于Java层的代码没有保护作用,同样可以被篡改。
第三种办法:在线签名比较

在程序启动或者初始化的时候,联网将运行的程序的签名与服务器上的官方标准签名进行比较,从而达到让反编译后的程序无法正常运行的效果;其缺点是,如果此部分联网检验的代码被篡改跳过,则整套机制全部失效。
这三种办法都有各自的缺点,所以单单靠某一项要实现完美的软件保护都是不可能的。不过,我们可以采用联合几种办法的方式,来增强软件保护的力度。曾经有人反编译过Android版的卡巴斯基,看到其保护思路似乎是这样的:

1. 代码混淆,那是必须的,不过不指望它能有很好的效果

2. 在程序初始化时,就直接通过JNI的so库初始化程序;

3. 程序激活部分也是通过JNI联网下载文件,然后在JNI层读文件并做相应激活与否的判断的
卡巴斯基是将大部分功能模块都放在JNI层来实现的,如果我们的程序都这样处理,耗费的精力必然很大。所以,我们只是借鉴它的思路而已。具体操作思路如下:

1. 代码混淆,不要偷懒啦,ProGuard很好用的;

2. 在启动时,通过JNI的so库初始化程序;

3. 初始化时JNI层联网验证签名,验证失败则直接在JNI层退出程序;
但是,需要注意的是需要保证如果绕过JNI层的初始化,则程序无法正常启动,这点不保证的话,破解还是很容易……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: