From d57e691e1f3760eaa72d943d4cea9d20d152756e Mon Sep 17 00:00:00 2001 From: ReaJason Date: Sun, 30 Mar 2025 14:52:34 +0800 Subject: [PATCH] feat: support simple obfuscation (#13) --- bom/build.gradle | 1 + build.gradle | 4 --- generator/build.gradle | 1 + .../javaweb/memshell/MemShellGenerator.java | 29 ++++++++++++++++++ .../integration/ShellAssertionTool.java | 5 +++ .../memshell-agent-asm/build.gradle | 4 --- .../memshell-agent-bytebuddy/build.gradle | 3 -- .../memshell-agent-javassist/build.gradle | 4 --- settings.gradle | 8 +++++ vul/vul-springboot1/build.gradle | 4 --- vul/vul-springboot2/build.gradle | 4 --- web/bun.lockb | Bin 200748 -> 201772 bytes web/package.json | 14 ++++----- web/src/components/main-config-card.tsx | 12 ++++++++ web/src/i18n/en.json | 6 ++-- web/src/i18n/zh-CN.json | 6 ++-- web/src/routes/index.tsx | 5 +++ web/src/types/schema.ts | 1 + web/src/utils/transformer.ts | 1 + 19 files changed, 78 insertions(+), 34 deletions(-) diff --git a/bom/build.gradle b/bom/build.gradle index 43810336..fe96df6e 100644 --- a/bom/build.gradle +++ b/bom/build.gradle @@ -6,6 +6,7 @@ dependencies { constraints { api 'net.bytebuddy:byte-buddy:1.+' api 'org.ow2.asm:asm-commons:9.7.1' + api 'com.github.jar-analyzer:class-obf:1.5.0' api 'javax.servlet:javax.servlet-api:3.0.1' api 'jakarta.servlet:jakarta.servlet-api:6.0.0' diff --git a/build.gradle b/build.gradle index 60fc093e..a0909fe8 100644 --- a/build.gradle +++ b/build.gradle @@ -12,10 +12,6 @@ allprojects { implementation platform(project(':bom')) } } - - repositories { - mavenCentral() - } } idea { diff --git a/generator/build.gradle b/generator/build.gradle index 4a07415e..bc13edb5 100644 --- a/generator/build.gradle +++ b/generator/build.gradle @@ -39,6 +39,7 @@ dependencies { implementation project(":memshell-java8") implementation 'net.bytebuddy:byte-buddy' implementation 'org.ow2.asm:asm-commons' + implementation 'com.github.jar-analyzer:class-obf' implementation 'javax.servlet:javax.servlet-api' implementation 'javax.websocket:javax.websocket-api' 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 9f70e85c..872d1ddc 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/MemShellGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/MemShellGenerator.java @@ -4,6 +4,8 @@ import com.reajason.javaweb.memshell.config.*; import com.reajason.javaweb.memshell.generator.*; import com.reajason.javaweb.memshell.server.AbstractShell; import com.reajason.javaweb.memshell.utils.CommonUtil; +import me.n1ar4.clazz.obfuscator.api.ClassObf; +import me.n1ar4.clazz.obfuscator.config.BaseConfig; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -46,12 +48,39 @@ public class MemShellGenerator { byte[] shellBytes = generateShellBytes(shellConfig, shellToolConfig); + if (shellConfig.isObfuscate()) { + BaseConfig config = BaseConfig.Default(); + config.setIgnorePublic(true); + config.setEnableMethodName(false); + config.setEnableFieldName(false); + config.setEnableAES(false); + config.setEnableAdvanceString(false); + config.setQuiet(true); + + ClassObf classObf = new ClassObf(config); + shellBytes = classObf.run(shellBytes).getData(); + } + injectorConfig.setInjectorClass(injectorClass); injectorConfig.setShellClassName(shellToolConfig.getShellClassName()); injectorConfig.setShellClassBytes(shellBytes); InjectorGenerator injectorGenerator = new InjectorGenerator(shellConfig, injectorConfig); byte[] injectorBytes = injectorGenerator.generate(); + + if (shellConfig.isObfuscate()) { + BaseConfig config = BaseConfig.Default(); + config.setIgnorePublic(true); + config.setEnableMethodName(false); + config.setEnableFieldName(false); + config.setEnableAES(false); + config.setEnableAdvanceString(false); + config.setQuiet(true); + + ClassObf classObf = new ClassObf(config); + injectorBytes = classObf.run(injectorBytes).getData(); + } + Map innerClassBytes = injectorGenerator.getInnerClassBytes(); return GenerateResult.builder() diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java b/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java index f509898c..eba7e9c9 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/ShellAssertionTool.java @@ -232,8 +232,13 @@ public class ShellAssertionTool { .targetJreVersion(targetJdkVersion) .debug(true) .shrink(true) + .obfuscate(true) .build(); + if (ShellTool.NeoreGeorg.equals(shellTool)) { + shellConfig.setObfuscate(false); + } + ShellToolConfig shellToolConfig = null; String uniqueName = shellTool + RandomStringUtils.randomAlphabetic(5) + shellType + RandomStringUtils.randomAlphabetic(5) + packer.name(); switch (shellTool) { diff --git a/memshell-agent/memshell-agent-asm/build.gradle b/memshell-agent/memshell-agent-asm/build.gradle index 1c0f6e68..df0d3a1e 100644 --- a/memshell-agent/memshell-agent-asm/build.gradle +++ b/memshell-agent/memshell-agent-asm/build.gradle @@ -6,10 +6,6 @@ plugins { group = 'com.reajason.javaweb' version = '1.0.0' -repositories { - mavenCentral() -} - java { toolchain { languageVersion = JavaLanguageVersion.of(8) diff --git a/memshell-agent/memshell-agent-bytebuddy/build.gradle b/memshell-agent/memshell-agent-bytebuddy/build.gradle index 8cc99a00..1d470d51 100644 --- a/memshell-agent/memshell-agent-bytebuddy/build.gradle +++ b/memshell-agent/memshell-agent-bytebuddy/build.gradle @@ -5,9 +5,6 @@ plugins { group = 'com.reajason.javaweb' version = '1.0.0' -repositories { - mavenCentral() -} dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') diff --git a/memshell-agent/memshell-agent-javassist/build.gradle b/memshell-agent/memshell-agent-javassist/build.gradle index 8cc99a00..d5eaeef3 100644 --- a/memshell-agent/memshell-agent-javassist/build.gradle +++ b/memshell-agent/memshell-agent-javassist/build.gradle @@ -5,10 +5,6 @@ plugins { group = 'com.reajason.javaweb' version = '1.0.0' -repositories { - mavenCentral() -} - dependencies { testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' diff --git a/settings.gradle b/settings.gradle index c1cfcf81..ebcd4e42 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,6 +2,14 @@ plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.9.0' } +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + mavenCentral() + maven { url 'https://jitpack.io' } + } +} + rootProject.name = 'MemShellParty' include 'bom' diff --git a/vul/vul-springboot1/build.gradle b/vul/vul-springboot1/build.gradle index 7c09bf7a..29257cfc 100644 --- a/vul/vul-springboot1/build.gradle +++ b/vul/vul-springboot1/build.gradle @@ -8,10 +8,6 @@ java { sourceCompatibility = JavaVersion.VERSION_1_8 } -repositories { - mavenCentral() -} - configurations { providedRuntime } diff --git a/vul/vul-springboot2/build.gradle b/vul/vul-springboot2/build.gradle index 297381d1..ef477fa6 100644 --- a/vul/vul-springboot2/build.gradle +++ b/vul/vul-springboot2/build.gradle @@ -9,10 +9,6 @@ java { sourceCompatibility = JavaVersion.VERSION_1_8 } -repositories { - mavenCentral() -} - dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'commons-io:commons-io:2.+' diff --git a/web/bun.lockb b/web/bun.lockb index 3340432020d593698889498fa9a030771be5fb4f..0f676f387b2913b52ef89eaf33b31e2923b0df3b 100755 GIT binary patch delta 27500 zcmeHw30RM5-}Zgq^{2a$q*5s=iIUQy{?e|bQjsm82vLLxgF$61CE0FVmN7JzVK8_w z+4n(~8JRJ|%)>Cu*mq+a%y<6o7wnD_mT?>MGo&j0zl&TGH!Yr7ZMY+PAq z{~c$GR%+oKac1!-nK?r{S&({flM_Zv>mdy$oyt zp52_|%)$9^+k*##?ZDl^^}&Y`pTg(3b6f*(AFvg8+~|zq13Au@i-JHId#M3j!0*8w z?!j?&z*<4FN4%e%H8^v0Z|SPBP2ON6OW7u<#dG%LI7_$-Q4KS2mQS1E8RJHC$DmVo zxn7Ds9{v<>R7U!M(P)qyxJ9_NW=MhCriy>Dw^E85U<&6CMs?~d33z7ZHiba#a7P-c zv*8n@BAsI|)|%t2p-l&qUpAQ9@Hv<=p8%$+4av>O9e_e4!%g951t^(+@5gbDaOdke zt}!@wM0VCd∓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 delta 27008 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 )} /> + ( + + + + + + + )} + /> diff --git a/web/src/i18n/en.json b/web/src/i18n/en.json index 6e913ec7..ffe3542e 100644 --- a/web/src/i18n/en.json +++ b/web/src/i18n/en.json @@ -37,7 +37,8 @@ "shellMountType": "Shell Mount Type", "shellTool": "Shell Tool", "shrink": "Shrink Bytecode", - "urlPattern": "URL Pattern" + "urlPattern": "URL Pattern", + "obfuscate": "Obfuscate" }, "optional": "(Optional)", "packageConfig": { @@ -130,7 +131,8 @@ "targetServerRequest": "Request", "try-to-use-shell": "Try to use the memory shell", "waitingForGeneration": "// Waiting for generation...", - "customShellClass": "Custom shell class is required, base64 or classfile" + "customShellClass": "Custom shell class is required, base64 or classfile", + "neoreGeorgObfuscate": "Do not support obfuscate for NeoreGeorg" }, "version": { "updateAvailable": "Update Available", diff --git a/web/src/i18n/zh-CN.json b/web/src/i18n/zh-CN.json index b088cfcf..6d431528 100644 --- a/web/src/i18n/zh-CN.json +++ b/web/src/i18n/zh-CN.json @@ -37,7 +37,8 @@ "shellMountType": "内存马挂载类型", "shellTool": "内存马功能", "shrink": "缩小字节码", - "urlPattern": "请求路径" + "urlPattern": "请求路径", + "obfuscate": "代码混淆" }, "optional": "(可选)", "packageConfig": { @@ -130,7 +131,8 @@ "targetServerRequest": "请求适配", "try-to-use-shell": "尝试利用内存马", "waitingForGeneration": "// 等待填写参数生成中...", - "customShellClass": "请输入自定义内存马类,base64 或类文件" + "customShellClass": "请输入自定义内存马类,base64 或类文件", + "neoreGeorgObfuscate": "NeoreGeorg 目前不支持代码混淆" }, "version": { "updateAvailable": "有可用升级", diff --git a/web/src/routes/index.tsx b/web/src/routes/index.tsx index dffcd319..6445c0d4 100644 --- a/web/src/routes/index.tsx +++ b/web/src/routes/index.tsx @@ -87,6 +87,11 @@ function IndexComponent() { toast.warning(t("tips.customShellClass")); return false; } + + if (values.obfuscate && values.shellTool === ShellToolType.NeoreGeorg) { + toast.warning(t("tips.neoreGeorgObfuscate")); + return false; + } return true; } diff --git a/web/src/types/schema.ts b/web/src/types/schema.ts index 336464e6..7c3ffeb8 100644 --- a/web/src/types/schema.ts +++ b/web/src/types/schema.ts @@ -19,6 +19,7 @@ export const formSchema = z.object({ injectorClassName: z.optional(z.string()), packingMethod: z.string().min(1), shrink: z.optional(z.boolean()), + obfuscate: z.optional(z.boolean()), shellClassBase64: z.optional(z.string()), }); diff --git a/web/src/utils/transformer.ts b/web/src/utils/transformer.ts index e5d872a7..589443ca 100644 --- a/web/src/utils/transformer.ts +++ b/web/src/utils/transformer.ts @@ -10,6 +10,7 @@ export function transformToPostData(formValue: FormSchema) { targetJreVersion: formValue.targetJdkVersion, byPassJavaModule: formValue.bypassJavaModule, shrink: formValue.shrink, + obfuscate: formValue.obfuscate, }; const shellToolConfig: ShellToolConfig = { shellClassName: formValue.shellClassName,