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