apk的classes.dex的校检

原创 2015年07月07日 16:51:41


为了防止别人很同意就破解自己的应用,在代码添加classes.dex的校检,不通过则不能继续运行,这样增加点破解的难度。
有三种方式,一种是通过获取整个app的sha1哈希值,第二种是获取classes.dex的crc32的值,第三种是获取classes.dex的sha1的值


思路来源:http://my.oschina.net/u/2323218/blog/406860


下面是参考了以上写了个工具类


public class DexVerifyUtil {


    private static final String TAG = DexVerifyUtil.class.getSimpleName();


    public static String getApkSHA1(Context context) {
        String dexPath = context.getPackageCodePath();
        String sha = null;
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
            byte[] bytes = new byte[1024];
            int count;
            FileInputStream fis = new FileInputStream(new File(dexPath));
            while ((count = fis.read(bytes)) > 0) {
                messageDigest.update(bytes, 0, count);
            }


            BigInteger bigInteger = new BigInteger(1, messageDigest.digest());
            sha = bigInteger.toString(16);
            fis.close();


        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i(TAG, "apk sha1:" + sha);
        return sha;
    }


    public static String getDexFileCrc(Context context) {
        String dexPath = context.getPackageCodePath();
        String crc = null;
        try {
            ZipFile zipFile = new ZipFile(dexPath);
            ZipEntry zipEntry = zipFile.getEntry("classes.dex");
            if (zipEntry != null) {
                long crc1 = zipEntry.getCrc();
                crc = Long.toHexString(crc1);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i(TAG, "dex crc;" + crc);
        return crc;
    }


    public static String getDexSHA1(Context context) {
        String sha1 = null;
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            String dexPath = context.getPackageCodePath();
            ZipFile zf = new ZipFile(dexPath);
            ZipEntry zipEntry = zf.getEntry("classes.dex");
            if (zipEntry != null) {
                InputStream is = zf.getInputStream(zipEntry);
                byte[] bytes = new byte[1024];
                int byteCount;
                while ((byteCount = is.read(bytes)) > 0) {
                    digest.update(bytes, 0, byteCount);
                }
                BigInteger bigInteger = new BigInteger(1, digest.digest());
                sha1 = bigInteger.toString(16);
                is.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i(TAG, "dex sha1:" + sha1);
        return sha1;
    }

相关文章推荐

热更新Tinker研究(九):Dex文件的patch

热更新Tinker研究-Dex文件的patch 本文主要讲解dex文件的patch过程,从tinker的DexPatchFile格式分析,对doFullPatch()作为重点讲解。...

android apk 防止反编译技术第五篇-完整性校验

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

利用异步任务类AsyncTask下载图片,并且带进度对话框

不过多解释了,主要是异步任务类的一个小例子。
  • etwge
  • etwge
  • 2014年05月21日 14:32
  • 551

Intellij IDEA 中的Facets和Artifacts的区别

Facets和Artifacts的区别: Facets 表示这个module有什么特征,比如 Web,Spring和Hibernate等;  Artifact 是maven中的一个概念,表...

安卓逆向学习笔记(1) - 反编译classes.dex获取apk的java源代码

在上一篇文章中,我记录了apk的文件结构,其中有一个classes.dex文件。classes.dex是apk的核心文件,其运行在安卓Dalvik虚拟机上。通过查看apk的编译生成过程,我们可以得知:...

Android APK软件修改教程,由odex文件生成classes.dex

文章转载自:http://bbs.gfan.com/android-1361976-1-1.html 在我们使用Android手机的时候,某些应用或游戏只是偶尔会用到,所以又不愿意删掉,但是放在R...

批量提取出apk文件中的classes.dex文件

应用场景 如果需要批量分析apk以及每个apk文件中的classes.dex 文件。怎么提取出它们?将apk改后缀名变为.zip文件,之后在解压,提取出每个apk文件中的classes.dex文件,这...

使用dex2jar反编译APK中的classes.dex

先说下写这篇博文的初衷。 为了应用的代码不直接被他人窥视,我们一般都会在代码的时候进行代码混淆,这样子可以将原来的包名、类名、参数名等给替换成无意义的字母。而我们怎么知道代码混淆起效果了呢,自己把应...

classes_dex2jar

  • 2014年06月05日 14:13
  • 10KB
  • 下载

classes_dex2jar

  • 2013年03月16日 03:09
  • 534KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:apk的classes.dex的校检
举报原因:
原因补充:

(最多只允许输入30个字)