思路1:对classes.dex文件完整性校验
Android工程代码中的所有java代码经编译和优化最终生成Dalvik虚拟机可执行的DEX文件,DEX文件最终会打包在APK文件中,针对APK代码的篡改攻击就是针对该文件,如通常使用apktool反编译APK文件,修改smali代码。APK包中的DEX文件如下图所示:
- /**
- * 通过检查classes.dex文件的CRC32摘要值来判断文件是否被篡改
- *
- * @param orginalCRC 原始classes.dex文件的CRC值
- */
- public static void apkVerifyWithCRC(Context context, String orginalCRC) {
- String apkPath = context.getPackageCodePath(); // 获取Apk包存储路径
- try {
- ZipFile zipFile = new ZipFile(apkPath);
- ZipEntry dexEntry = zipFile.getEntry(“classes.dex”); // 读取ZIP包中的classes.dex文件
- String dexCRC = String.valueOf(dexEntry.getCrc()); // 得到classes.dex文件的CRC值
- if (!dexCRC.equals(orginalCRC)) { // 将得到的CRC值与原始的CRC值进行比较校验
- Process.killProcess(Process.myPid()); // 验证失败则退出程序
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
思路2:对apk包做完整性校验
如果对apk包进行篡改,必会影响apk包的完整性校验值,因此根据思路1,我们也可以对整个apk包做哈希校验。
通过检查apk包的MD5摘要值来判断代码文件是否被篡改的java实现代码如下图所示:
[java] view plain copy
- /**
- * 通过检查apk包的MD5摘要值来判断代码文件是否被篡改
- *
- * @param orginalMD5 原始Apk包的MD5值
- */
- public static void apkVerifyWithMD5(Context context, String orginalMD5) {
- String apkPath = context.getPackageCodePath(); // 获取Apk包存储路径
- try {
- MessageDigest dexDigest = MessageDigest.getInstance(“MD5”);
- byte[] bytes = new byte[1024];
- int byteCount;
- FileInputStream fis&
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!