资讯专栏INFORMATION COLUMN

APK自我保护 - DEX/APK校验

desdik / 567人阅读

摘要:校验是在应用开发结束后,在本地计算出其值或者值。传送门自我保护校验校验是虚拟机的可执行文件,我们所写的代码其实都在这里面,所有很多对应用程序的篡改都是针对文件的。

DEX/APK 校验是在应用开发结束后,在本地计算出其 CRC 值或者 MD5值。在应用运行的时候,通过网络或者资源文件中获取事前算好的值进行比对,如果不一致则说明 DEX/APK 可能存在被篡改的风险。

传送门: APK自我保护 - DEX/APK校验

DEX校验

classes.dex 是 Android 虚拟机的可执行文件,我们所写的 java 代码其实都在这里面,所有很多对应用程序的篡改都是针对 classes.dex 文件的。可以找一个 APK 解压就可以看到 classes.dex 文件。APK 其实就是一个压缩包,通过将后缀名改为zip 就可以直接解压,或者用 unzip 命令。

编写代码

代码比较简单,这里是通过建计算好的 crc 保存在 string.xml 文件里,当然我们事先可以随便拿一个值代替,等开发完成后替换掉。
校验代码:

/**
 * 校验Dex CRC值
 */
private void verifyDex(){
    //获取String.xml中的value
    Long dexCrc = Long.parseLong(this.getString(R.string.crc_value));
    String apkPath = this.getPackageCodePath();
    try {
        ZipFile zipFile = new ZipFile(apkPath);
        ZipEntry dexEntry = zipFile.getEntry("classes.dex");

        //计算classes.dex的 crc
        long dexEntryCrc = dexEntry.getCrc();
        Log.d("DEX", dexEntryCrc + "");

        //对比
        if(dexCrc == dexEntryCrc){
            Log.d("DEX", "dex hasn"t been modified");
        }else{
            Log.d("DEX", "dex has been modified");
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
计算 CRC 值

这一步必须在应用开发完成的时候去计算,如果改动了代码就必须重新计算。

利用 unzip 解压

解压命令:

unzip -d output app-debug.apk  

output 文件夹:

total 2200
drwxr-xr-x   8 xiangqing  staff   272B  4 20 22:18 .
drwxr-xr-x   6 xiangqing  staff   204B  4 20 22:18 ..
-rw-r--r--   1 xiangqing  staff   3.1K  9 15  2015 AndroidManifest.xml
drwxr-xr-x   7 xiangqing  staff   238B  4 20 22:18 META-INF
-rw-r--r--   1 xiangqing  staff   1.1M  9 15  2015 classes.dex
drwxr-xr-x   3 xiangqing  staff   102B  4 20 22:18 org
drwxr-xr-x  10 xiangqing  staff   340B  4 20 22:18 res
-rw-r--r--   1 xiangqing  staff   4.4K  9 15  2015 resources.arsc
利用 crc32 命令获取 crc 值

mac系统自带 crc32 命令:

crc32 classes.dex

这里生成的 crc 值是16进制数我们可以转换成十进制。

保存到 string.xml 文件

因为 string.xml 文件是资源文件不会影响到 classes.dex 所以修改是没有关系的。

APK校验

与 DEX 校验不同 APK 检验必须把把计算好的 Hash 值放在网络服务端,因为对 APK 的任何改动都会影响到最后的 Hash 值。
校验代码:

/**
 * 校验APK MD5值
 */
private void verifyApk(){
    //获取data/app/****/base.apk 路径
    String apkPath = getPackageResourcePath();
    Log.d("APK", apkPath);
    MessageDigest msgDigest;
    try {
        //获取apk并计算MD5值
        msgDigest = MessageDigest.getInstance("MD5");
        byte[] bytes = new byte[4096];
        int count;
        FileInputStream fis;
        fis = new FileInputStream(new File(apkPath));

        while((count = fis.read(bytes)) >0){
            msgDigest.update(bytes, 0, count);
        }
        //计算出MD5值
        BigInteger bInt = new BigInteger(1, msgDigest.digest());
        String md5 = bInt.toString(16);
        fis.close();
        Log.d("APK", md5);

        /**
         * 获取服务端的 MD5值进行对比
         */

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
计算 CRC 值

这一步必须在应用开发完成并且打包 release 版本的时候进行计算。
mac 系统为例:

 md5 release.apk
总结

当然上述的保护方式容易被暴力破解, 完整性检查最终还是通过返回 true/false 来控制 后续代码逻辑的走向,如果攻击者直接修改代码逻辑,完整性检查始终返回 true,那这种方 法就无效了,所以类似文件完整性校验需要配合一些其他方法,或者有其他更为巧妙的方式 实现?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12793.html

相关文章

  • APK反逆向之二:四种基本加固方式

    摘要:本篇章主要介绍应用加固的最基础的四种方式混淆签名比对验证编译动态库代码动态加载原文地址反逆向之二四种基本加固方式简介应该大多数开发者都不会关注应用会不逆向破解,而且现在有第三方厂商提供免费的加固方案,所以应用的安全性就全部依赖于第三方。 近些年来移动 APP 数量呈现爆炸式的增长,黑产也从原来的PC端移到了移动端,伴随而来的逆向攻击手段也越来越高明。本篇章主要介绍应用加固的最基础的四种...

    superw 评论0 收藏0
  • 基于御安全APK加固的游戏反外挂方案

    摘要:就是在这种情况下,御安全加固平台推出了一种方便,高效以及成本低的基于加固的反外挂方法,来保护好手游免受外挂软件的侵扰。御安全加固技术主要功能文件保护。御安全加固后的,一旦发现玩家或者攻击者有加速或者减速游戏的行为,将自动终止运行。 一、 前言 随着移动互联网的兴起,移动游戏市场近几年突然爆发,收入规模快速增长。 根据第三方数据统计,国内移动游戏2015年市场规模已达514.6亿。 由于...

    王晗 评论0 收藏0
  • 借腾讯开源 VasDolly,谈谈 Android 签名和多渠道打包的原理!

    摘要:前几天,企鹅电竞团队开源了自己的多渠道打包工具,比美团的更全面一些。四可商用的多渠道打包方案在开源之前,市面上支持签名的多渠道打包方案,就属美团的了,下面简单比对一下它们的优缺点。 showImg(https://segmentfault.com/img/remote/1460000013436224?w=900&h=500); 一、前言 Hi,大家好,我是承香墨影! 当我们需要发布一...

    LMou 评论0 收藏0
  • APK自我保护 - 代码乱序

    摘要:传送门自我保护代码乱序乱序原理为了增加逆向分析的难度可以将原有代码在格式上进行乱序处理同时又不会影响程序的正常运行。代码对比生成的不能直接用查看源码,所以可以工具转化为文件上边为未做处理的反编译代码,下边为乱序后的代码。 代码乱序是指在不影响原有的代码逻辑,打乱代码布局,增加逆向分析的难度。代码乱序的原理与操作并不复杂,但是必须分析编译后的源码逻辑,而且实际运用到生成中难度比较大,所以...

    JiaXinYi 评论0 收藏0
  • APK自我保护 - 字符串处理

    摘要:如果这些字符串采用硬编码方式,很容易通过静态分析获取。编码混淆编码混淆是在硬编码的时候将字符串先转换成进制的数组或者编码,在使用的时候在转回字符串。加密处理加密处理是先将字符串在本地进行加密处理,后将密文硬编码进去,运行时载进行解密。 字符串处理可以增加静态分析的难度,但是这种增加是有限的。只要破解者有足够的耐心同样可以破解 在开发过程中字符串不可避免,但是这些字符串也可能是破解的关键...

    trigkit4 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<