导语:了解目前常见几类去签技术的简单原理、懂得一定技术逆反。

【初夏原创】【技术教程】针对资源重定向与动态代理的签名对抗 第5张插图
教程正式开始,你不需要具备任何工具。最关键的是我们需要思维同步,我不一定全对。但是希望能对你有所帮助~

目前工具类去签经典的代表的是:mt的去签(入口处动态代理)、lsp的去签(资源重定向)

签名作为应用指纹,他并非普通的md5,普通的md5会随着每次改动改变,而应用指纹不会。

常规的签名获取,是通过context、包名从packinfo中获取签名数组,然后通过md5等工具类转化为字符串。而动态代理只需要代理pm,就可以锁死签名。Java层的签名检验,在没有特殊处理情况下,安全极低。纯Java的检验。我只认为只有通过反射才有可能打破。从安卓框架出发,安卓应用的一个主要方法在这里,参数是包信息、位置、判断参数。我们在保证要验证的安装包路径不会被伪造的情况下,可通过反射调用这个方法,直走底层不过pm的获取sigture对象进行转化指纹,这个思路有无问题呢,经过测试在安卓9以下OK,大部分去签都无法控制我们这个方式。但是在安卓9以上的框架,关键字段、方法以及安全都被加强不开放给开发者调用,我参数通过lsp的方式越过这个权限但发现只能调用公开字段和方法,可能是我对这个库的使用还不够灵活,这是我得出的理论。。。。而且这个方式兼容性差,安卓版本的更新换代可能都需做出调整,只作为思路供给参考

【初夏原创】【技术教程】针对资源重定向与动态代理的签名对抗 第6张插图

【初夏原创】【技术教程】针对资源重定向与动态代理的签名对抗 第7张插图

无需灰心,让我们尝试使用jvm技术,通过Java与c++。进行第二次尝试。以下代码与思路来源于mt管理器开发者bin提供,下面只贴出Java代码,以作分析,其他代码可在此链接阅读:https://github.com/L-JINBIN/ApkSignatureKillerEx/

svc检验出现在我们的选项之中,不走pm通过对安装包的解析获rsa文件构造证书对象解析。

通过此方法mt的两个去签算是正式say再见,毕竟作为开发人能不知道自身去签弱点吗[滑稽]

但是此方式存在一个问题,会被资源重定向骗过也就是路径伪造。

private byte[] signatureFromSVC() {
try (ParcelFileDescriptor fd = ParcelFileDescriptor.adoptFd(openAt(getPackageResourcePath()));
ZipInputStream zis = new ZipInputStream(new FileInputStream(fd.getFileDescriptor()))) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
if (entry.getName().matches("(META-INF/.*)\.(RSA|DSA|EC)")) {
CertificateFactory certFactory = CertificateFactory.getInstance("X509");
X509Certificate x509Cert = (X509Certificate) certFactory.generateCertificate(zis);
return x509Cert.getEncoded();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

private String md5(byte[] bytes) {
    if (bytes == null) {
        return "null";
    }
    try {
        byte[] digest = MessageDigest.getInstance("MD5").digest(bytes);
        String hexDigits = "0123456789abcdef";
        char[] str = new char[digest.length * 2];
        int k = 0;
        for (byte b : digest) {
            str[k++] = hexDigits.charAt(b >>> 4 & 0xf);
            str[k++] = hexDigits.charAt(b & 0xf);
        }
        return new String(str);
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }
}

什么是路径伪造,让我们先写下代码在Java中获取安装路径

【初夏原创】【技术教程】针对资源重定向与动态代理的签名对抗 第8张插图
这是我们正常情况下的真实路径,然后让我们使用lsp去签
【初夏原创】【技术教程】针对资源重定向与动态代理的签名对抗 第9张插图
可以看到路径直接被伪造为了lsp构造的路径,这就是资源重定向。那么这种方式要怎么破呢?比起纯Java反射的包装获签的准确,真实路径的获取对于我们来说更加简单~全走so层调用路径获取即可

以上方式各位有没有发现一个很共同的地方,不管是去签、加签。你的代码越底层安全性和通杀性都会越高。因为所有应用都依赖于我们的手机框架之上,框架的底层语言是什么,从底层进发,总是一切基础方向

到此结束~[玫瑰]
【初夏原创】【技术教程】针对资源重定向与动态代理的签名对抗 第10张插图