upload something
This commit is contained in:
15
testagent/build.gradle.kts
Normal file
15
testagent/build.gradle.kts
Normal file
@@ -0,0 +1,15 @@
|
||||
plugins {
|
||||
java
|
||||
id("firmament.common")
|
||||
id("com.gradleup.shadow")
|
||||
}
|
||||
dependencies {
|
||||
implementation(libs.asm)
|
||||
}
|
||||
tasks.withType<Jar> {
|
||||
val agentMain = "moe.nea.firmament.testagent.AgentMain"
|
||||
manifest.attributes(
|
||||
"Agent-Class" to agentMain,
|
||||
"Premain-Class" to agentMain,
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package moe.nea.firmament.testagent;
|
||||
|
||||
import java.lang.instrument.Instrumentation;
|
||||
|
||||
public class AgentMain {
|
||||
|
||||
public static void premain(
|
||||
String agentArgs, Instrumentation inst) {
|
||||
System.out.println("Pre-Main Firmament Test Agent");
|
||||
AgentMain.inject(inst);
|
||||
}
|
||||
|
||||
public static void agentmain(
|
||||
String agentArgs, Instrumentation inst) {
|
||||
System.out.println("Injected Firmament Test Agent");
|
||||
AgentMain.inject(inst);
|
||||
}
|
||||
|
||||
private static void inject(Instrumentation inst) {
|
||||
inst.addTransformer(new ProtectedToPublicClassTransformer(inst)); }
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package moe.nea.firmament.testagent;
|
||||
|
||||
import org.objectweb.asm.ClassVisitor;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.FieldVisitor;
|
||||
import org.objectweb.asm.MethodVisitor;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
|
||||
public class ProtectedToPublicClassRewriter extends ClassVisitor {
|
||||
public ProtectedToPublicClassRewriter(ClassWriter writer) {
|
||||
super(Opcodes.ASM9, writer);
|
||||
}
|
||||
|
||||
int makePublic(int flags) {
|
||||
if ((flags & Opcodes.ACC_PROTECTED) != 0)
|
||||
return (flags & ~Opcodes.ACC_PROTECTED) | Opcodes.ACC_PUBLIC;
|
||||
if ((flags & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE)) == 0)
|
||||
return flags | Opcodes.ACC_PUBLIC;
|
||||
return flags;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
|
||||
return super.visitField(makePublic(access), name, descriptor, signature, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
|
||||
return super.visitMethod(makePublic(access), name, descriptor, signature, exceptions);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package moe.nea.firmament.testagent;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
|
||||
import java.lang.instrument.ClassFileTransformer;
|
||||
import java.lang.instrument.IllegalClassFormatException;
|
||||
import java.lang.instrument.Instrumentation;
|
||||
import java.security.ProtectionDomain;
|
||||
|
||||
public class ProtectedToPublicClassTransformer implements ClassFileTransformer {
|
||||
public ProtectedToPublicClassTransformer(Instrumentation inst) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] transform(ClassLoader loader,
|
||||
String className,
|
||||
Class<?> classBeingRedefined,
|
||||
ProtectionDomain protectionDomain,
|
||||
byte[] classfileBuffer)
|
||||
throws IllegalClassFormatException {
|
||||
if (!className.startsWith("net/minecraft/")) return classfileBuffer;
|
||||
if (classfileBuffer == null) return null;
|
||||
var reader = new ClassReader(classfileBuffer);
|
||||
var writer = new ClassWriter(0);
|
||||
var transformer = new ProtectedToPublicClassRewriter(writer);
|
||||
reader.accept(transformer, 0);
|
||||
return writer.toByteArray();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user