新手怎么Kstool爆破签名验证?【已解决】

Kstools是可以爆破签名验证,本文就此分析另外一种获取签名信息的思路,纯java方式,可以对抗这种类似的爆破工具(MT管理器等).

蓝域安卓黑客破解
Kstools原理想必大家都已经知道,就是通过反射获取当前App的PackageManager服务对象,然后利用JDK原生动态
代{过}{滤}理生成修改getPackageInfor()方法返回的signatures值PackageManager的代{过}{滤}理对象,最后将App的原PackageManager服务对象
替换成我们生成的代{过}{滤}理对象,达到Hook效果.

我们这里直接通过java方式获取到apk的签名RSA文件的公钥信息,然后进行比对,这样我们获取到的的apk签名信息就是真实的了.
下面是实现代码:



                           /**
         * 通过ZipInputStream 获取apk 文件META-INF目录下的XXX.RSA/DSA文件公钥Modulus信息 此方法通过线程池的callable
         * 后台异步获取信息,不会对主线程产生阻塞.
         * 
         * 注意在JAVA环境下获取的公钥信息是10进制,Android环境下获取的公钥信息是16机制
         * 方法会自动判断是否运行在JAVA环境下,并将10机制转换为16进制
         * 
         * @Param apkPath        Apk文件的路径,支持Apk安装路径
         * @Return 成功返回十六进制的公钥信息,失败返回null
         * 
         */
        public static String getApkSignatureModulus(String apkPath)
        {
                final File file = new File(apkPath);
                if (!file.exists() || file.isDirectory())
                        throw new RuntimeException("File " + apkPath + " path is not a file or exists");
                if (!(file.getName().matches("^.+\\.(?i)APK$")))
                        throw new RuntimeException("File " + apkPath + " is not a apk");
                ExecutorService excutorService = Executors.newSingleThreadExecutor();
                Future<?> future = excutorService.submit(new Callable<Object>() {
                                @Override
                                public Object call() throws Exception
                                {
                                        String regex = "^(?i)META-INF/.+\\.[RD]SA$"; // 匹配^,$字符时输入://$和//^
                                        /*
                                        * (?i)abc 表示abc都忽略大小写 
                                         * a(?i)bc 表示bc忽略大小写 
                                         * a((?i)b)c 表示只有b忽略大小写
                                        */
                                        byte[] buffer = null;
                                        FileInputStream fis = null;
                                        try
                                        {
                                                fis = new FileInputStream(file);
                                        }
                                        catch (FileNotFoundException e)
                                        {
                                                e.printStackTrace();
                                                return null;
                                        }
                                        ZipInputStream zis = new ZipInputStream(fis);
                                        ZipEntry zipEntry = null;
                                        try
                                        {
                                                while ((zipEntry = zis.getNextEntry()) != null)
                                                {
                                                        // 注意ZipInputStream 的getNextEntry()方法不会获取文件夹,直接获取文件,比如XXX/YYY.txt
                                                        if (zipEntry.isDirectory())
                                                        {
                                                                continue;
                                                        }
                                                        else
                                                        {
                                                                if (zipEntry.getName().matches(regex))
                                                                {
                                                                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                                                                        buffer = new byte[1024];
                                                                        int len = 0;
                                                                        while ((len = zis.read(buffer)) != -1)
                                                                        {
                                                                                bos.write(buffer, 0, len);
                                                                        }
                                                                        buffer = bos.toByteArray();
                                                                        bos.close();
                                                                        break;// 获取到签名文件后退出zip压缩遍历循环,XXX.RSA,XXX.DSA
                                                                }
                                                        }
                                                }
                                        }
                                        catch (IOException e)
                                        {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        PKCS7 pkcs7 = null;
                                        try
                                        {
                                                pkcs7 = new PKCS7(buffer);
                                        }
                                        catch (ParsingException e)
                                        {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        X509Certificate publicKey = pkcs7.getCertificates()[0];
                                        if (zis != null)
                                        {
                                                try
                                                {
                                                        zis.close();
                                                }
                                                catch (IOException e)
                                                {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                }
                                        }
                                        if (fis != null)
                                        {
                                                try
                                                {
                                                        fis.close();
                                                }
                                                catch (IOException e)
                                                {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                }
                                        }
                                String currentRuntimeEnvironment = System.getProperty("java.runtime.name","Failed").toUpperCase();
                                String originalSignInfor = publicKey.getPublicKey().toString();
                                //优先使用根据环境的描述判断运行环境
                                int end = 0;
                                int start = 0;
                                if(currentRuntimeEnvironment.contains("java".toUpperCase())) {
                                        //在JAVA环境下运行
                                        start = originalSignInfor.indexOf("modulus:");
                                        end = originalSignInfor.lastIndexOf("public");
                                        if (start != -1 && end != -1) {
                                                //而在JAVA环境下获得的是10进制的,需要转换成十六进制
                                                BigInteger src = new BigInteger(originalSignInfor.substring(start + 8, end).trim());
                                                return src.toString(16);
                                        }
                                        return null;
                                }else if(currentRuntimeEnvironment.contains("android".toUpperCase())){
                                        //在Android环境下运行
                                        start = originalSignInfor.indexOf("modulus=");
                                        end = originalSignInfor.lastIndexOf(",public");
                                        if (start != -1 && end != -1)
                                                return originalSignInfor.substring(start + 8, end);
                                        return null;
                                }
                                //当上面方法获取失败后,运行另一种判断方法
                                System.out.println("执行另一种判断方法");
                                end = 0;
                                start = originalSignInfor.indexOf("modulus:");
                                if (start == -1 ) {
                                        //在其他环境下运行
                                        start = originalSignInfor.indexOf("modulus=");
                                        end = originalSignInfor.lastIndexOf(",public");
                                        if (start != -1 && end != -1)
                                                return originalSignInfor.substring(start + 8, end);
                                        return null;
                                } else {
                                        end = originalSignInfor.lastIndexOf("public");
                                        if (start != -1 && end != -1) {
                                                //而在JAVA环境下获得的是10进制的,需要转换成十六进制
                                                BigInteger src = new BigInteger(originalSignInfor.substring(start + 8, end).trim());
                                                return src.toString(16);
                                        }
                                        return null;
                                }
                        }
                        });
                try
                {
                        return ((String) future.get());
                }
                catch (InterruptedException e)
                {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        return null;
                }
                catch (ExecutionException e)
                {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        return null;
                }
                finally
                {
                        excutorService.shutdownNow();
                }
        }




/**获取字符串的Hash值
         * @param source 需要加密的字符串 
     * @param hashType  加密类型 (MD5 或 SHA) 
     * @return 
     */  
    public static String getHash(String source, String hashType) {  
            if(source == null || hashType == null)
                    return null;
        // 用来将字节转换成 16 进制表示的字符  
        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};  
        StringBuilder sb = new StringBuilder();  
        MessageDigest md5;  
        try {  
            md5 = MessageDigest.getInstance(hashType);  
            try {
                                md5.update(source.getBytes("UTF-8"));
                        } catch (UnsupportedEncodingException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }  
            byte[] encryptStr = md5.digest();  
            for (int i = 0; i < encryptStr.length; i++) {  
                int iRet = encryptStr;  
                if (iRet < 0) {  
                    iRet += 256;  
                }  
                int iD1 = iRet / 16;  
                int iD2 = iRet % 16;  
                sb.append(hexDigits[iD1] + "" + hexDigits[iD2]);  
            }  
            return sb.toString();  
        } catch (NoSuchAlgorithmException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
成功图:
蓝域安卓黑客破解

PS:
方法需要引入PKCS7类,该类在rt.jar包下有,大家看可以手动导出,


下面是测试APP,大家可以使用Kstools或者MT管理器测试
百度云盘链接: https://pan.baidu.com/s/1xuZTONp4BJwEedKzcgsX2Q 提取码: u8x8

以上就是蓝域安卓破解网为您分享的新手怎么Kstool爆破签名验证?,如果能够帮助您,记得收藏+关注!

本文地址:http://www.yemogege.cn/nxxg-jswz/380.html


版权保护: 本文由admin所发布,转载请保留本文链接: http://www.yemogege.cn/nxxg-jswz/380.html

免责声明:蓝域安全网所发布的一切渗透技术视频文章,逆向脱壳病毒分析教程,以及相关实用源码仅限用于学习和研究目的
请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除! 

侵权删帖/违法举报/投稿等事物联系邮箱:yemogege@vip.qq.com 网站地图