mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 07:00:43 +08:00
feat: support jar packer
This commit is contained in:
@@ -3,11 +3,10 @@ package com.reajason.javaweb.memshell.packer;
|
||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||
import lombok.SneakyThrows;
|
||||
import net.bytebuddy.ByteBuddy;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
@@ -30,7 +29,6 @@ public class AgentJarPacker implements JarPacker {
|
||||
@Override
|
||||
@SneakyThrows
|
||||
public byte[] packBytes(GenerateResult generateResult) {
|
||||
Path jarPath = Files.createTempFile("temp", ".jar");
|
||||
String mainClass = generateResult.getInjectorClassName();
|
||||
String advisorClass = generateResult.getShellClassName();
|
||||
|
||||
@@ -40,8 +38,8 @@ public class AgentJarPacker implements JarPacker {
|
||||
manifest.getMainAttributes().putValue("Premain-Class", mainClass);
|
||||
manifest.getMainAttributes().putValue("Can-Redefine-Classes", "true");
|
||||
manifest.getMainAttributes().putValue("Can-Retransform-Classes", "true");
|
||||
|
||||
try (JarOutputStream targetJar = new JarOutputStream(new FileOutputStream(jarPath.toFile()), manifest)) {
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
try (JarOutputStream targetJar = new JarOutputStream(byteArrayOutputStream, manifest)) {
|
||||
addDependency(targetJar, ByteBuddy.class);
|
||||
|
||||
targetJar.putNextEntry(new JarEntry(mainClass.replace('.', '/') + ".class"));
|
||||
@@ -52,9 +50,7 @@ public class AgentJarPacker implements JarPacker {
|
||||
targetJar.write(generateResult.getShellBytes());
|
||||
targetJar.closeEntry();
|
||||
}
|
||||
byte[] byteArray = IOUtils.toByteArray(new FileInputStream(jarPath.toFile()));
|
||||
FileUtils.deleteQuietly(jarPath.toFile());
|
||||
return byteArray;
|
||||
return byteArrayOutputStream.toByteArray();
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
|
||||
@@ -48,6 +48,9 @@ public interface Packer {
|
||||
* GzipBase64
|
||||
*/
|
||||
GzipBase64(new GzipBase64()),
|
||||
|
||||
Jar(new SimpleJarPacker()),
|
||||
|
||||
/**
|
||||
* BCEL
|
||||
*/
|
||||
@@ -81,6 +84,8 @@ public interface Packer {
|
||||
|
||||
Velocity(new VelocityPacker()),
|
||||
|
||||
|
||||
|
||||
AgentJar(new AgentJarPacker()),
|
||||
;
|
||||
private final Packer packer;
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.reajason.javaweb.memshell.packer;
|
||||
|
||||
import com.reajason.javaweb.memshell.config.GenerateResult;
|
||||
import lombok.SneakyThrows;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.jar.Manifest;
|
||||
|
||||
/**
|
||||
* @author ReaJason
|
||||
* @since 2025/1/22
|
||||
*/
|
||||
public class SimpleJarPacker implements JarPacker {
|
||||
|
||||
@Override
|
||||
@SneakyThrows
|
||||
public byte[] packBytes(GenerateResult generateResult) {
|
||||
String mainClass = generateResult.getInjectorClassName().replace('.', '/') + ".class";
|
||||
String advisorClass = generateResult.getShellClassName().replace('.', '/') + ".class";
|
||||
|
||||
Manifest manifest = new Manifest();
|
||||
manifest.getMainAttributes().putValue("Manifest-Version", "1.0");
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
try (JarOutputStream targetJar = new JarOutputStream(byteArrayOutputStream, manifest)) {
|
||||
targetJar.putNextEntry(new JarEntry(mainClass));
|
||||
targetJar.write(generateResult.getInjectorBytes());
|
||||
targetJar.closeEntry();
|
||||
|
||||
targetJar.putNextEntry(new JarEntry(advisorClass));
|
||||
targetJar.write(generateResult.getShellBytes());
|
||||
targetJar.closeEntry();
|
||||
}
|
||||
return byteArrayOutputStream.toByteArray();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user