From 36236653bdbf8c358d4f39ad75fa87a6ba16b2bb Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sat, 6 Dec 2025 14:09:40 +0800 Subject: [PATCH] feat: support appendLambdaSuffix --- .../javaweb/memshell/MemShellGenerator.java | 5 +++++ .../javaweb/memshell/config/ShellConfig.java | 6 ++++++ .../javaweb/probe/ProbeShellGenerator.java | 3 +++ .../javaweb/probe/config/ProbeConfig.java | 6 ++++++ .../reajason/javaweb/utils/CommonUtil.java | 7 +++++++ .../components/memshell/main-config-card.tsx | 20 ++++++++++++++++++- .../probeshell/main-config-card.tsx | 18 ++++++++++++++++- web/app/i18n/common/en.json | 4 +++- web/app/i18n/common/zh-CN.json | 4 +++- web/app/types/memshell.ts | 2 ++ web/app/types/probeshell.ts | 1 + web/app/types/schema.ts | 3 +++ web/app/utils/transformer.ts | 3 +++ 13 files changed, 78 insertions(+), 4 deletions(-) diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/MemShellGenerator.java b/generator/src/main/java/com/reajason/javaweb/memshell/MemShellGenerator.java index d6c2a0a7..3078e810 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/MemShellGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/MemShellGenerator.java @@ -46,6 +46,11 @@ public class MemShellGenerator { injectorConfig.setInjectorClassName(CommonUtil.generateInjectorClassName()); } + if (shellConfig.isLambdaSuffix()) { + shellToolConfig.setShellClassName(CommonUtil.appendLambdaSuffix(shellToolConfig.getShellClassName())); + injectorConfig.setInjectorClassName(CommonUtil.appendLambdaSuffix(injectorConfig.getInjectorClassName())); + } + byte[] shellBytes = ShellToolFactory.generateBytes(shellConfig, shellToolConfig); injectorConfig.setInjectorClass(injectorClass); diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/config/ShellConfig.java b/generator/src/main/java/com/reajason/javaweb/memshell/config/ShellConfig.java index 897b6671..7e226a5b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/config/ShellConfig.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/config/ShellConfig.java @@ -61,6 +61,12 @@ public class ShellConfig { @Builder.Default private boolean shrink = false; + /** + * 追加 Lambda 类名后缀 + */ + @Builder.Default + private boolean lambdaSuffix = false; + public boolean isDebugOff() { return !debug; } diff --git a/generator/src/main/java/com/reajason/javaweb/probe/ProbeShellGenerator.java b/generator/src/main/java/com/reajason/javaweb/probe/ProbeShellGenerator.java index c3069988..8847d5e5 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/ProbeShellGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/ProbeShellGenerator.java @@ -15,6 +15,9 @@ public class ProbeShellGenerator { if (StringUtils.isBlank(probeConfig.getShellClassName())) { probeConfig.setShellClassName(CommonUtil.generateInjectorClassName()); } + if (probeConfig.isLambdaSuffix()) { + probeConfig.setShellClassName(CommonUtil.appendLambdaSuffix(probeConfig.getShellClassName())); + } byte[] bytes = probeConfig.getProbeMethod().generateBytes(probeConfig, contentConfig); return ProbeShellResult.builder() .shellClassName(probeConfig.getShellClassName()) diff --git a/generator/src/main/java/com/reajason/javaweb/probe/config/ProbeConfig.java b/generator/src/main/java/com/reajason/javaweb/probe/config/ProbeConfig.java index 7d817d6a..1b39c9b5 100644 --- a/generator/src/main/java/com/reajason/javaweb/probe/config/ProbeConfig.java +++ b/generator/src/main/java/com/reajason/javaweb/probe/config/ProbeConfig.java @@ -53,6 +53,12 @@ public class ProbeConfig { @Builder.Default private boolean staticInitialize = false; + /** + * 追加 Lambda 类名后缀 + */ + @Builder.Default + private boolean lambdaSuffix = false; + public boolean isDebugOff() { return !debug; } diff --git a/generator/src/main/java/com/reajason/javaweb/utils/CommonUtil.java b/generator/src/main/java/com/reajason/javaweb/utils/CommonUtil.java index 44349bd4..b3f9c690 100644 --- a/generator/src/main/java/com/reajason/javaweb/utils/CommonUtil.java +++ b/generator/src/main/java/com/reajason/javaweb/utils/CommonUtil.java @@ -101,6 +101,13 @@ public class CommonUtil { return getRandomPackageName() + "." + INJECTOR_CLASS_NAMES[new Random().nextInt(INJECTOR_CLASS_NAMES.length)]; } + public static String appendLambdaSuffix(String className) { + if (className.contains("$Lambda$")) { + return className; + } + return className + "$Proxy0$$Lambda$1"; + } + public static String generateShellClassName(String server, String shellType) { String packageName; switch (server) { diff --git a/web/app/components/memshell/main-config-card.tsx b/web/app/components/memshell/main-config-card.tsx index 8e76f548..ca483dcb 100644 --- a/web/app/components/memshell/main-config-card.tsx +++ b/web/app/components/memshell/main-config-card.tsx @@ -358,7 +358,7 @@ export default function MainConfigCard({ )} /> -
+
)} /> + ( + + + + + + + )} + /> ( -
+
)} /> + ( + + + + + + + )} + /> v{{latestVersion}})", - "shellTool": "Shell Tool" + "shellTool": "Shell Tool", + "lambdaSuffix": "LambdaSuffix", + "probe": "Probe Mode" } diff --git a/web/app/i18n/common/zh-CN.json b/web/app/i18n/common/zh-CN.json index 284e7da2..d8f4c6e7 100644 --- a/web/app/i18n/common/zh-CN.json +++ b/web/app/i18n/common/zh-CN.json @@ -35,5 +35,7 @@ "usage": "使用指南", "version.updateAvailable": "有可用升级", "version.updateAvailableTooltip": "点击前往 GitHub Release ( v{{currentVersion}} -> v{{latestVersion}})", - "shellTool": "内存马工具" + "shellTool": "内存马工具", + "lambdaSuffix": "Lambda 类名后缀", + "probe": "回显模式" } diff --git a/web/app/types/memshell.ts b/web/app/types/memshell.ts index 00349497..fa121848 100644 --- a/web/app/types/memshell.ts +++ b/web/app/types/memshell.ts @@ -8,6 +8,8 @@ export interface ShellConfig { byPassJavaModule?: boolean; obfuscate?: boolean; shrink?: boolean; + probe?: boolean; + lambdaSuffix?:boolean; } export interface ShellToolConfig { diff --git a/web/app/types/probeshell.ts b/web/app/types/probeshell.ts index a8979620..f45e99b0 100644 --- a/web/app/types/probeshell.ts +++ b/web/app/types/probeshell.ts @@ -17,6 +17,7 @@ export interface ProbeConfig { byPassJavaModule?: boolean; shrink?: boolean; staticInitialize?: boolean; + lambdaSuffix?: boolean; } export interface ProbeContentConfig { diff --git a/web/app/types/schema.ts b/web/app/types/schema.ts index 0d036344..e5c875b8 100644 --- a/web/app/types/schema.ts +++ b/web/app/types/schema.ts @@ -26,6 +26,8 @@ export const memShellFormSchema = yup.object({ injectorClassName: yup.string().optional(), packingMethod: yup.string().required().min(1), shrink: yup.boolean().optional(), + lambdaSuffix: yup.boolean().optional(), + probe: yup.boolean().optional(), shellClassBase64: yup.string().optional(), encryptor: yup.string().optional(), }); @@ -165,6 +167,7 @@ export const probeShellFormSchema = yup.object().shape({ byPassJavaModule: yup.boolean().optional(), shrink: yup.boolean().optional(), staticInitialize: yup.boolean().optional(), + lambdaSuffix: yup.boolean().optional(), }); type ProbeValidationResult = ResolverResult; diff --git a/web/app/utils/transformer.ts b/web/app/utils/transformer.ts index 079491fc..503ad0e8 100644 --- a/web/app/utils/transformer.ts +++ b/web/app/utils/transformer.ts @@ -19,6 +19,8 @@ export function transformToPostData(formValue: MemShellFormSchema) { targetJreVersion: formValue.targetJdkVersion, byPassJavaModule: formValue.byPassJavaModule, shrink: formValue.shrink, + lambdaSuffix: formValue.lambdaSuffix, + probe: formValue.probe }; const shellToolConfig: ShellToolConfig = { shellClassName: formValue.shellClassName, @@ -56,6 +58,7 @@ export function transformToProbePostData(formValue: ProbeShellFormSchema) { debug: formValue.debug, byPassJavaModule: formValue.byPassJavaModule, staticInitialize: formValue.staticInitialize, + lambdaSuffix: formValue.lambdaSuffix, }; const probeContentConfig: ProbeContentConfig = { host: formValue.host,