Method deobfuscation now works

This commit is contained in:
Christian committed 2013-01-27 21:50:08 -05:00
1 parent 82415f3962
commit 9c2b899454
5 files changed
+108 -19

No files matched your search

@@ -126,7 +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"));
FMLDeobfuscatingRemapper.INSTANCE.setup((File)data.get("mcLocation"), cl);
}
}
@@ -7,6 +7,7 @@ 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.common.asm.transformers.deobf.FMLRemappingAdapter;
import cpw.mods.fml.relauncher.IClassNameTransformer;
import cpw.mods.fml.relauncher.IClassTransformer;
@@ -22,7 +23,7 @@ public class DeobfuscationTransformer implements IClassTransformer, IClassNameTr
}
ClassReader classReader = new ClassReader(bytes);
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
RemappingClassAdapter remapAdapter = new RemappingClassAdapter(classWriter, FMLDeobfuscatingRemapper.INSTANCE);
RemappingClassAdapter remapAdapter = new FMLRemappingAdapter(classWriter);
classReader.accept(remapAdapter, ClassReader.EXPAND_FRAMES);
return classWriter.toByteArray();
}
@@ -5,37 +5,51 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.objectweb.asm.ClassReader;
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.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
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;
import cpw.mods.fml.relauncher.RelaunchClassLoader;
public class FMLDeobfuscatingRemapper extends Remapper {
public static final FMLDeobfuscatingRemapper INSTANCE = new FMLDeobfuscatingRemapper();
private BiMap<String, String> classNameBiMap;
private Map<String,Map<String,String>> rawFieldMaps;
private Map<String,Map<String,String>> rawMethodMaps;
private boolean isLoaded = false;
private Map<String,Map<String,String>> fieldNameMaps;
private Map<String,Map<String,String>> methodNameMaps;
private RelaunchClassLoader classLoader;
private FMLDeobfuscatingRemapper()
{
}
public void setup(File mcDir)
public void setup(File mcDir, RelaunchClassLoader classLoader)
{
this.classLoader = classLoader;
try
{
File libDir = new File(mcDir, "lib");
@@ -52,25 +66,42 @@ public class FMLDeobfuscatingRemapper extends Remapper {
builder.put(parts[0],parts[1]);
}
classNameBiMap = builder.build();
ZipEntry methodData = mapZip.getEntry("method_data.csv");
zis = new ZipInputSupplier(mapZip, methodData);
InputSupplier<InputStreamReader> methodNameSupplier = CharStreams.newReaderSupplier(zis,Charsets.UTF_8);
List<String> methodList = CharStreams.readLines(methodNameSupplier);
rawMethodMaps = Maps.newHashMap();
for (String line : methodList)
{
String[] parts = line.split(",");
String oldSrg = parts[0];
int lastOld = oldSrg.lastIndexOf('/');
String cl = oldSrg.substring(0,lastOld);
String oldName = oldSrg.substring(lastOld+1);
String sig = parts[1];
String newSrg = parts[2];
int lastNew = newSrg.lastIndexOf('/');
String newName = newSrg.substring(lastNew+1);
if (!rawMethodMaps.containsKey(cl))
{
rawMethodMaps.put(cl, Maps.<String,String>newHashMap());
}
rawMethodMaps.get(cl).put(oldName+sig, newName);
}
}
catch (IOException ioe)
{
FMLRelaunchLog.log(Level.SEVERE, ioe, "An error occurred loading the class map data");
FMLRelaunchLog.log(Level.SEVERE, ioe, "An error occurred loading the deobfuscation map data");
}
methodNameMaps = Maps.newHashMapWithExpectedSize(rawMethodMaps.size());
}
// @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 mapFieldName(String owner, String name, String desc)
{
return name;
}
@Override
public String map(String typeName)
{
@@ -80,7 +111,6 @@ public class FMLDeobfuscatingRemapper extends Remapper {
}
String result = classNameBiMap.containsKey(typeName) ? classNameBiMap.get(typeName) : typeName;
System.out.printf("Remapping %s to %s\n", typeName, result);
return result;
}
@@ -92,4 +122,59 @@ public class FMLDeobfuscatingRemapper extends Remapper {
}
return classNameBiMap.containsValue(typeName) ? classNameBiMap.inverse().get(typeName) : typeName;
}
@Override
public String mapMethodName(String owner, String name, String desc)
{
if (classNameBiMap==null || !classNameBiMap.containsKey(owner))
{
return name;
}
Map<String, String> methodMap = getMethodMap(owner);
String methodDescriptor = name+desc;
return methodMap.containsKey(methodDescriptor) ? methodMap.get(methodDescriptor) : name;
}
private Map<String,String> getMethodMap(String className)
{
if (!methodNameMaps.containsKey(className))
{
findAndMergeSuperMaps(className);
}
return methodNameMaps.get(className);
}
private void findAndMergeSuperMaps(String name)
{
try
{
byte[] classBytes = classLoader.getClassBytes(name);
ClassReader cr = new ClassReader(classBytes);
String superName = cr.getSuperName();
mergeSuperMaps(name, superName);
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void mergeSuperMaps(String name, String superName)
{
if (classNameBiMap == null || !classNameBiMap.containsKey(name))
{
return;
}
if (superName != null && classNameBiMap.containsKey(superName) && !methodNameMaps.containsKey(superName))
{
findAndMergeSuperMaps(superName);
}
FMLLog.info("Merging maps for %s (%s)", name, superName);
Map<String, String> methodMap = methodNameMaps.containsKey(superName) ? Maps.newHashMap(methodNameMaps.get(superName)) : Maps.<String, String>newHashMap();
if (rawMethodMaps.containsKey(name))
{
methodMap.putAll(rawMethodMaps.get(name));
}
methodNameMaps.put(name, ImmutableMap.copyOf(methodMap));
}
}
@@ -13,6 +13,7 @@ public class FMLRemappingAdapter extends RemappingClassAdapter {
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
{
FMLDeobfuscatingRemapper.INSTANCE.mergeSuperMaps(name, superName);
super.visit(version, access, name, signature, superName, interfaces);
}
}
@@ -69,6 +69,8 @@ public class RelaunchClassLoader extends URLClassLoader
addTransformerExclusion("javax.");
addTransformerExclusion("org.objectweb.asm.");
addTransformerExclusion("com.google.common.");
addTransformerExclusion("org.bouncycastle.");
addTransformerExclusion("cpw.mods.fml.common.asm.transformers.deobf.");
}
public void registerTransformer(String transformerClassName)