mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-13 08:44:25 +00:00
Working to read class names and remap them at runtime.
This commit is contained in:
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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user