diff --git a/allatori_crack.jar b/allatori_crack.jar index 9db3ffd..a718a59 100644 Binary files a/allatori_crack.jar and b/allatori_crack.jar differ diff --git a/src/org/lqs1848/crack/allatori/RandomName.java b/src/org/lqs1848/crack/allatori/RandomName.java index c2ee06a..3f8420a 100644 --- a/src/org/lqs1848/crack/allatori/RandomName.java +++ b/src/org/lqs1848/crack/allatori/RandomName.java @@ -11,9 +11,9 @@ * 随机名称 */ public class RandomName { - private static final int len = 6; - private static List seedList = List.of("Ii", "oO", "Pp", "xX", - "abcdefghijklmiopqrstuvwxyzABCDEFGHIJKLMIOPQRSTUVWXYZ"); + private static final int chaosLen = 6; + private static final String alp = "abcdefghijklmiopqrstuvwxyzABCDEFGHIJKLMIOPQRSTUVWXYZ"; + private static List seedList = List.of("Ii", "oO", "Pp", "xX", alp); // 同一个方法固定加密为相同的随机名称 private static Map mark = new HashMap<>(); @@ -36,31 +36,43 @@ public static String get(String pendingStr, String originalEncryptStr) { * lang/Object; 这样的 字符串 如果版本有变动 要判断 传入的参数和传出的参数是否变动了 */ // param.indexOf("AllatoriDecryptString") - - //忽略加密 - if(pendingStr.equals(originalEncryptStr)) return originalEncryptStr; - + + // 忽略加密 + if (pendingStr.equals(originalEncryptStr)) { + //System.out.println("忽略:"+pendingStr); + //这里应该要生成一个忽略列表 + //otherAllatori 中对忽略列表 包名前缀相同的项目 加密时 前缀包名不能加密 + return originalEncryptStr; + } + return "ALLATORIxDEMO".equals(originalEncryptStr) ? ALLATORIxDEMO(pendingStr, originalEncryptStr) : otherAllatori(pendingStr, originalEncryptStr); }// method - + /** * 修改类名和包名 */ private static String otherAllatori(String pendingStr, String originalEncryptStr) { + //Bean 名称如果可以重复就不要调用这个方法 + //调用此处已知问题 会导致 + //return originalEncryptStr; + // 改变包名和类名的动作 - if (pendingStr.indexOf("&") == -1) { + if (pendingStr.indexOf("&") == -1 && pendingStr.indexOf("$") == -1) { /* * 原始加密内容 - * org.lqs1848.allatori.test.config.ReportConfig -> org.lqs1848.allatori.test.y.D - * org.lqs1848.allatori.test.interceptor.ReplaceTableInterceptor -> org.lqs1848.allatori.test.h.H - * org.lqs1848.allatori.test.interceptor.ReplaceTableInterceptor$1 -> org.lqs1848.allatori.test.h.D + * org.lqs1848.allatori.test.config.ReportConfig -> org.lqs1848.allatori.test.y.D + * org.lqs1848.allatori.test.interceptor.ReplaceTableInterceptor -> org.lqs1848.allatori.test.h.H + * + * 这个不能加密 加密了在boot项目中 会导致 加密类存放位置错误 比如原始路径为 BOOT-INF.classess.org.xxx.xxx 变到 + * org.xxx.xxx 丢失 BOOT-INF.classess 路径 + * org.lqs1848.allatori.test.interceptor.ReplaceTableInterceptor$1 -> 不加密 */ // 尾部的 $1 是 Allatori用于解密混淆字符串的解密类 - if(originalEncryptStr.matches("[a-z0-9\\.]*\\.[a-z]{1}\\.[a-zA-Z]{1}") - || (originalEncryptStr.matches("[a-z0-9\\.]*\\.[a-zA-Z]{1}") && isClassName(getClassName(pendingStr))) - ){ + if (originalEncryptStr.matches("[a-z0-9\\.]*\\.[a-z]{1}\\.[a-zA-Z]{1}") + || (originalEncryptStr.matches("[a-z0-9\\.]*\\.[a-zA-Z]{1}") && isClassName(getClassName(pendingStr)))) { + String res = mark.get(pendingStr); if (res != null) return res; String className; @@ -70,6 +82,7 @@ private static String otherAllatori(String pendingStr, String originalEncryptStr res = originalEncryptStr.substring(0, originalEncryptStr.length() - 1) + className; mark.put(pendingStr, res); classNameSet.add(className); + return res; } } // if 是否加密包名和类名 @@ -82,15 +95,14 @@ private static String otherAllatori(String pendingStr, String originalEncryptStr * 主要修改方法和变量名称 */ private static String ALLATORIxDEMO(String pendingStr, String originalEncryptStr) { - //将所有 - //方法名相同 参数相同的方法 加密为相同的字符串 - //变量名相同 变量类型相同 也加密为相同的字符串 + // 将所有 + // 方法名相同 参数相同的方法 加密为相同的字符串 + // 变量名相同 变量类型相同 也加密为相同的字符串 String[] params = pendingStr.split("&"); pendingStr = params[1] + params[2]; String res = mark.get(pendingStr); - if (res != null) - return res; + if (res != null) return res; String className = getClassName(pendingStr); Set nameSet = repMap.getOrDefault(className, new HashSet<>()); @@ -108,8 +120,13 @@ private static String ALLATORIxDEMO(String pendingStr, String originalEncryptStr public static String chaos() { Random ran = new Random(); - StringBuffer sb = new StringBuffer(); String str = seedList.get(ran.nextInt(seedList.size())); + return chaos(str, chaosLen); + }// method chaos + + public static String chaos(String str, int len) { + Random ran = new Random(); + StringBuffer sb = new StringBuffer(); for (int i = 0; i < len; i++) sb.append(str.charAt(ran.nextInt(str.length()))); return sb.toString(); @@ -128,16 +145,15 @@ public static String getClassName(String param) { }// method /** - * 判断 包名 和 类名 - * 类名一般都会有大写字母 - * 包名没有大写字母 + * 判断 包名 和 类名 类名一般都会有大写字母 包名没有大写字母 + * * @param str * @return */ - public static boolean isClassName(String str){ - for(int i=0; i= 'A' && c <= 'Z') { + if (c >= 'A' && c <= 'Z') { return true; } }