最近发现打车软件的apk很是的火,并据说他们进行了很是严密的防御,防止用户进行二次打包。今天咱们来分析一下他的安全性到底如何(以司机版为例)。java
通过严密的分析发现:司机版主要的防御在两个地方。
第一个是:登陆过程当中,经过传递context对象到so库中的方式去拿到apk的签名信息的md5签名信息上传。
第二个是:在主界面中,每次onResume中,调用一个私有类进行校验,若是校验不经过,则弹出“请卸载该软件后再使用~”的提示。迫使点击肯定的方式退出app。安全
首先咱们来讲第一个校验:自己使用so做为获取签名信息的地方相应的比在java中获取签名信息的方式要安全。可是so获取签名信息必须给底层传递context对象。那么防御弱点也主要在这个context对象的传递上。
在com.sdu.didi.net包的c 方法中app
里面的SecurityLib.getUUID(this.b)即是调用so库的getUUID方法,并传递context。测试
其中UUID是在so库中经过签名信息换算过来的,this.b是application的getContext。
那么咱们在application中添加剧写getPackageManager方法,并修改其中的返回值。返回咱们本身写的PackageManager。以下
修改其中的getPackageInfo方法,返回咱们本身的packageInfo对象。ui
ChangesSignture方法以下:其中的Signature的值是司机正版的签名信息的MD5值。this
经过以上的修改,通过测试。登陆过程的校验已经没有任何做用了。加密
下面咱们来讲第二个校验:spa
在com.sdu.didi.gui.main包下的MainActivity中.net
其中checkCheatTool();会进行校验。若是是盗版会弹出提示:请卸载该软件后再使用~”,这种防御更没有安全性可言了。咱们只须要把这行代码注释或者删除掉。这个校验就没有任何的做用了。orm
这种传统的加密方法已然失效,给你们推荐一个更安全的加密方式,对APP进行加壳保护,采用这种加密方法即便APP被破解,源码也不会暴露,能够有效防止二次打包等恶意破解,目前这种加密服务是由第三方服务平台提供的,网址:www.ijiami.cn 各位能够去体验加密。