研究反MT管理器增强版的去除签名校验

之前发布的对抗爆破签名校验方法只对Kstools和MT旧版去除签名校验有效,


我又通过反射获取签名信息比对,MT管理器只在Android6.0及以下可以Hook,7.0及以上不能Hook,
大家可不可以·在这里指点以下呢?我猜想增强版去签名校验是否Hook了IO中相关函数.
希望大家可以指点迷津哦.


测试APP:MT增强版去签名校验只对6.0及以下有效
链接: https://pan.baidu.com/s/1Ul-GpzvNpGxTtqk-ZPVnhg 提取码: u1f6


下面是反射获取签名信息代码:

public  String getApkSignatureModules(Context context, String apkPath)
        {
                String sign = null;
                try
                {
                        Class clazz = Class.forName("android.content.pm.PackageParser");
                        Object packageParser = getParserObject(clazz);


                        Object packag = getPackage(context, clazz, packageParser, apkPath);


                        Method collectCertificatesMethod = clazz.getDeclaredMethod("collectCertificates", Class.forName("android.content.pm.PackageParser$Package"), int.class);
                        collectCertificatesMethod.setAccessible(true);
                        collectCertificatesMethod.invoke(packageParser, packag, PackageManager.GET_SIGNATURES);
                        android.content.pm.Signature mSignatures[] = (android.content.pm.Signature[]) packag.getClass().getField("mSignatures").get(packag);


                        showDialog(android.content.pm.Signature.class.getClassLoader().getClass().getCanonicalName(),"");
                        //System.out.println("size:" + mSignatures.length);
                        android.content.pm.Signature apkSignature = mSignatures.length > 0 ? mSignatures[0] : null;
                       
                        if (apkSignature != null)
                        {
                                /*
                                String originSSL = null;
                                java.security.PublicKey pk = apkSignature.getPublicKey();
                                originSSL=pk.toString();
                                int start = originSSL.indexOf("modulus=");
                                int end = originSSL.lastIndexOf(",public");
                                if (start != -1 && end != -1)
                                        return originSSL.substring(start + 8, end);
                                return null;
                                */
                                sign =  getHash(new String(apkSignature.toByteArray(), "UTF-8"), "SHA");
                                // new String(apkSignature.toByteArray(), "UTF-8");             }
}
                }
                catch (Exception e)
                {
                        showDialog(ExceptionUtils.getExceptionTips(e),"");
                        e.printStackTrace();
                }
                return sign;
        }


        private static Object getParserObject(Class clazz) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException
        {
                Constructor con = null;
                if(Build.VERSION.SDK_INT >= 21 ){
                        con = clazz.getDeclaredConstructor();
                        con.setAccessible(true);
                        return con.newInstance();
                }else{
                        con = clazz.getDeclaredConstructor(String.class);
                        con.setAccessible(true);
                        return con.newInstance("");
                }
        }


        private static Object getPackage(Context c, Class clazz, Object instance, String path) throws Exception
        {
                Object pkg = null;
                if (Build.VERSION.SDK_INT >= 21)
                {
                        Method method = clazz.getDeclaredMethod("parsePackage", File.class, int.class);
                        method.setAccessible(true);
                        pkg = method.invoke(instance, new File(path) , 0x0004);
                }
                else
                {
                        Method method = clazz.getDeclaredMethod("parsePackage", File.class, String.class, DisplayMetrics.class, int.class);
                        method.setAccessible(true);
                        pkg = method.invoke(instance, new File(path), null, c.getResources().getDisplayMetrics(), 0x0004);
                }


                return pkg;
        }
        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 = null;
                try
                {
                        md5 =   MessageDigest.getInstance(hashType);
                }
                catch (NoSuchAlgorithmException e)
                {
                        e.printStackTrace();
                }  
                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();
    }

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消
    昵称