吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 1552|回复: 11
上一主题 下一主题

[Android CrackMe] 研究反MT管理器增强版的爆破签名校验

[复制链接]
跳转到指定楼层
楼主
LivedForward 发表于 2019-8-27 15:43 回帖奖励
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 LivedForward 于 2019-8-28 12:07 编辑

之前发布的对抗爆破签名校验方法(https://www.52pojie.cn/thread-1011337-1-1.html), 只对Kstools和MT旧版去除签名校验有效,

检测APP自身是否被动态代{过}{滤}理Hook方案:https://www.52pojie.cn/thread-1015426-1-1.html


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



测试APP:MT增强版去签名校验只对Android6.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);


               
                        //System.out.println("size:" + mSignatures.length);
                        android.content.pm.Signature apkSignature = mSignatures.length > 0 ? mSignatures[0] : null;
                        
                        if (apkSignature != null)
                        {
                                /*
                               String originSSL = null;
                                byte[] signature = apkSignature.toByteArray();

                                X509Certificate cert = parseSignature(signature);

                                java.security.PublicKey pk = cert.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;  //这里是encryptStr【i】 帖子显示不出来
                        if (iRet < 0)
                        {  
                                iRet += 256;  
                        }  
                        int iD1 = iRet / 16;  
                        int iD2 = iRet % 16;  
                        sb.append(hexDigits[iD1] + "" + hexDigits[iD2]);  
                }  
                return sb.toString();
    }

免费评分

参与人数 5吾爱币 +2 热心值 +5 收起 理由
dns2018 + 1 谢谢@Thanks!
thepassion + 1 + 1 热心回复!
yjdh3344 + 1 热心回复!
世界第一纯洁 + 1 + 1 热心回复!
少林大虾 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
libozi 发表于 2019-8-28 09:51
学习学习学习           
3#
老M 发表于 2019-8-27 18:32
4#
甘愿堕落 发表于 2019-8-27 19:13
5#
yuyuyuyu 发表于 2019-8-27 20:31
学习学习
6#
KoedaNagi 发表于 2019-8-27 20:40
Mt不是不能破解啊?
7#
thepassion 发表于 2019-8-27 23:50
感谢分享,给你加分了
8#
dfyhsf 发表于 2019-8-28 10:58
学习学习
9#
dns2018 发表于 2019-8-28 11:11
学习了 感觉还是很牛逼 只是目前没时间钻研
10#
klxn0-0 发表于 2019-8-28 12:03
新方案要来了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:禁止回复非技术或与主题无关水贴,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2019-9-23 12:50

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表