From 6b5a433f65fdca8127cb72ea10105f3215ece2a1 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 27 Jan 2013 17:09:00 -0500 Subject: [PATCH] Working to read class names and remap them at runtime. --- .../mods/fml/common/asm/FMLSanityChecker.java | 3 + .../DeobfuscationTransformer.java | 14 ++- .../FMLDeobfuscatingRemapper.java | 33 ------- .../deobf/FMLDeobfuscatingRemapper.java | 95 +++++++++++++++++++ .../deobf/FMLRemappingAdapter.java | 18 ++++ .../transformers/deobf/ZipInputSupplier.java | 26 +++++ 6 files changed, 148 insertions(+), 41 deletions(-) delete mode 100644 common/cpw/mods/fml/common/asm/transformers/FMLDeobfuscatingRemapper.java create mode 100644 common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java create mode 100644 common/cpw/mods/fml/common/asm/transformers/deobf/FMLRemappingAdapter.java create mode 100644 common/cpw/mods/fml/common/asm/transformers/deobf/ZipInputSupplier.java diff --git a/common/cpw/mods/fml/common/asm/FMLSanityChecker.java b/common/cpw/mods/fml/common/asm/FMLSanityChecker.java index 7206ee87e3..a3d628698f 100644 --- a/common/cpw/mods/fml/common/asm/FMLSanityChecker.java +++ b/common/cpw/mods/fml/common/asm/FMLSanityChecker.java @@ -1,6 +1,7 @@ package cpw.mods.fml.common.asm; import java.io.ByteArrayInputStream; +import java.io.File; import java.io.InputStreamReader; import java.io.ObjectInputStream.GetField; import java.io.StringReader; @@ -28,6 +29,7 @@ import org.objectweb.asm.Opcodes; import cpw.mods.fml.common.CertificateHelper; import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; import cpw.mods.fml.relauncher.IFMLCallHook; import cpw.mods.fml.relauncher.RelaunchClassLoader; @@ -124,6 +126,7 @@ public class FMLSanityChecker implements IFMLCallHook public void injectData(Map data) { cl = (RelaunchClassLoader) data.get("classLoader"); + FMLDeobfuscatingRemapper.INSTANCE.setup((File)data.get("mcLocation")); } } diff --git a/common/cpw/mods/fml/common/asm/transformers/DeobfuscationTransformer.java b/common/cpw/mods/fml/common/asm/transformers/DeobfuscationTransformer.java index 5d361c6e11..2661b0532a 100644 --- a/common/cpw/mods/fml/common/asm/transformers/DeobfuscationTransformer.java +++ b/common/cpw/mods/fml/common/asm/transformers/DeobfuscationTransformer.java @@ -6,6 +6,7 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.commons.RemappingClassAdapter; import org.objectweb.asm.tree.ClassNode; +import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; import cpw.mods.fml.relauncher.IClassNameTransformer; import cpw.mods.fml.relauncher.IClassTransformer; @@ -15,6 +16,10 @@ public class DeobfuscationTransformer implements IClassTransformer, IClassNameTr public byte[] transform(String name, String transformedName, byte[] bytes) { System.out.println("***" + name + ":"+transformedName); + if (bytes == null) + { + return null; + } ClassReader classReader = new ClassReader(bytes); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); RemappingClassAdapter remapAdapter = new RemappingClassAdapter(classWriter, FMLDeobfuscatingRemapper.INSTANCE); @@ -31,14 +36,7 @@ public class DeobfuscationTransformer implements IClassTransformer, IClassNameTr @Override public String unmapClassName(String name) { - if (name.startsWith("hello.world.")) - { - return name.replace("hello.world.","").replace("LexManos", ""); - } - else - { - return name; - } + return FMLDeobfuscatingRemapper.INSTANCE.unmap(name.replace('.', '/')).replace('/','.'); } } diff --git a/common/cpw/mods/fml/common/asm/transformers/FMLDeobfuscatingRemapper.java b/common/cpw/mods/fml/common/asm/transformers/FMLDeobfuscatingRemapper.java deleted file mode 100644 index 70bea79c44..0000000000 --- a/common/cpw/mods/fml/common/asm/transformers/FMLDeobfuscatingRemapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package cpw.mods.fml.common.asm.transformers; - -import org.objectweb.asm.commons.Remapper; - -public class FMLDeobfuscatingRemapper extends Remapper { - public static final FMLDeobfuscatingRemapper INSTANCE = new FMLDeobfuscatingRemapper(); - - @Override - public String mapFieldName(String owner, String name, String desc) - { - System.out.println("+++" + owner + "."+name+"."+desc); - if (owner.indexOf('/')<0) - { - return "lexManosWasHere"+name; - } - else - { - return name; - } - } - @Override - public String map(String typeName) - { - if (typeName.indexOf('/') < 0) - { - return "hello/world/"+typeName+"LexManos"; - } - else - { - return typeName; - } - } -} diff --git a/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java b/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java new file mode 100644 index 0000000000..c05a6a5e35 --- /dev/null +++ b/common/cpw/mods/fml/common/asm/transformers/deobf/FMLDeobfuscatingRemapper.java @@ -0,0 +1,95 @@ +package cpw.mods.fml.common.asm.transformers.deobf; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.util.List; +import java.util.logging.Level; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import org.objectweb.asm.commons.Remapper; + +import com.google.common.base.Charsets; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableBiMap.Builder; +import com.google.common.io.CharStreams; +import com.google.common.io.InputSupplier; + +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.relauncher.FMLRelaunchLog; + +public class FMLDeobfuscatingRemapper extends Remapper { + public static final FMLDeobfuscatingRemapper INSTANCE = new FMLDeobfuscatingRemapper(); + + private BiMap classNameBiMap; + + private boolean isLoaded = false; + + private FMLDeobfuscatingRemapper() + { + } + + public void setup(File mcDir) + { + try + { + File libDir = new File(mcDir, "lib"); + File mapData = new File(libDir, "deobfuscation_data.zip"); + ZipFile mapZip = new ZipFile(mapData); + ZipEntry classData = mapZip.getEntry("class_data.csv"); + ZipInputSupplier zis = new ZipInputSupplier(mapZip, classData); + InputSupplier classNameSupplier = CharStreams.newReaderSupplier(zis,Charsets.UTF_8); + List classList = CharStreams.readLines(classNameSupplier); + Builder builder = ImmutableBiMap.builder(); + for (String line : classList) + { + String[] parts = line.split(","); + builder.put(parts[0],parts[1]); + } + classNameBiMap = builder.build(); + } + catch (IOException ioe) + { + FMLRelaunchLog.log(Level.SEVERE, ioe, "An error occurred loading the class map data"); + } + } +// @Override +// public String mapFieldName(String owner, String name, String desc) +// { +// System.out.println("+++" + owner + "."+name+"."+desc); +// if (owner.indexOf('/')<0) +// { +// return "lexManosWasHere"+name; +// } +// else +// { +// return name; +// } +// } + @Override + public String map(String typeName) + { + if (classNameBiMap == null) + { + return typeName; + } + + String result = classNameBiMap.containsKey(typeName) ? classNameBiMap.get(typeName) : typeName; + System.out.printf("Remapping %s to %s\n", typeName, result); + return result; + } + + public String unmap(String typeName) + { + if (classNameBiMap == null) + { + return typeName; + } + return classNameBiMap.containsValue(typeName) ? classNameBiMap.inverse().get(typeName) : typeName; + } +} diff --git a/common/cpw/mods/fml/common/asm/transformers/deobf/FMLRemappingAdapter.java b/common/cpw/mods/fml/common/asm/transformers/deobf/FMLRemappingAdapter.java new file mode 100644 index 0000000000..37ff609df6 --- /dev/null +++ b/common/cpw/mods/fml/common/asm/transformers/deobf/FMLRemappingAdapter.java @@ -0,0 +1,18 @@ +package cpw.mods.fml.common.asm.transformers.deobf; + +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.commons.Remapper; +import org.objectweb.asm.commons.RemappingClassAdapter; + +public class FMLRemappingAdapter extends RemappingClassAdapter { + public FMLRemappingAdapter(ClassVisitor cv) + { + super(cv, FMLDeobfuscatingRemapper.INSTANCE); + } + + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) + { + super.visit(version, access, name, signature, superName, interfaces); + } +} diff --git a/common/cpw/mods/fml/common/asm/transformers/deobf/ZipInputSupplier.java b/common/cpw/mods/fml/common/asm/transformers/deobf/ZipInputSupplier.java new file mode 100644 index 0000000000..db04039dcc --- /dev/null +++ b/common/cpw/mods/fml/common/asm/transformers/deobf/ZipInputSupplier.java @@ -0,0 +1,26 @@ +package cpw.mods.fml.common.asm.transformers.deobf; + +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import com.google.common.io.InputSupplier; + +public class ZipInputSupplier implements InputSupplier { + private ZipFile zipFile; + private ZipEntry zipEntry; + + public ZipInputSupplier(ZipFile zip, ZipEntry entry) + { + this.zipFile = zip; + this.zipEntry = entry; + } + + @Override + public InputStream getInput() throws IOException + { + return zipFile.getInputStream(zipEntry); + } + +}