Working to read class names and remap them at runtime.

This commit is contained in:
Christian committed 2013-01-27 17:09:00 -05:00
1 parent b5d5c95b33
commit 6b5a433f65
6 files changed
+148 -41

No files matched your search

@@ -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<String, Object> data)
{
cl = (RelaunchClassLoader) data.get("classLoader");
FMLDeobfuscatingRemapper.INSTANCE.setup((File)data.get("mcLocation"));
}
}
@@ -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('/','.');
}
}
@@ -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;
}
}
}
@@ -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<String, String> 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<InputStreamReader> classNameSupplier = CharStreams.newReaderSupplier(zis,Charsets.UTF_8);
List<String> classList = CharStreams.readLines(classNameSupplier);
Builder<String, String> builder = ImmutableBiMap.<String,String>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;
}
}
@@ -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);
}
}
@@ -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<InputStream> {
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);
}
}