Skip to content

Commit

Permalink
feat: support jar packer
Browse files Browse the repository at this point in the history
  • Loading branch information
ReaJason committed Jan 22, 2025
1 parent 51cda2b commit 08ffa47
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();

Expand All @@ -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"));
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ static enum INSTANCE {
* GzipBase64
*/
GzipBase64(new GzipBase64()),

Jar(new SimpleJarPacker()),

/**
* BCEL
*/
Expand Down Expand Up @@ -81,6 +84,8 @@ static enum INSTANCE {

Velocity(new VelocityPacker()),



AgentJar(new AgentJarPacker()),
;
private final Packer packer;
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}

0 comments on commit 08ffa47

Please sign in to comment.