Skip to content

Commit

Permalink
Implement stacktrace deobfuscation
Browse files Browse the repository at this point in the history
  • Loading branch information
JustRed23 committed Jul 11, 2023
1 parent 1be95b7 commit 3b54cb8
Show file tree
Hide file tree
Showing 16 changed files with 68,111 additions and 16 deletions.
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,10 @@ subprojects {
name = 'forge'
url = 'https://maven.minecraftforge.net/'
}
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }
maven {
url = "https://raw.github.com/Hexeption/Magma-Repo/master/"
Expand Down Expand Up @@ -258,6 +262,7 @@ def sharedDeps = {

// Paper
installer 'it.unimi.dsi:fastutil:8.5.6'
installer 'net.fabricmc:mapping-io:0.3.0'


autolibraries BIN_PATCHER
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.magmafoundation.magma.deobf;

import org.apache.logging.log4j.core.Core;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;

@Plugin(name = "DeobfRewritePolicy", category = Core.CATEGORY_NAME, elementType = "rewritePolicy", printObject = true)
public class DeobfRewritePolicy implements RewritePolicy {

private static final IStackTraceDeobfuscator noop = new IStackTraceDeobfuscator() {
public void deobf(Throwable throwable) {}
public StackTraceElement[] deobf(StackTraceElement[] stackTrace) { return stackTrace; }
};

private static IStackTraceDeobfuscator deobfuscator;

public static void setDeobfuscator(IStackTraceDeobfuscator deobfuscator) {
DeobfRewritePolicy.deobfuscator = deobfuscator;
}

public static IStackTraceDeobfuscator getDeobfuscator() {
return deobfuscator != null ? deobfuscator : noop;
}

private DeobfRewritePolicy() {}

public LogEvent rewrite(LogEvent source) {
Throwable throwable = source.getThrown();
if (throwable != null) {
getDeobfuscator().deobf(throwable);
return new Log4jLogEvent.Builder(source).setThrownProxy(null).build();
}
return source;
}

@PluginFactory
public static DeobfRewritePolicy createPolicy() {
return new DeobfRewritePolicy();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.magmafoundation.magma.deobf;

public interface IStackTraceDeobfuscator {

void deobf(Throwable throwable);
StackTraceElement[] deobf(StackTraceElement[] stackTrace);
}
15 changes: 11 additions & 4 deletions fmlloader/src/main/resources/log4j2.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,24 @@
</Policies>
<DefaultRolloverStrategy max="5" fileIndex="min"/>
</RollingRandomAccessFile>
<Rewrite name="rewrite">
<DeobfRewritePolicy />
<AppenderRef ref="Console" level="${sys:forge.logging.console.level:-info}"/>
<AppenderRef ref="ServerGuiConsole" level="${sys:forge.logging.console.level:-info}"/>
<AppenderRef ref="File" level="${sys:forge.logging.file.level:-info}"/>
<AppenderRef ref="DebugFile" level="${sys:forge.logging.debugFile.level:-debug}"/>
</Rewrite>
<Async name="Async">
<AppenderRef ref="rewrite"/>
</Async>
</Appenders>
<Loggers>
<!-- make sure mojang's logging is set to 'info' so that their LOGGER.isDebugEnabled() behavior isn't active -->
<Logger level="${sys:forge.logging.mojang.level:-info}" name="com.mojang"/>
<Logger level="${sys:forge.logging.mojang.level:-info}" name="net.minecraft"/>
<Logger level="${sys:forge.logging.classtransformer.level:-info}" name="cpw.mods.modlauncher.ClassTransformer"/>
<Root level="all">
<AppenderRef ref="Console" level="${sys:forge.logging.console.level:-info}"/>
<AppenderRef ref="ServerGuiConsole" level="${sys:forge.logging.console.level:-info}"/>
<AppenderRef ref="File" level="${sys:forge.logging.file.level:-info}"/>
<AppenderRef ref="DebugFile" level="${sys:forge.logging.debugFile.level:-debug}"/>
<AppenderRef ref="Async"/>
</Root>
</Loggers>
</Configuration>
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@
import me.tongfei.progressbar.ProgressBar;
import me.tongfei.progressbar.ProgressBarBuilder;
import me.tongfei.progressbar.ProgressBarStyle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.magmafoundation.magma.MagmaStart;
import org.magmafoundation.magma.common.MagmaConstants;
import org.magmafoundation.magma.common.utils.JarTool;
import org.magmafoundation.magma.common.utils.MD5;
Expand Down Expand Up @@ -376,6 +373,7 @@ public Path getDependencyPath(Dependency dependency, boolean relocated) {
List<Repository> standardRepositories = new ArrayList<>();
standardRepositories.add(new StandardRepository("https://nexus.c0d3m4513r.com/repository/Magma/"));
standardRepositories.add(new StandardRepository("https://maven.minecraftforge.net"));
standardRepositories.add(new StandardRepository("https://maven.fabricmc.net/"));
standardRepositories.add(new StandardRepository("https://repo1.maven.org/maven2"));
standardRepositories.add(new StandardRepository("https://git.magmafoundation.org/magmafoundation/magma-maven-repo/-/raw/repository/"));
standardRepositories.add(new StandardRepository("https://maven.izzel.io/releases"));
Expand Down
8 changes: 6 additions & 2 deletions patches/minecraft/net/minecraft/CrashReport.java.patch
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
--- a/net/minecraft/CrashReport.java
+++ b/net/minecraft/CrashReport.java
@@ -16,6 +_,7 @@
@@ -16,6 +_,8 @@
import net.minecraft.util.MemoryReserve;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
+import org.bukkit.craftbukkit.v1_18_R2.CraftCrashReport;
+import org.magmafoundation.magma.deobf.DeobfRewritePolicy;
import org.slf4j.Logger;

public class CrashReport {
@@ -31,6 +_,7 @@
@@ -29,8 +_,10 @@
private final SystemReport f_178624_ = new SystemReport();

public CrashReport(String p_127509_, Throwable p_127510_) {
+ DeobfRewritePolicy.getDeobfuscator().deobf(p_127510_);
this.f_127500_ = p_127509_;
this.f_127501_ = p_127510_;
+ this.f_178624_.m_143522_("CraftBukkit Information", new CraftCrashReport()); // CraftBukkit
Expand Down
11 changes: 10 additions & 1 deletion patches/minecraft/net/minecraft/CrashReportCategory.java.patch
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
--- a/net/minecraft/CrashReportCategory.java
+++ b/net/minecraft/CrashReportCategory.java
@@ -102,8 +_,10 @@
@@ -8,6 +_,7 @@
import net.minecraft.core.SectionPos;
import net.minecraft.world.level.LevelHeightAccessor;
import net.minecraft.world.level.block.state.BlockState;
+import org.magmafoundation.magma.deobf.DeobfRewritePolicy;

public class CrashReportCategory {
private final String f_128137_;
@@ -102,8 +_,11 @@
if (astacktraceelement.length <= 0) {
return 0;
} else {
Expand All @@ -10,6 +18,7 @@
+ if (len <= 0) len = astacktraceelement.length;
+ this.f_128139_ = new StackTraceElement[len];
+ System.arraycopy(astacktraceelement, astacktraceelement.length - len, this.f_128139_, 0, this.f_128139_.length);
+ this.f_128139_ = DeobfRewritePolicy.getDeobfuscator().deobf(f_128139_);
return this.f_128139_.length;
}
}
Expand Down
15 changes: 14 additions & 1 deletion patches/minecraft/net/minecraft/network/Connection.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,20 @@
public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
private static final float f_178299_ = 0.75F;
private static final Logger f_129465_ = LogUtils.getLogger();
@@ -75,8 +_,13 @@
@@ -65,18 +_,23 @@
});
public static final AttributeKey<ConnectionProtocol> f_129461_ = AttributeKey.valueOf("protocol");
public static final LazyLoadedValue<NioEventLoopGroup> f_129462_ = new LazyLoadedValue<>(() -> {
- return new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Client IO #%d").setDaemon(true).build());
+ return new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(f_129465_)).build()); // Paper
});
public static final LazyLoadedValue<EpollEventLoopGroup> f_129463_ = new LazyLoadedValue<>(() -> {
- return new EpollEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Epoll Client IO #%d").setDaemon(true).build());
+ return new EpollEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Epoll Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(f_129465_)).build()); // Paper
});
public static final LazyLoadedValue<DefaultEventLoopGroup> f_129464_ = new LazyLoadedValue<>(() -> {
- return new DefaultEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Local Client IO #%d").setDaemon(true).build());
+ return new DefaultEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Local Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(f_129465_)).build()); // Paper
});
private final PacketFlow f_129466_;
private final Queue<Connection.PacketHolder> f_129467_ = Queues.newConcurrentLinkedQueue();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
}

