Android客户端代码保护技术-完整性校验

思路1:对classes.dex文件完整性校验

       Android工程代码中的所有java代码经编译和优化最终生成Dalvik虚拟机可执行的DEX文件,DEX文件最终会打包在APK文件中,针对APK代码的篡改攻击就是针对该文件,如通常使用apktool反编译APK文件,修改smali代码。APK包中的DEX文件如下图所示:

  1. /** 
  2.  * 通过检查classes.dex文件的CRC32摘要值来判断文件是否被篡改 
  3.  * 
  4.  * @param orginalCRC 原始classes.dex文件的CRC值 
  5.  */  
  6. public static void apkVerifyWithCRC(Context context, String orginalCRC) {  
  7.     String apkPath = context.getPackageCodePath(); // 获取Apk包存储路径  
  8.     try {  
  9.         ZipFile zipFile = new ZipFile(apkPath);  
  10.         ZipEntry dexEntry = zipFile.getEntry(“classes.dex”); // 读取ZIP包中的classes.dex文件  
  11.         String dexCRC = String.valueOf(dexEntry.getCrc()); // 得到classes.dex文件的CRC值  
  12.         if (!dexCRC.equals(orginalCRC)) { // 将得到的CRC值与原始的CRC值进行比较校验  
  13.             Process.killProcess(Process.myPid()); // 验证失败则退出程序  
  14.         }  
  15.     } catch (IOException e) {  
  16.         e.printStackTrace();  
  17.     }  
  18. }  

思路2:对apk包做完整性校验

       如果对apk包进行篡改,必会影响apk包的完整性校验值,因此根据思路1,我们也可以对整个apk包做哈希校验。

       通过检查apk包的MD5摘要值来判断代码文件是否被篡改的java实现代码如下图所示:

[java]  view plain  copy

  1. /** 
  2.  * 通过检查apk包的MD5摘要值来判断代码文件是否被篡改 
  3.  * 
  4.  * @param orginalMD5 原始Apk包的MD5值 
  5.  */  
  6. public static void apkVerifyWithMD5(Context context, String orginalMD5) {  
  7.     String apkPath = context.getPackageCodePath(); // 获取Apk包存储路径  
  8.     try {  
  9.         MessageDigest dexDigest = MessageDigest.getInstance(“MD5”);  
  10.         byte[] bytes = new byte[1024];  
  11.         int byteCount;  
  12.         FileInputStream fis&

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年11月4日
下一篇 2017年11月4日

相关推荐