From 6810bea753ba480e10e340640eb624b9838f3df1 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Tue, 18 Feb 2025 23:50:17 +0800 Subject: [PATCH] fix: keyword is not allowed for classname --- .../javaweb/memshell/utils/CommonUtil.java | 18 ++++++++ .../javaweb/antsword/AntSwordManager.java | 2 +- .../com/reajason/javaweb/antsword/Utils.java | 2 +- .../javaweb/behinder/BehinderManager.java | 2 +- .../com/reajason/javaweb/behinder/Utils.java | 2 +- .../javaweb/godzilla/GodzillaManager.java | 3 +- .../com/reajason/javaweb/godzilla/Utils.java | 41 +++++++++++++++++++ 7 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/Utils.java diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/utils/CommonUtil.java b/generator/src/main/java/com/reajason/javaweb/memshell/utils/CommonUtil.java index b887cc12..aa0fb5db 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/utils/CommonUtil.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/utils/CommonUtil.java @@ -6,7 +6,10 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.SecureRandom; +import java.util.Arrays; +import java.util.HashSet; import java.util.Random; +import java.util.Set; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -16,6 +19,13 @@ import java.util.zip.GZIPOutputStream; public class CommonUtil { public static final String[] INJECTOR_CLASS_NAMES = new String[]{"SignatureUtils", "NetworkUtils", "KeyUtils", "EncryptionUtils", "SessionDataUtil", "SOAPUtils", "ReflectUtil", "HttpClientUtil", "EncryptionUtil", "XMLUtil", "JSONUtil", "FileUtils", "DateUtil", "StringUtil", "MathUtil", "HttpUtil", "CSVUtil", "ImageUtil", "ThreadUtil", "ReportUtil", "EncodingUtil", "ConfigurationUtil", "HTMLUtil", "SerializationUtil"}; + public static final Set JAVA_KEYWORDS = new HashSet<>(Arrays.asList(new String[]{ + "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", + "continue", "default", "do", "double", "else", "enum", "extends", "final", "finally", "float", + "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", + "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", + "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while" + })); private static final String[] PACKAGE_NAMES = { "org.springframework", "org.apache.commons", @@ -59,6 +69,14 @@ public class CommonUtil { } public static String getRandomString(int length) { + String randomString = getRandomStringInternal(length); + while (JAVA_KEYWORDS.contains(randomString)) { + randomString = getRandomStringInternal(length); + } + return randomString; + } + + private static String getRandomStringInternal(int length) { String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; SecureRandom random = new SecureRandom(); StringBuilder sb = new StringBuilder(); diff --git a/tools/ant-sword/src/main/java/com/reajason/javaweb/antsword/AntSwordManager.java b/tools/ant-sword/src/main/java/com/reajason/javaweb/antsword/AntSwordManager.java index 6300db34..de92ba7b 100644 --- a/tools/ant-sword/src/main/java/com/reajason/javaweb/antsword/AntSwordManager.java +++ b/tools/ant-sword/src/main/java/com/reajason/javaweb/antsword/AntSwordManager.java @@ -31,7 +31,7 @@ public class AntSwordManager { @SneakyThrows public String getInfo() { byte[] bytes = new ByteBuddy(ClassFileVersion.JAVA_V6).redefine(Info.class) - .name(Utils.getRandomClassName(Info.class.getName())) + .name(Utils.getRandomClassName()) .visit(new TargetJreVersionVisitorWrapper(Opcodes.V1_6)) .make().getBytes(); String base64String = Base64.getEncoder().encodeToString(bytes); diff --git a/tools/ant-sword/src/main/java/com/reajason/javaweb/antsword/Utils.java b/tools/ant-sword/src/main/java/com/reajason/javaweb/antsword/Utils.java index 0c244281..8f6b0eb6 100644 --- a/tools/ant-sword/src/main/java/com/reajason/javaweb/antsword/Utils.java +++ b/tools/ant-sword/src/main/java/com/reajason/javaweb/antsword/Utils.java @@ -20,7 +20,7 @@ public class Utils { return sb.toString(); } - public static String getRandomClassName(String sourceName) { + public static String getRandomClassName() { String[] domainAs = new String[]{"com", "net", "org", "sun"}; String domainB = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase(); String domainC = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase(); diff --git a/tools/behinder/src/main/java/com/reajason/javaweb/behinder/BehinderManager.java b/tools/behinder/src/main/java/com/reajason/javaweb/behinder/BehinderManager.java index e8da3932..eac79f7a 100644 --- a/tools/behinder/src/main/java/com/reajason/javaweb/behinder/BehinderManager.java +++ b/tools/behinder/src/main/java/com/reajason/javaweb/behinder/BehinderManager.java @@ -44,7 +44,7 @@ public class BehinderManager { @SneakyThrows public boolean test() { byte[] bytes = new ByteBuddy(ClassFileVersion.JAVA_V6).redefine(Test.class) - .name(Utils.getRandomClassName(Test.class.getName())) + .name(Utils.getRandomClassName()) .visit(new TargetJreVersionVisitorWrapper(Opcodes.V1_6)) .make().getBytes(); String param = "xixi"; diff --git a/tools/behinder/src/main/java/com/reajason/javaweb/behinder/Utils.java b/tools/behinder/src/main/java/com/reajason/javaweb/behinder/Utils.java index a2413f5a..696a20e4 100644 --- a/tools/behinder/src/main/java/com/reajason/javaweb/behinder/Utils.java +++ b/tools/behinder/src/main/java/com/reajason/javaweb/behinder/Utils.java @@ -20,7 +20,7 @@ public class Utils { return sb.toString(); } - public static String getRandomClassName(String sourceName) { + public static String getRandomClassName() { String[] domainAs = new String[]{"com", "net", "org", "sun"}; String domainB = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase(); String domainC = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase(); diff --git a/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java index 79510030..f534af1e 100644 --- a/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java +++ b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/GodzillaManager.java @@ -61,11 +61,10 @@ public class GodzillaManager implements Closeable { @SneakyThrows public static byte[] generateGodzilla() { Random random = new Random(); - String className = CLASS_NAMES.get(random.nextInt(CLASS_NAMES.size())); try (DynamicType.Unloaded make = new ByteBuddy() .redefine(Payload.class) .visit(TargetJreVersionVisitorWrapper.DEFAULT) - .name(className) + .name(Utils.getRandomClassName()) .make()) { return make.getBytes(); } diff --git a/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/Utils.java b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/Utils.java new file mode 100644 index 00000000..46356680 --- /dev/null +++ b/tools/godzilla/src/main/java/com/reajason/javaweb/godzilla/Utils.java @@ -0,0 +1,41 @@ +package com.reajason.javaweb.godzilla; + +import java.util.Random; + +/** + * @author ReaJason + * @since 2024/12/21 + */ +public class Utils { + + public static String getRandomAlpha(int length) { + String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + Random random = new Random(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < length; ++i) { + int number = random.nextInt(52); + sb.append(str.charAt(number)); + } + + return sb.toString(); + } + + public static String getRandomClassName() { + String[] domainAs = new String[]{"com", "net", "org", "sun"}; + String domainB = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase(); + String domainC = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase(); + String domainD = getRandomAlpha((new Random()).nextInt(5) + 3).toLowerCase(); + String className = getRandomAlpha((new Random()).nextInt(7) + 4); + className = className.substring(0, 1).toUpperCase() + className.substring(1).toLowerCase(); + int domainAIndex = (new Random()).nextInt(4); + String domainA = domainAs[domainAIndex]; + int randomSegments = (new Random()).nextInt(3) + 3; + if (randomSegments == 3) { + return domainA + "." + domainB + "." + className; + } else if (randomSegments == 4) { + return domainA + "." + domainB + "." + domainC + "." + className; + } else { + return domainA + "." + domainB + "." + domainC + "." + className; + } + } +}