This commit is contained in:
BRanulf 2025-06-15 23:33:38 +08:00
parent ed4a857ae3
commit abc1c843f0
2 changed files with 45 additions and 26 deletions

View File

@ -1,5 +1,6 @@
plugins { plugins {
id 'java' id 'java'
id 'com.github.johnrengelman.shadow' version '8.1.1'
} }
group = 'com.yourdomain' group = 'com.yourdomain'
@ -28,4 +29,13 @@ jar {
'Can-Retransform-Classes': 'true' 'Can-Retransform-Classes': 'true'
) )
} }
}
shadowJar {
archiveBaseName.set('agent')
archiveClassifier.set('')
archiveVersion.set('1.0-SNAPSHOT')
manifest {
attributes 'Premain-Class': 'com.yourdomain.agent.CheckrpAgent'
}
} }

View File

@ -3,48 +3,57 @@ package com.yourdomain.agent;
import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.matcher.ElementMatchers; import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.utility.JavaModule;
import net.bytebuddy.dynamic.DynamicType;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.PrintWriter;
import java.lang.instrument.Instrumentation; import java.lang.instrument.Instrumentation;
import java.lang.reflect.Field; import java.security.ProtectionDomain;
import java.time.LocalDateTime;
public class CheckrpAgent { public class CheckrpAgent {
private static final String OUT_PATH = "D:/Minectaft/Milk/milk1/dev/packets.txt";
public static void premain(String agentArgs, Instrumentation inst) { public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("[CheckrpAgent] Agent loaded: Logging sent packets to sent_packets.txt"); try {
File f = new File(OUT_PATH);
f.getParentFile().mkdirs();
if (!f.exists()) f.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
new AgentBuilder.Default() new AgentBuilder.Default()
.type(ElementMatchers.nameEndsWith("ModLoadProcedure")) .ignore(ElementMatchers.nameStartsWith("net.bytebuddy."))
.transform((builder, typeDescription, classLoader, module, protectionDomain) -> .ignore(ElementMatchers.nameStartsWith("java."))
builder.method(ElementMatchers.named("sendToServer")) .type(ElementMatchers.named("net.minecraftforge.network.simple.SimpleChannel"))
.intercept(Advice.to(SendPacketLogger.class)) .transform((
DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassLoader classLoader,
JavaModule module,
ProtectionDomain pd
) ->
builder.visit(Advice.to(SendAdvice.class)
.on(ElementMatchers.named("sendToServer")
.and(ElementMatchers.takesArguments(1))
)
)
) )
.installOn(inst); .installOn(inst);
} }
public static class SendPacketLogger { public static class SendAdvice {
@Advice.OnMethodEnter @Advice.OnMethodEnter
public static void onEnter(@Advice.Argument(0) Object packet) { public static void onEnter(@Advice.Argument(0) Object packet) {
try (PrintWriter out = new PrintWriter(new FileWriter("sent_packets.txt", true))) { String className = packet.getClass().getName();
out.println("==== Packet Sent ===="); String line ="["+className +"] "+ (packet == null ? "null" : packet.toString()) + System.lineSeparator();
out.println("Time: " + LocalDateTime.now()); try (BufferedWriter out = new BufferedWriter(new FileWriter(OUT_PATH, true))) {
out.println("Class: " + packet.getClass().getName()); out.write(line);
for (Field field : packet.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
Object value = field.get(packet);
out.printf(" %s = %s%n", field.getName(), value);
} catch (IllegalAccessException e) {
out.printf(" %s = <unreadable>%n", field.getName());
}
}
out.println("=====================\n");
} catch (Exception e) { } catch (Exception e) {
System.err.println("[CheckrpAgent] Failed to write packet info: " + e.getMessage()); e.printStackTrace();
} }
} }
} }