博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android Security] APK自我保护 - DEX/APK校验
阅读量:6677 次
发布时间:2019-06-25

本文共 2952 字,大约阅读时间需要 9 分钟。

cp : https://segmentfault.com/a/1190000005105973

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 2200drwxr-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.xmldrwxr-xr-x   7 xiangqing  staff   238B  4 20 22:18 META-INF-rw-r--r--   1 xiangqing  staff   1.1M  9 15  2015 classes.dexdrwxr-xr-x   3 xiangqing  staff   102B  4 20 22:18 orgdrwxr-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();    }}

 

计算 MD5 值

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

mac 系统为例:

md5 release.apk

总结

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

转载于:https://www.cnblogs.com/0616--ataozhijia/p/8921565.html

你可能感兴趣的文章
type或者xtype总结
查看>>
网络安全系列之五十五 利用抓包来上传webshell
查看>>
Microsoft Office Communications Server 2007 R2 RTM 简体中文企业版部署速成篇之一
查看>>
在Linux中使用GoAccess分析Nginx的日志
查看>>
Struts2中的文件上传下载
查看>>
解决VMware Workstation 8不能最小化的问题
查看>>
cocos2d-x自制工具03:AnimatePacker for Mac/Win32 v1.1 Build1发布!
查看>>
《高性能Linux服务器构建实战Ⅱ》已出版发售,附封面照!
查看>>
一些比较值得思考和了解的.NET相关的面试题
查看>>
[Windows编程] 监视DLL装载/卸载
查看>>
Provisioning Services 7.6 入门到精通系列之八:虚拟磁盘访问模式
查看>>
ModalUpdateProgress控件
查看>>
[IE技巧] 使IE8以单进程的模式运行
查看>>
上帝圣经之域中DNS设置及记录[为企业部署Windows Server 2008系列十三]
查看>>
UpdateDate()
查看>>
【OpenCV学习】图像通道的GRB分割混合
查看>>
c++ 头文件
查看>>
Oracle数据库的热备份与完整恢复测试
查看>>
ssh生成随机数字验证码
查看>>
为了眼睛的健康改变电脑的色调-献给长期坐在电脑前的朋友
查看>>