diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/AgentJarPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/AgentJarPacker.java index 233f3bba..ee0d263f 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/AgentJarPacker.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/packer/AgentJarPacker.java @@ -3,11 +3,10 @@ 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 byte[] packBytes(GenerateResult generateResult) { 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 byte[] packBytes(GenerateResult generateResult) { targetJar.write(generateResult.getShellBytes()); targetJar.closeEntry(); } - byte[] byteArray = IOUtils.toByteArray(new FileInputStream(jarPath.toFile())); - FileUtils.deleteQuietly(jarPath.toFile()); - return byteArray; + return byteArrayOutputStream.toByteArray(); } @SneakyThrows diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java index 5c3569f8..720cdf0d 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/packer/Packer.java @@ -48,6 +48,9 @@ static enum INSTANCE { * GzipBase64 */ GzipBase64(new GzipBase64()), + + Jar(new SimpleJarPacker()), + /** * BCEL */ @@ -81,6 +84,8 @@ static enum INSTANCE { Velocity(new VelocityPacker()), + + AgentJar(new AgentJarPacker()), ; private final Packer packer; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/packer/SimpleJarPacker.java b/generator/src/main/java/com/reajason/javaweb/memshell/packer/SimpleJarPacker.java new file mode 100644 index 00000000..d145a4a5 --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memshell/packer/SimpleJarPacker.java @@ -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(); + } +}