查天气、找美食、玩游戏、买电影票、网上购物……安装APP后,手机变成“百事通”。不过,智能手机越来越“聪明”,也越来越不安全,病毒感染、垃圾短信、隐私泄露等关乎手机用户切身利益的问题频发。保护手机安全,不仅需要用户到正规官网下载APP,更重要的是开发者要做好APK安全保护工作。
http://write.blog.csdn.net/postedit
下面小编就分享一下APK高级保护的方法——运行时验证
运行时验证,主要是指在代码启动的时候本地获取签名信息,然后对签名信息进行检验来判断自己的应用是否是正版,如果签名信息不是正版则提示盗版或者直接崩溃。
它的原理:APK的唯一识别是根据包名+签名,包名信息是写死在Android Manifest.xml里面的,但是签名则是与APK绑定的,一旦APK被反编译后签名会自动消失。APK的签名需要签名文件,签名文件的md5值基本上是无法伪造成一样的。
签名验证的方法也可以细分为3种:
1) Java 层验证
获取签名信息和验证的方法都写在android 的java层。这种保护方法保护的意义并不大,因为反编译出源码后通过关键字搜索很快就能够找到验证的代码块,稍微一修改这验证保护就完全无效了。
2) 服务器验证
在android 的java层获取签名信息,上传服务器在服务端进行签名然后返回验证结果。这种保护还不如在纯java层验证有用,一旦没有网络验证保护就无效了。用android方法获取的签名信息用java方法也可以获取,验证存放在服务器上也是为了把保护正确的签名信息值,但是保护的意义其实没有任何作用,同样破解后全局搜索关键字然后伪造一个正确的签名信息就可完美破解了。
3) NDK技术底层获取签名和验证
通过把Context,Activity,PackageManager,PackageInfo四个对象中的一个作为参数参入底层,在底层获取签名信息并验证。因为获取和验证的方法都封闭在更安全的so库里面,能够起到一定意义上的保护作用。不过通过java层的hook技术一样可以把这种保护完美破解。但是相比于前两种,此保护的意义和价值就更大了。
再来看一下爱加密(www.ijiami.cn)的APK保护方法,它采用指纹校验保护APK中的文件。加密后,APK中所有的文件都对应一个唯一的指纹,每次运行时,APK内部会再次进行指纹生成,如果生成的指纹和原本指纹不相同,则判断为被二次打包过的APK,程序就会自动退出或直接崩溃。该方法可以防止资源文件、主配置文件被修改或删除等操作,完全保证APK的安全。
分享:APK高级保护方法解析(一)