+ // Spigot Start
+ private static final java.util.concurrent.ExecutorService executors = java.util.concurrent.Executors.newCachedThreadPool(new com.google.common.util.concurrent.ThreadFactoryBuilder().setDaemon(true).setNameFormat("Async Chat Thread - #%d").build());
+ private static final java.util.concurrent.ExecutorService executors = java.util.concurrent.Executors.newCachedThreadPool(new com.google.common.util.concurrent.ThreadFactoryBuilder().setDaemon(true).setNameFormat("Async Chat Thread - #%d").setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.f_129750_)).build());
+
public void m_5797_(ServerGamePacketListener p_133836_) {
+ if (!f_133827_.startsWith("/")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@
import net.minecraft.world.level.biome.BiomeManager;
import net.minecraft.world.level.border.BorderChangeListener;
import net.minecraft.world.level.border.WorldBorder;
@@ -144,1693 +_,2173 @@
@@ -144,1693 +_,2178 @@
import net.minecraft.world.level.levelgen.WorldGenSettings;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager;
Expand Down Expand Up @@ -158,6 +158,8 @@
+import org.bukkit.plugin.PluginLoadOrder;
+import org.magmafoundation.magma.Magma;
+import org.magmafoundation.magma.Metrics;
+import org.magmafoundation.magma.deobf.DeobfRewritePolicy;
+import org.magmafoundation.magma.error.StackTraceDeobfuscator;
+import org.magmafoundation.magma.forge.ForgeInject;
+import org.magmafoundation.magma.helpers.ServerInitHelper;
+import org.magmafoundation.magma.patcher.PatcherManager;
Expand Down Expand Up @@ -577,6 +579,9 @@
+ //init patcher
+ magma.setPatcherManager(new PatcherManager());
+ magma.getPatcherManager().init();
+
+ //init stacktrace deobfuscator
+ DeobfRewritePolicy.setDeobfuscator(new StackTraceDeobfuscator());
+ //Magma end
+
+ try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@
+ private static final int READ_TIMEOUT = Integer.parseInt(System.getProperty("forge.readTimeout", "30"));
public static final LazyLoadedValue<NioEventLoopGroup> f_9698_ = new LazyLoadedValue<>(() -> {
- return new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Server IO #%d").setDaemon(true).build());
+ return new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Server IO #%d").setDaemon(true).setThreadFactory(net.minecraftforge.fml.util.thread.SidedThreadGroups.SERVER).build());
+ return new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Server IO #%d").setDaemon(true).setThreadFactory(net.minecraftforge.fml.util.thread.SidedThreadGroups.SERVER).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(f_9701_)).build());
});
public static final LazyLoadedValue<EpollEventLoopGroup> f_9699_ = new LazyLoadedValue<>(() -> {
- return new EpollEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Epoll Server IO #%d").setDaemon(true).build());
+ return new EpollEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Epoll Server IO #%d").setDaemon(true).setThreadFactory(net.minecraftforge.fml.util.thread.SidedThreadGroups.SERVER).build());
+ return new EpollEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Epoll Server IO #%d").setDaemon(true).setThreadFactory(net.minecraftforge.fml.util.thread.SidedThreadGroups.SERVER).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(f_9701_)).build());
});
final MinecraftServer f_9702_;
public volatile boolean f_9700_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ public class MagmaConfig extends ConfigBase {
public final BooleanValue debugPrintInjections = new BooleanValue(this, "debug.print-bukkit-injections", false, "Prints Forge Bukkit Injections");
public final BooleanValue debugWarnOnNullNBT = new BooleanValue(this, "debug.warn-on-null-nbt", false, "Prints a warning when an item tries to set an NBT tag to null");
public final BooleanValue debugWarnOnUnknownEntity = new BooleanValue(this, "debug.warn-on-unknown-entity", false, "Prints a warning when an entity unknown to bukkit is spawned");
public final BooleanValue debugDeobfuscateStacktraces = new BooleanValue(this, "debug.deobfuscate-stacktraces", true, "Deobfuscates stacktraces to make them more readable");

public final IntValue forgePacketCompressionThreshold = new IntValue(this, "forge.packet-compression-threshold", 8388608, "Maximum packet size before compression is applied, Default: 8388608 (8MB)");

Expand Down
Loading

0 comments on commit 3b54cb8

Please sign in to comment.