Skip to content

Commit

Permalink
Bug Repair
Browse files Browse the repository at this point in the history
修复 springboot下生成 直接运行的jar 内部类单独提取加密时 生成的class位置不正确
  • Loading branch information
lqs1848 committed Feb 23, 2021
1 parent f2a6619 commit 0e4fe05
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 27 deletions.
Binary file modified allatori_crack.jar
Binary file not shown.
70 changes: 43 additions & 27 deletions src/org/lqs1848/crack/allatori/RandomName.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
* 随机名称
*/
public class RandomName {
private static final int len = 6;
private static List<String> seedList = List.of("Ii", "oO", "Pp", "xX",
"abcdefghijklmiopqrstuvwxyzABCDEFGHIJKLMIOPQRSTUVWXYZ");
private static final int chaosLen = 6;
private static final String alp = "abcdefghijklmiopqrstuvwxyzABCDEFGHIJKLMIOPQRSTUVWXYZ";
private static List<String> seedList = List.of("Ii", "oO", "Pp", "xX", alp);

// 同一个方法固定加密为相同的随机名称
private static Map<String, String> mark = new HashMap<>();
Expand All @@ -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;
Expand All @@ -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 是否加密包名和类名
Expand All @@ -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<String> nameSet = repMap.getOrDefault(className, new HashSet<>());
Expand All @@ -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();
Expand All @@ -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<str.length(); i++){
public static boolean isClassName(String str) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if(c >= 'A' && c <= 'Z') {
if (c >= 'A' && c <= 'Z') {
return true;
}
}
Expand Down

0 comments on commit 0e4fe05

Please # to comment.