mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-21 22:50:42 +08:00
fix: add too many dependencies in fatjar
This commit is contained in:
+24
-30
@@ -9,6 +9,8 @@ import lombok.SneakyThrows;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.objectweb.asm.commons.Remapper;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
@@ -44,7 +46,7 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker {
|
||||
classes.putAll(virtualMachineClasses);
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
try (JarOutputStream targetJar = new JarOutputStream(outputStream, manifest)) {
|
||||
addDependencies(targetJar, relocatePrefix);
|
||||
addAsmDependencies(targetJar, relocatePrefix);
|
||||
addClassesToJar(targetJar, jarPackerConfig.getClassBytes(), relocatePrefix);
|
||||
for (Map.Entry<String, byte[]> entry : classes.entrySet()) {
|
||||
String className = entry.getKey();
|
||||
@@ -70,35 +72,11 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker {
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private void addDependencies(JarOutputStream targetJar, String relocatePrefix) {
|
||||
private void addAsmDependencies(JarOutputStream targetJar, String relocatePrefix) {
|
||||
String baseName = Opcodes.class.getPackage().getName().replace('.', '/');
|
||||
addDependency(targetJar, Opcodes.class, baseName, relocatePrefix);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
|
||||
String dependencyPackage = Opcodes.class.getPackage().getName();
|
||||
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
|
||||
addClassEntry(targetJar,
|
||||
entry.getKey(),
|
||||
entry.getValue(),
|
||||
dependencyPackage,
|
||||
relocatePrefix);
|
||||
}
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private void addClassEntry(JarOutputStream targetJar, String className, byte[] classBytes,
|
||||
String dependencyPackage, String relocatePrefix) {
|
||||
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
|
||||
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
|
||||
targetJar.write(processedBytes);
|
||||
targetJar.closeEntry();
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static void addDependency(JarOutputStream targetJar, Class<?> baseClass, String baseName, String relocatePrefix) {
|
||||
URL sourceUrl = baseClass.getProtectionDomain().getCodeSource().getLocation();
|
||||
String commonBaseName = Remapper.class.getPackage().getName().replace('.', '/');
|
||||
String treeBaseName = ClassNode.class.getPackage().getName().replace('.', '/');
|
||||
URL sourceUrl = Opcodes.class.getProtectionDomain().getCodeSource().getLocation();
|
||||
String sourceUrlString = sourceUrl.toString();
|
||||
if (sourceUrlString.contains("!BOOT-INF")) {
|
||||
String path = sourceUrlString.substring("jar:nested:".length());
|
||||
@@ -118,7 +96,10 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker {
|
||||
JarEntry entry = entries.nextElement();
|
||||
String entryName = entry.getName();
|
||||
if (entryName.equals("META-INF/MANIFEST.MF")
|
||||
|| entryName.contains("module-info.class")) {
|
||||
|| entryName.contains("module-info.class")
|
||||
|| !entryName.startsWith(baseName)
|
||||
|| entryName.startsWith(commonBaseName)
|
||||
|| entryName.startsWith(treeBaseName)) {
|
||||
continue;
|
||||
}
|
||||
if (!entry.isDirectory()) {
|
||||
@@ -144,6 +125,19 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker {
|
||||
}
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
|
||||
String dependencyPackage = Opcodes.class.getPackage().getName();
|
||||
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
|
||||
String className = entry.getKey();
|
||||
byte[] classBytes = entry.getValue();
|
||||
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
|
||||
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
|
||||
targetJar.write(processedBytes);
|
||||
targetJar.closeEntry();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts a JAR file to a temporary directory
|
||||
*
|
||||
|
||||
+22
-25
@@ -11,6 +11,8 @@ import lombok.SneakyThrows;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.objectweb.asm.commons.Remapper;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
@@ -19,9 +21,7 @@ import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
|
||||
/**
|
||||
@@ -87,37 +87,30 @@ public class AgentJarWithJREAttacherPacker implements JarPacker {
|
||||
|
||||
@SneakyThrows
|
||||
private void addDependencies(JarOutputStream targetJar, String relocatePrefix) {
|
||||
String baseName = Opcodes.class.getPackage().getName().replace('.', '/');
|
||||
addDependency(targetJar, Opcodes.class, baseName, relocatePrefix);
|
||||
|
||||
String jnaBaseName = Platform.class.getPackage().getName().replace('.', '/');
|
||||
addDependency(targetJar, Platform.class, jnaBaseName, null);
|
||||
addDependency(targetJar, DesktopWindow.class, jnaBaseName, null);
|
||||
List<String> skipFolder = new ArrayList<>();
|
||||
skipFolder.add(ClassNode.class.getPackage().getName().replace(".", "/"));
|
||||
skipFolder.add(Remapper.class.getPackage().getName().replace('.', '/'));
|
||||
addDependency(targetJar, Opcodes.class, skipFolder, relocatePrefix);
|
||||
addDependency(targetJar, Platform.class, Collections.singletonList(DesktopWindow.class.getPackage().getName().replace(".", "/")), null);
|
||||
addDependency(targetJar, DesktopWindow.class, Collections.emptyList(), null);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
|
||||
String dependencyPackage = Opcodes.class.getPackage().getName();
|
||||
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
|
||||
addClassEntry(targetJar,
|
||||
entry.getKey(),
|
||||
entry.getValue(),
|
||||
dependencyPackage,
|
||||
relocatePrefix);
|
||||
String className = entry.getKey();
|
||||
byte[] classBytes = entry.getValue();
|
||||
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
|
||||
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
|
||||
targetJar.write(processedBytes);
|
||||
targetJar.closeEntry();
|
||||
}
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private void addClassEntry(JarOutputStream targetJar, String className, byte[] classBytes,
|
||||
String dependencyPackage, String relocatePrefix) {
|
||||
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
|
||||
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
|
||||
targetJar.write(processedBytes);
|
||||
targetJar.closeEntry();
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public static void addDependency(JarOutputStream targetJar, Class<?> baseClass, String baseName, String relocatePrefix) {
|
||||
public static void addDependency(JarOutputStream targetJar, Class<?> baseClass, List<String> skipFolder, String relocatePrefix) {
|
||||
String baseName = baseClass.getPackage().getName().replace('.', '/');
|
||||
URL sourceUrl = baseClass.getProtectionDomain().getCodeSource().getLocation();
|
||||
String sourceUrlString = sourceUrl.toString();
|
||||
if (sourceUrlString.contains("!BOOT-INF")) {
|
||||
@@ -138,7 +131,11 @@ public class AgentJarWithJREAttacherPacker implements JarPacker {
|
||||
JarEntry entry = entries.nextElement();
|
||||
String entryName = entry.getName();
|
||||
if (entryName.startsWith("META-INF")
|
||||
|| entryName.contains("module-info.class")) {
|
||||
|| entryName.contains("module-info.class")
|
||||
|| !entryName.startsWith(baseName)) {
|
||||
continue;
|
||||
}
|
||||
if (skipFolder.stream().anyMatch(entryName::startsWith)) {
|
||||
continue;
|
||||
}
|
||||
if (!entry.isDirectory()) {
|
||||
|
||||
Reference in New Issue
Block a user