读-爱加密分享:APK高级保护方法解析(一)

来源:互联网 发布:网络著作权侵权认定 编辑:程序博客网 时间:2024/06/05 07:45

读<爱加密分享:APK高级保护方法解析(一)>

当签名漏洞被补上之后,任何对apk的篡改,都需要对apk重新签名。这里说了一个apk的高级保护方法:运行时认证。
运行时验证,主要是指在代码启动的时候本地获取签名信息,然后对签名信息进行检验来判断自己的应用是否是正版,如果签名信息不是正版则提示盗版或者直接崩溃。
它的原理:APK的唯一识别是根据包名+签名,包名信息是写死在Android Manifest.xml里面的,但是签名则是与APK绑定的,一旦APK被反编译后签名会自动消失。APK的签名需要签名文件,签名文件的md5值基本上是无法伪造成一样的。
签名验证的方法也可以细分为3种:

1. Java 层验证

获取签名信息和验证的方法都写在android 的java层。这种保护方法保护的意义并不大,因为反编译出源码后通过关键字搜索很快就能够找到验证的代码块,稍微一修改这验证保护就完全无效了。
获取签名信息;

获取签名

应用程序的签名被封装在 packageInfo 中,所以我们要获得应用程序的签名就需要PackageManager 来获得包含有签名信息的 packageInfo,再通过 packageInfo 获得 Signature 数组,循环遍历将签名进行拼接。 参考文章

破解办法

将apk反编译,使用关键字搜索找到获取签名,比对签名的地方,修改判断条件即可。

2. 服务器验证

在android 的java层获取签名信息,上传服务器在服务端进行签名然后返回验证结果。这种保护还不如在纯java层验证有用,一旦没有网络验证保护就无效了。用android方法获取的签名信息用java方法也可以获取,验证存放在服务器上也是为了把保护正确的签名信息值,但是保护的意义其实没有任何作用,同样破解后全局搜索关键字然后伪造一个正确的签名信息就可完美破解了。

破解方法

这个方法类似于上一个,伪造一个正确的签名信息发送给服务端即可。

3. NDK技术底层获取签名和验证

通过把Context,Activity,PackageManager,PackageInfo四个对象中的一个作为参数参入底层,在底层获取签名信息并验证。因为获取和验证的方法都封闭在更安全的so库里面,能够起到一定意义上的保护作用。不过通过java层的hook技术一样可以把这种保护完美破解。但是相比于前两种,此保护的意义和价值就更大了。

破解方法

这个方法跟前两者是一样的,只不过实现的是用ndk来实现。ndk层 c实现相对于java更难逆向修改些,不过采用同样的方法也是可以修改的。

Android通过NDK获取Keystore签名值

4. 来看一下爱加密的APK保护方法

它采用指纹校验保护APK中的文件。加密后,APK中所有的文件都对应一个唯一的指纹,每次运行时,APK内部会再次进行指纹生成,如果生成的指纹和原本指纹不相同,则判断为被二次打包过的APK,程序就会自动退出或直接崩溃。该方法可以防止资源文件、主配置文件被修改或删除等操作,完全保证APK的安全。

我对这个方法的理解

是这样的,就是对apk中的每个文件求取指纹然后存储在apk中,apk运行时,校验存储的指纹跟新计算的指纹是否一致。如果一致,则正常运行,否则则程序自动退出或者直接崩溃。

0 0
原创粉丝点击