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 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();
}
}

计算 MD5 值

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

 md5 release.apk

总结

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

[Android Security] APK自我保护 - DEX/APK校验的更多相关文章

  1. android apk 自我保护技术-完整性校验

    关于防止android apk被反编译的技术我们前面已经讲了四种. 加壳技术 运行时修改字节码 伪加密 对抗JD-GUI 如果有不明白的可以查看我的博客的前四篇中关于这四种技术的介绍.接下来我们接着介 ...

  2. Android的4种文件类型Java,class,dex,apk

    Java文件-----应用程序源文件 Android本身相当一部分都是用java编写而成(基本上架构图里头蓝色的部份都是用Java开发的),android的应用必须使用java来开发 Class文件- ...

  3. android apk 自我保护技术-加密apk

    经过了忙碌的一周终于有时间静下来写点东西了,我们继续介绍android apk防止反编译技术的另一种方法.前两篇我们讲了加壳技术(http://my.oschina.net/u/2323218/blo ...

  4. APK自我保护方法

    标 题: [原创]APK自我保护方法 作 者: MindMac 时 间: 2013-12-28,21:41:15 链 接: http://bbs.pediy.com/showthread.php?t= ...

  5. APK程序Dex文件无源码调试方法讨论

    那些不靠谱的工具 先来说说那些不靠谱的工具,就是今天吭了我小半天的各种工具,看官上坐,待我细细道来.IDA pro IDA pro6.6之后加入了dex动态调试功能,一时间普天同庆.喜大普奔.兴奋之后 ...

  6. Android 4.4(KitKat)中apk包的安装过程

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/25542011 事实上对于apk包的安装.4.4和之前版本号没大的区别. Android中a ...

  7. android: 使用android逆向助手反编译APK

    第一步:下载逆向助手:(链接: https://pan.baidu.com/s/15jtoFDg9LWV80HREeyx5HA 提取码: k527 ) 第二步:将apk文件拷贝到逆向助手的apktoo ...

  8. 安卓(Android)手机如何安装APK?

    我大天朝的安卓手机只能在一个被阉割的APP市场里玩耍,有些APP可能需要直接安装APK文件.APK 是 Android Package (安卓安装包)安卓手机如何安装APK呢? 在电脑上下载安装APK ...

  9. Android 8.0+ 更新安装apk失败的问题

    最近做项目发现Android 8.0+ 更新安装apk时 出现安装失败的情况  总结原因是 缺少安装的权限 Android 8.0 (Android O)为了针对一些流氓软件引导用户安装其他无关应用. ...

随机推荐

  1. C++ 矩阵库 eigen

    找了好久才发现了一个这么方便的C++矩阵库. 官网 http://eigen.tuxfamily.org/index.php?title=Main_Page 参考文章 http://blog.csdn ...

  2. Argument 1 passed to Illuminate\Auth\SessionGuard::login() must be an instance of Illuminate\Contracts\Auth\Authenticatable, instance of App\User given,

    使用laravel内置的注册认证系统,注册账号,提示如下错误.Google之后,发现github的一个答案,解决了.分享一下 Argument 1 passed to Illuminate\Auth\ ...

  3. WordPress 建站教程:新手搭建 WordPress个人博客图文教程(完全版)

    前言 WordPress 作为动态博客的代表,至今已经有十几年历史,而且一直在更新发展中,功能强大,插件和主题丰富,WordPress搭建使用也很方便.作为个人站长和博主,很多都是从 WordPres ...

  4. NOI经验谈

    对于NOI来说,甚至比硬实力更加重要.我觉得一场考试这么几件事要做:看题,选题,分析,编码,调试,测试,骗分. 1.看题 拿到试卷以后的第一件事就是看题.看题不是看小说,要仔细阅读.当然,阅读也不宜过 ...

  5. BZOJ1170 : [Balkan2007]Cipher

    首先对于每个位置,求出它开始长度为y的横行的hash值,然后对于hash值再求一次竖列的hash值,排序后求出众数即可. 时间复杂度$O(n^2\log n)$. #include<cstdio ...

  6. HDU 5908 Abelian Period 暴力

    Abelian Period 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5908 Description Let S be a number st ...

  7. @Transactional导致无法动态数据源切换

    公司目前数据源为主从模式:主库可读写,从库只负责读.使用spring-jdbc提供的AbstractRoutingDataSource结合ThreadLocal存储key,实现数据源动态切换. 最近项 ...

  8. Activator 动态构造对象

    Activator  意义: 用于动态构造对象 语法1: 根据指定的泛型类型构造对象 Activator.CreateInstance<类型>() 语法2: 根据程序集和类型名构造对象 S ...

  9. inline关键字的作用

    一.在C&C++中,inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 如下面一宏定义表达式: #define express(v1,v2) (v1 ...

  10. POP3_使用SSL链接邮箱并获取邮件

    Gmail目前已经启用了POP3和SMTP服务,与其他邮箱不同的是Gmail提供的POP3和SMTP是使用安全套接字层SSL的,因此常规的JavaMail程序是无法收发邮件的,下面是使用JavaMai ...