mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-13 00:37:52 +00:00
Method deobfuscation now works
This commit is contained in:
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();
|
||||
}
|
||||
|
||||
+102
-17
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user