网上虽然很多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验证代码如下: