最近研究破解服务器,稍微总结一下,以后继续补充:
越来越多的个人和机构都在为第三方停止开放企业级的APP,这种类型的APP,开发者非常关怀自己的APP会不会被破解,从而直接影响自己的收入。
最近对这个话题也比较感兴趣,看到 BugRunner于2013年3月份宣布的《基于NDK的Android防破解》(http://blog.csdn.net/bugrunner/article/details/8634585),想了几个方面。
非常认同,基于NDK,比JAVA更难反编译,更难破解,但是他这个计划其实有很多问题:
1、NDK只是作为一个入口点,检查MD5,如果不一致就退出运行。 如果直接调用原先的ACTIVITY作为入口点,明显就没法阻止了。而且这个并不难实现。
2、NDK之所以难以反编译,很大程度是汇编低级语言的可读性很差,但是如果只是一个入口点这么简单的程序,反编译以后,其实是很轻易修改的。更何况在本计划中,只是停止md5数值的比对。
对于一个商业价值较大的来说,这个增长破解的代价还是太低了。
如果希望增长破解难度,可以从以下几个方面考虑:
1、核心的比对验证算法应该是基于NDK,在JAVA这一侧竟可能多的停止比较比对,甚至是随机继续调用。如果SO文件不存在,是不能运行下去的。
2、这个比对函数,不能是牢固的,否则反编译后定位到一个地方,就很轻易替换所有的地方。可以采取多次比对的思绪,比如设计若干个比对函数,每一个比对算法是不一样,基于时间,基于文件系统某个文件,MD5检修,联网,短信验证等等。不满足任何一个均是失败的。
3、在服务器一侧,必须记录客户端的行为,比如活泼用户数,用户的分布,这个是很有效的检查方法。应用很多APP的统计工具都可以做到,一旦在某个区域,活泼用户数增长,可以判定被盗版了。
4、在服务器和客户端之间,须要有必定的联系,结合NDK算法。比如一周内,必须和服务器通讯一次,服务器可以返回给客户端一些简单的命令,也可以高级的命令,比如APP安装时间,上次运行时间,一些业务统计数据,甚至自我销毁数据等功能。
因此,两边既然在一起协作,出发点首先不能影响客户端的性能和功能,在检查方法上不能简单依赖技巧,更多是一些业务上的指标更轻易表现是不是被盗版。
文章结束给大家分享下程序员的一些笑话语录:
PC软件体积大,是因为一个PC软件功能往往较多,能够满足你一个方面的需求,而一个iphone软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。