Android签名验证——Hook签名第一步

网上虽然很多Hook Android App 签名的方法,例如:
一键绕过App签名验证
一键破解APK签名校验
但是要想知道其中Hook的实现原理,并且能自己编写Hook实现,那么我们首先得知道以下几个问题:

  • Android开发如何进行签名验证
  • Hook签名原理,及其实现

这篇文章先讲第一个问题——Android签名验证
由于网上相关文章比较多,这里就不赘术,仅提供核心代码
能研究这个肯定有一定的技术基础,所以下面代码肯定能看懂

	String getSignatures() {
        try {
            //获取签名信息
            byte[] cert = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures[0].toByteArray();
            //将签名转换为字节数组流
            InputStream input = new ByteArrayInputStream(cert);
            //证书工厂类,这个类实现了出厂合格证算法的功能
            CertificateFactory cf = CertificateFactory.getInstance("X509");
            //X509 证书,X.509 是一种非常通用的证书格式
            X509Certificate c = (X509Certificate) cf.generateCertificate(input);
            //加密算法的类,这里的参数可以使 MD5 等加密算法
            MessageDigest md = MessageDigest.getInstance("SHA1");
            //获得公钥
            byte[] publicKey = md.digest(c.getEncoded());
            //字节到十六进制的格式转换
            return byte2HexFormatted(publicKey);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    //转成可待比较的十六进制字符串格式
    String byte2HexFormatted(byte[] arr) {
        StringBuilder str = new StringBuilder();
        String temp = null;
        for (int i = 0; i < arr.length; i++) {
            temp = Integer.toHexString(arr[i] & 0xFF);
            if (temp.length() == 1)
                str.append("0");
            str.append(temp.toUpperCase() + ":");
        }
        str.deleteCharAt(str.length() - 1);
        return str.toString();
    }
以上是Android中获取签名指纹(SHA1)的代码。
下面通过命令行和官方签名文件获取官方签名指纹
	看图???

在这里插入图片描述

Android验证代码如下:

在这里插入图片描述

发布了77 篇原创文章 · 获赞 44 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/lemisky/article/details/100143873