everything else

This commit is contained in:
Lucwousin
2019-07-18 15:31:24 +02:00
parent 25ce6c2ee9
commit 1050644394
17 changed files with 459 additions and 79 deletions

View File

@@ -28,6 +28,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import net.runelite.asm.pool.Class;
import net.runelite.deob.DeobAnnotations;
public class Interfaces
{
@@ -89,4 +90,21 @@ public class Interfaces
}
return false;
}
public List<String> getIntfNames()
{
final List<String> names = new ArrayList<>();
for (ClassFile c : getMyInterfaces())
{
String name = DeobAnnotations.getObfuscatedName(c.getAnnotations());
if (name == null)
{
continue;
}
names.add(name);
}
return names;
}
}

View File

@@ -81,11 +81,9 @@ public class Deob
ClassGroup group = JarUtil.loadJar(new File(args[0]));
if (args.length > 2 && args[2].equals("rl"))
{
run(group, new StaticShouldBeInstance());
}
else
run(group, new StaticShouldBeInstance());
if (args.length <= 2 || !args[2].equals("rl"))
{
// remove except RuntimeException
run(group, new RuntimeExceptions());

View File

@@ -83,11 +83,6 @@ public class DeobAnnotations
return getAnnotationValue(cf.getAnnotations(), IMPLEMENTS);
}
public static String getHookName(Annotations an)
{
return getAnnotationValue(an, HOOK);
}
public static Number getObfuscatedGetter(Field field)
{
if (field == null || field.getAnnotations() == null)
@@ -104,7 +99,7 @@ public class DeobAnnotations
return (Number) an.getElement().getValue();
}
public static String getObfuscatedValue(Method method)
public static String getDecoder(Method method)
{
if (method == null || method.getAnnotations() == null)
{
@@ -126,7 +121,7 @@ public class DeobAnnotations
return (String) elements.get(1).getValue();
}
private static String getAnnotationValue(Annotations an, Type type)
public static String getAnnotationValue(Annotations an, Type type)
{
if (an == null)
{

View File

@@ -246,7 +246,8 @@ public class AnnotationIntegrityChecker
Import im = method.getAnnotation(Import.class);
if (im != null && im.value().equals(name))
{
return true;
logger.debug(name);
return false;
}
}

View File

@@ -159,6 +159,14 @@ public class Mapper
continue;
}
//if (cf.getInterfaces().getMyInterfaces().size() != 0)
//{
// for (Method m : cf.getMethods())
// {
// if (m.)
// }
//}
List<Method> methods1 = cf.getMethods().stream()
.filter(m -> !m.isStatic())
.filter(m -> !m.getName().equals("<init>"))

View File

@@ -72,6 +72,7 @@ public enum ScriptOpcode
CC_SETSCROLLSIZE(1120),
CC_RESUME_PAUSEBUTTON(1121),
CC_SETFILLCOLOUR(1123),
CC_SETFILLMODE(1125),
CC_SETLINEDIRECTION(1126),
CC_SETMODELTRANSPARENT(1127),
CC_SETOBJECT(1200),
@@ -134,9 +135,11 @@ public enum ScriptOpcode
CC_GETMODELANGLE_X(1606),
CC_GETMODELANGLE_Z(1607),
CC_GETMODELANGLE_Y(1608),
CC_GETTRANS(1609),
CC_GETTRANSTOP(1609),
CC_GETTRANSBOT(1610),
CC_GETCOLOUR(1611),
CC_GETFILLCOLOUR(1612),
CC_GETFILLMODE(1613),
CC_GETMODELTRANSPARENT(1614),
CC_GETINVOBJECT(1700),
CC_GETINVCOUNT(1701),
@@ -172,6 +175,8 @@ public enum ScriptOpcode
IF_SETSCROLLSIZE(2120),
IF_RESUME_PAUSEBUTTON(2121),
IF_SETFILLCOLOUR(2123),
IF_SETTRANSBOT(2124),
IF_SETFILLMODE(2125),
IF_SETLINEDIRECTION(2126),
IF_SETOBJECT(2200),
IF_SETNPCHEAD(2201),
@@ -233,9 +238,11 @@ public enum ScriptOpcode
IF_GETMODELANGLE_X(2606),
IF_GETMODELANGLE_Z(2607),
IF_GETMODELANGLE_Y(2608),
IF_GETTRANS(2609),
IF_GETTRANSTOP(2609),
IF_GETTRANSBOT(2610),
IF_GETCOLOUR(2611),
IF_GETFILLCOLOUR(2612),
IF_GETFILLMODE(2613),
IF_GETMODELTRANSPARENT(2614),
IF_GETINVOBJECT(2700),
IF_GETINVCOUNT(2701),

View File

@@ -51,24 +51,14 @@ public class ParameterRenamer
{
for (Method sourceM : sourceCF.getMethods())
{
Method destM;
if (sourceM.getName().equals("<init>"))
{
ClassFile destCF = (ClassFile) mapping.get(sourceCF);
destM = destCF.findMethod("<init>", sourceM.getDescriptor());
}
else
{
destM = (Method) mapping.get(sourceM);
}
if (sourceM.getParameters() != null && !sourceM.getParameters().isEmpty() && destM.getParameters().size() >= 1)
Method destM = (Method) mapping.get(sourceM);
if (destM != null && destM.getParameters().size() > 0 && sourceM.getParameters() != null && !sourceM.getParameters().isEmpty() && sourceM.getParameters().size() >= 1)
{
List<Parameter> oldParams = destM.getParameters();
for (int i = 0; i < sourceM.getParameters().size(); i++)
{
String name = sourceM.getParameters().get(i).getName();
if (name.matches("arg[0-9]") || name.length() <= 2 && (name.charAt(0) != 'x' || name.charAt(0) != 'y'))
if (name.matches("var[0-9]") || name.length() <= 2 && (name.charAt(0) != 'x' || name.charAt(0) != 'y' || name.charAt(0) != 'z'))
{
continue;
}

View File

@@ -24,31 +24,268 @@
*/
package net.runelite.deob.deobfuscators.mapping;
import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.time.Instant;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.runelite.asm.ClassFile;
import net.runelite.asm.ClassGroup;
import net.runelite.asm.Field;
import net.runelite.asm.Method;
import net.runelite.asm.Type;
import net.runelite.asm.attributes.code.Parameter;
import net.runelite.asm.signature.Signature;
import net.runelite.deob.Deob;
import net.runelite.deob.DeobAnnotations;
import net.runelite.deob.DeobTestProperties;
import net.runelite.deob.deobfuscators.mapping.mappingdumper.MappedClass;
import net.runelite.deob.deobfuscators.mapping.mappingdumper.MappedField;
import net.runelite.deob.deobfuscators.mapping.mappingdumper.MappedMethod;
import net.runelite.deob.deobfuscators.mapping.mappingdumper.MappingDump;
import net.runelite.deob.util.JarUtil;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MappingDumper
{
@Rule
public DeobTestProperties properties = new DeobTestProperties();
private final Logger log = LoggerFactory.getLogger(MappingDumper.class);
private MappingDump dump;
private Map<String, MappedClass> classMap;
private static final String OUTDIR = "";
private final File OUTFILE = new File(OUTDIR, "rlplushooks.json");
@Before
public void before()
{
dump = new MappingDump();
dump.revision = properties.getRsVersion();
dump.classes = new ArrayList<>();
dump.staticFields = new ArrayList<>();
dump.staticMethods = new ArrayList<>();
classMap = new HashMap<>();
}
@Test
@Ignore
public void newDump() throws IOException
{
final ClassGroup group = JarUtil.loadJar(new File(properties.getRsClient()));
// First create all the mappedclasses, so we can add static methods to their lists
for (ClassFile c : group.getClasses())
{
if (c.getName().contains("runelite"))
{
continue;
}
final MappedClass mc = new MappedClass();
mc.obfuscatedName = DeobAnnotations.getObfuscatedName(c.getAnnotations());
mc.implementingName = DeobAnnotations.getImplements(c);
mc.superClass = c.getSuperName();
mc.interfaces = c.getInterfaces().getIntfNames();
mc.constructors = new ArrayList<>();
mc.fields = new ArrayList<>();
mc.methods = new ArrayList<>();
mc.access = c.getAccess();
mc.staticMethods = new ArrayList<>();
mc.staticFields = new ArrayList<>();
dump.classes.add(mc);
classMap.put(c.getName(), mc);
dump.totalClasses++;
if (mc.implementingName != null)
{
dump.totalNamedClasses++;
}
}
for (ClassFile c : group.getClasses())
{
if (c.getName().contains("runelite"))
{
continue;
}
final MappedClass mc = classMap.get(c.getName());
getFields(c, mc);
getMethods(c, mc);
}
dump.totalNonStaticFields = dump.totalFields - dump.totalStaticFields;
dump.totalNamedNonStaticFields = dump.totalNamedFields - dump.totalNamedStaticFields;
dump.totalNonStaticMethods = dump.totalMethods - dump.totalStaticMethods;
dump.totalNamedNonStaticMethods = dump.totalNamedMethods - dump.totalNamedStaticMethods;
final Gson gson = new GsonBuilder().setPrettyPrinting().create();
Files.asCharSink(OUTFILE, Charset.defaultCharset()).write(gson.toJson(dump));
log.info("Dumped current mappings. revision {}", dump.revision);
log.info("Total classes: {}. Total mapped classes: {}. ({}%)", dump.totalClasses, dump.totalNamedClasses, dump.totalNamedClasses * 100 / dump.totalClasses);
log.info("Total non static methods: {}. Total mapped non static methods: {}. ({}%)", dump.totalNonStaticMethods, dump.totalNamedNonStaticMethods, dump.totalNamedNonStaticMethods * 100 / dump.totalNamedMethods);
log.info("Total methods: {}. Total mapped methods: {}. ({}%)", dump.totalMethods, dump.totalNamedMethods, dump.totalNamedMethods * 100 / dump.totalMethods);
log.info("Total fields: {}. Total mapped fields: {}. ({}%)", dump.totalFields, dump.totalNamedFields, dump.totalNamedFields * 100 / dump.totalFields);
log.info("Total non static fields: {}. Total mapped non static fields: {}. ({}%)", dump.totalNonStaticFields, dump.totalNamedNonStaticFields, dump.totalNamedNonStaticFields * 100 / dump.totalNamedFields);
}
private void getFields(final ClassFile c, final MappedClass mc)
{
for (Field f : c.getFields())
{
dump.totalFields++;
if (f.isStatic())
{
dump.totalStaticFields++;
}
if (Deob.isObfuscated(f.getName()))
{
continue;
}
dump.totalNamedFields++;
final MappedField mf = new MappedField();
mf.exportedName = f.getName();
mf.owner = mc.obfuscatedName;
mf.obfuscatedName = DeobAnnotations.getObfuscatedName(f.getAnnotations());
mf.access = f.getAccessFlags();
mf.descriptor = DeobAnnotations.getAnnotationValue(f.getAnnotations(), DeobAnnotations.OBFUSCATED_SIGNATURE);
Number decoder = DeobAnnotations.getObfuscatedGetter(f);
if (decoder != null)
{
mf.decoder = decoder.longValue();
}
if (mf.descriptor == null)
{
mf.descriptor = f.getType().toString();
}
if (f.isStatic())
{
dump.staticFields.add(mf);
dump.totalNamedStaticFields++;
int _index = mf.exportedName.indexOf('_');
if (_index != -1)
{
String className = mf.exportedName.substring(0, _index);
MappedClass staticOwner = classMap.get(className);
if (staticOwner != null)
{
staticOwner.staticFields.add(mf);
}
}
}
else
{
mc.fields.add(mf);
}
}
}
private void getMethods(final ClassFile c, final MappedClass mc)
{
for (Method m : c.getMethods())
{
dump.totalMethods++;
if (m.isStatic())
{
dump.totalStaticMethods++;
}
if (Deob.isObfuscated(m.getName()) || m.getName().equals("<clinit>"))
{
continue;
}
dump.totalNamedMethods++;
final MappedMethod mm = new MappedMethod();
mm.exportedName = m.getName();
mm.owner = mc.obfuscatedName;
mm.obfuscatedName = DeobAnnotations.getObfuscatedName(m.getAnnotations());
mm.access = m.getAccessFlags();
mm.parameters = new ArrayList<>();
mm.descriptor = DeobAnnotations.getObfuscatedSignature(m) != null ? DeobAnnotations.getObfuscatedSignature(m).toString() : m.getDescriptor().toString();
try
{
mm.garbageValue = Long.parseLong(DeobAnnotations.getDecoder(m));
}
catch (NumberFormatException e)
{
mm.garbageValue = null;
}
for (Parameter p : m.getParameters())
{
mm.parameters.add(p.getName());
}
if (m.getName().equals("<init>"))
{
mm.exportedName = null;
mc.constructors.add(mm);
continue;
}
if (m.isStatic())
{
dump.staticMethods.add(mm);
dump.totalNamedStaticMethods++;
int _index = mm.exportedName.indexOf('_');
if (_index != -1)
{
String className = mm.exportedName.substring(0, _index - 1);
MappedClass staticOwner = classMap.get(className);
if (staticOwner != null)
{
staticOwner.staticMethods.add(mm);
}
}
}
else
{
mc.methods.add(mm);
}
}
}
@Test
public void dump() throws IOException
{
@@ -126,7 +363,7 @@ public class MappingDumper
String methodName = DeobAnnotations.getObfuscatedName(m.getAnnotations());
Signature signature = DeobAnnotations.getObfuscatedSignature(m);
String garbageValue = DeobAnnotations.getObfuscatedValue(m);
String garbageValue = DeobAnnotations.getDecoder(m);
if (signature == null)
{
@@ -238,7 +475,7 @@ public class MappingDumper
String methodName = DeobAnnotations.getObfuscatedName(m.getAnnotations());
Signature obfSignature = DeobAnnotations.getObfuscatedSignature(m);
String predicate = DeobAnnotations.getObfuscatedValue(m);
String predicate = DeobAnnotations.getDecoder(m);
JsonObject jMethod = new JsonObject();

View File

@@ -7,12 +7,15 @@ import net.runelite.asm.ClassGroup;
import net.runelite.asm.Field;
import net.runelite.asm.Method;
import net.runelite.asm.attributes.Annotations;
import net.runelite.asm.attributes.annotation.Annotation;
import net.runelite.asm.attributes.annotation.Element;
import net.runelite.deob.Deob;
import net.runelite.deob.DeobAnnotations;
import net.runelite.deob.DeobTestProperties;
import net.runelite.deob.util.JarUtil;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
@@ -83,4 +86,135 @@ public class AnnotationCleaner
}
}
}
@Test
@Ignore
public void fixMappings() throws Exception
{
File client = new File(properties.getRsClient());
ClassGroup group = JarUtil.loadJar(client);
int impl = 0,
meth = 0,
field = 0;
for (ClassFile c : group.getClasses())
{
if (c.getName().contains("runelite"))
{
continue;
}
log.debug("Checking {}", c.toString());
String implementingName = DeobAnnotations.getImplements(c);
if (!Strings.isNullOrEmpty(implementingName))
{
// Still error here cause I don't wanna call classes dumb shit
assertEquals(c + " implements " + implementingName + " but is called " + c.getClassName(), implementingName, c.getClassName());
}
else
{
if (!Deob.isObfuscated(c.getClassName()))
{
Annotations an = c.getAnnotations();
Annotation implAn = new Annotation(an);
implAn.setType(DeobAnnotations.IMPLEMENTS);
Element value = new Element(implAn);
value.setValue(c.getClassName());
value.setName("value");
implAn.addElement(value);
an.addAnnotation(implAn);
impl++;
}
}
for (Field f : c.getFields())
{
Annotations an = f.getAnnotations();
String fieldName = f.getName();
String exportedName = DeobAnnotations.getExportedName(an);
if (exportedName == null && Deob.isObfuscated(fieldName) || fieldName.equals(DeobAnnotations.getObfuscatedName(an)) || DeobAnnotations.getObfuscatedName(an) == null)
{
//Annotation exp = new Annotation(an);
//exp.setType(DeobAnnotations.EXPORT);
//
//Element ele = new Element(exp);
//ele.setValue(fieldName);
//
//log.info("Added export on {}", fieldName);
//field++;
continue;
}
if (!fieldName.equals(exportedName))
{
log.info("Changed export from {} to {}", exportedName, fieldName);
Annotation a = an.find(DeobAnnotations.EXPORT);
if (a == null)
{
a = new Annotation(an);
a.setType(DeobAnnotations.EXPORT);
Element value = new Element(a);
value.setValue(fieldName);
value.setName("value");
a.addElement(value);
an.addAnnotation(a);
}
a.getElement().setValue(fieldName);
field++;
}
}
for (Method m : c.getMethods())
{
Annotations an = m.getAnnotations();
String fieldName = m.getName();
String exportedName = DeobAnnotations.getExportedName(an);
if (exportedName == null && Deob.isObfuscated(fieldName) || fieldName.equals(DeobAnnotations.getObfuscatedName(an)) || DeobAnnotations.getObfuscatedName(an) == null)
{
continue;
// Annotation exp = new Annotation(an);
// exp.setType(DeobAnnotations.EXPORT);
//
// Element ele = new Element(exp);
// ele.setValue(fieldName);
//
// log.info("Added export on {}", fieldName);
// meth++;
}
if (!fieldName.equals(exportedName))
{
log.info("Changed export from {} to {}", exportedName, fieldName);
Annotation a = an.find(DeobAnnotations.EXPORT);
if (a == null)
{
a = new Annotation(an);
a.setType(DeobAnnotations.EXPORT);
Element value = new Element(a);
value.setValue(fieldName);
value.setName("value");
a.addElement(value);
an.addAnnotation(a);
}
a.getElement().setValue(fieldName);
meth++;
}
}
}
log.info("Changed {} classes, {} methods, {} fields", impl, meth, field);
JarUtil.saveJar(group, new File("C:/Users/Lucas/Desktop/niec.jar"));
}
}

View File

@@ -17541,14 +17541,14 @@
"access" : 0,
"descriptor" : "(Lgr;IB)V"
}, {
"method" : "getSprite1",
"method" : "getFrontSprite",
"owner" : "ii",
"name" : "q",
"access" : 1,
"parameters" : [ ],
"descriptor" : "(B)Lln;"
}, {
"method" : "getSprite2",
"method" : "getBackSprite",
"owner" : "ii",
"name" : "w",
"access" : 1,