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