以下为图文内容:7.3.1签名校验及资源混淆保护 (上)
0x01 签名校验的产生
Android application 在反编译中显得无力,但是在重打包后可以被轻松安装,然后
又可以成功运行,这就很容易把开发者写的逻辑给改变,因此,开发者往往需要做到签名
校验,这时候签名校验就可以在对抗反编译中起到重要作用,反编译后应用运行前或者在
运行中起到校验的作用,若签名校验失败,程序可以直接退出,这个效果旨在防止山寨应
用售卖,从而起到保护的效果。
0x02 签名校验的基本代码
签名校验需要使用到的底层java 函数有
getPackageManager、getPackageInfo、getPackageName等,但是,由于大多数
的校验是在启动安卓应用之前,因此大多数是在oncreate函数中,因此,大多签名校验
可以在oncreate中寻找
0x03 实操校验
首先获取签名途径
[C++] 纯文本查看 复制代码 PackageManager pm = context.getPackageManager(); //获取包管理器
String packageName = context.getPackageName(); //获取包名
int flags = PackageManager.GET_SIGNATURES; //获取相关签名
packageInfo = pm.getPackageInfo(packageName, flags) //获得包的所有内容
信息类
Signature[] signatures = packageInfo.signatures; //签名信息获取
然后处理签名
[C++] 纯文本查看 复制代码 byte[] cert = signatures[0].toByteArray();
InputStream input = new ByteArrayInputStream(cert);
CertificateFactory cf = null;
cf = CertificateFactory.getInstance("X509");
X509Certificate c = null;
c = (X509Certificate) cf.generateCertificate(input);
String hexString = null;
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] publicKey = md.digest(c.getEncoded());
hexString = byte2HexFormatted(publicKey);
private String byte2HexFormatted(byte[] arr) {
StringBuilder str = new StringBuilder(arr.length * 2);
for (int i = 0; i <arr.length; i++) {
String h = Integer.toHexString(arr[i]);
int l =h.length();
if (l == 1)
h = "0" + h;
if (l > 2)
h = h.substring(l - 2, l);
str.append(h.toUpperCase());
if (i < (arr.length - 1))
str.append(':');
}
return str.toString();
}
最后直接进行校验即可
0x04 总结
对应处理签名校验因此有以上的相关内置算法,根据内部函数进行绕过,直接修改返
回值绕过签名认证等等,而对抗的手段也愈发新颖,如:将app_key在服务端进行校验,
通过返回值进行判断,这样的手段也成为了对抗的一把好手
|