forked from openrs2/openrs2
I'm ignoring the deobfuscator mapping files for now, but when the deobfuscator is finished then I'll add them to the repository and keep them up to date. Signed-off-by: Graham <gpe@openrs2.dev>
parent
c365019007
commit
d006997d2d
@ -0,0 +1 @@ |
|||||||
|
/deob-map |
@ -0,0 +1,25 @@ |
|||||||
|
plugins { |
||||||
|
`maven-publish` |
||||||
|
kotlin("jvm") |
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
api(project(":asm")) |
||||||
|
} |
||||||
|
|
||||||
|
publishing { |
||||||
|
publications.create<MavenPublication>("maven") { |
||||||
|
from(components["java"]) |
||||||
|
|
||||||
|
pom { |
||||||
|
packaging = "jar" |
||||||
|
name.set("OpenRS2 Deobfuscator Map") |
||||||
|
description.set( |
||||||
|
""" |
||||||
|
Data structures for representing a map of obfuscated to |
||||||
|
refactored names. |
||||||
|
""".trimIndent() |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,3 @@ |
|||||||
|
package dev.openrs2.deob.map |
||||||
|
|
||||||
|
data class Field(val owner: String, val name: String) |
@ -0,0 +1,14 @@ |
|||||||
|
package dev.openrs2.deob.map |
||||||
|
|
||||||
|
import java.util.SortedMap |
||||||
|
|
||||||
|
data class Method( |
||||||
|
val owner: String, |
||||||
|
val name: String, |
||||||
|
/* |
||||||
|
* Uses concrete type as there is no interface for a map sorted by |
||||||
|
* insertion order. |
||||||
|
*/ |
||||||
|
val arguments: LinkedHashMap<Int, String>, |
||||||
|
val locals: SortedMap<Int, String> |
||||||
|
) |
@ -0,0 +1,10 @@ |
|||||||
|
package dev.openrs2.deob.map |
||||||
|
|
||||||
|
import dev.openrs2.asm.MemberRef |
||||||
|
import java.util.SortedMap |
||||||
|
|
||||||
|
data class NameMap( |
||||||
|
val classes: SortedMap<String, String>, |
||||||
|
val fields: SortedMap<MemberRef, Field>, |
||||||
|
val methods: SortedMap<MemberRef, Method> |
||||||
|
) |
@ -0,0 +1,28 @@ |
|||||||
|
plugins { |
||||||
|
`maven-publish` |
||||||
|
kotlin("jvm") |
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
implementation(project(":deob-annotations")) |
||||||
|
implementation(project(":deob-map")) |
||||||
|
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${Versions.jackson}") |
||||||
|
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:${Versions.jackson}") |
||||||
|
} |
||||||
|
|
||||||
|
publishing { |
||||||
|
publications.create<MavenPublication>("maven") { |
||||||
|
from(components["java"]) |
||||||
|
|
||||||
|
pom { |
||||||
|
packaging = "jar" |
||||||
|
name.set("OpenRS2 Deobfuscator Annotation Processor") |
||||||
|
description.set( |
||||||
|
""" |
||||||
|
Processes deobfuscator annotations to create a mapping file of |
||||||
|
obfuscated to refactored names. |
||||||
|
""".trimIndent() |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package dev.openrs2.deob.processor |
||||||
|
|
||||||
|
import com.sun.source.tree.VariableTree |
||||||
|
import com.sun.source.util.TreePathScanner |
||||||
|
import com.sun.source.util.Trees |
||||||
|
import dev.openrs2.deob.annotation.Pc |
||||||
|
|
||||||
|
class LocalVariableScanner(private val trees: Trees) : TreePathScanner<Void, MutableMap<Int, String>>() { |
||||||
|
override fun visitVariable(node: VariableTree, p: MutableMap<Int, String>): Void? { |
||||||
|
val element = trees.getElement(currentPath) |
||||||
|
|
||||||
|
val pc = element.getAnnotation(Pc::class.java) |
||||||
|
if (pc != null) { |
||||||
|
p[pc.value] = element.simpleName.toString() |
||||||
|
} |
||||||
|
|
||||||
|
return super.visitVariable(node, p) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,102 @@ |
|||||||
|
package dev.openrs2.deob.processor |
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper |
||||||
|
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory |
||||||
|
import com.fasterxml.jackson.module.kotlin.registerKotlinModule |
||||||
|
import com.sun.source.util.Trees |
||||||
|
import dev.openrs2.asm.MemberRef |
||||||
|
import dev.openrs2.asm.toInternalClassName |
||||||
|
import dev.openrs2.deob.annotation.OriginalArg |
||||||
|
import dev.openrs2.deob.annotation.OriginalClass |
||||||
|
import dev.openrs2.deob.annotation.OriginalMember |
||||||
|
import dev.openrs2.deob.map.Field |
||||||
|
import dev.openrs2.deob.map.Method |
||||||
|
import dev.openrs2.deob.map.NameMap |
||||||
|
import java.nio.file.Files |
||||||
|
import java.nio.file.Path |
||||||
|
import java.nio.file.Paths |
||||||
|
import java.util.TreeMap |
||||||
|
import javax.annotation.processing.AbstractProcessor |
||||||
|
import javax.annotation.processing.ProcessingEnvironment |
||||||
|
import javax.annotation.processing.RoundEnvironment |
||||||
|
import javax.annotation.processing.SupportedAnnotationTypes |
||||||
|
import javax.annotation.processing.SupportedOptions |
||||||
|
import javax.annotation.processing.SupportedSourceVersion |
||||||
|
import javax.lang.model.SourceVersion |
||||||
|
import javax.lang.model.element.ExecutableElement |
||||||
|
import javax.lang.model.element.TypeElement |
||||||
|
import javax.lang.model.element.VariableElement |
||||||
|
|
||||||
|
@SupportedAnnotationTypes( |
||||||
|
"dev.openrs2.deob.annotation.OriginalArg", |
||||||
|
"dev.openrs2.deob.annotation.OriginalClass", |
||||||
|
"dev.openrs2.deob.annotation.OriginalMember", |
||||||
|
"dev.openrs2.deob.annotation.Pc" |
||||||
|
) |
||||||
|
@SupportedSourceVersion(SourceVersion.RELEASE_11) |
||||||
|
@SupportedOptions( |
||||||
|
"map" |
||||||
|
) |
||||||
|
class NameMapProcessor : AbstractProcessor() { |
||||||
|
private val classes = TreeMap<String, String>() |
||||||
|
private val fields = TreeMap<MemberRef, Field>() |
||||||
|
private val methods = TreeMap<MemberRef, Method>() |
||||||
|
private lateinit var trees: Trees |
||||||
|
private lateinit var localScanner: LocalVariableScanner |
||||||
|
|
||||||
|
override fun init(env: ProcessingEnvironment) { |
||||||
|
super.init(env) |
||||||
|
trees = Trees.instance(env) |
||||||
|
localScanner = LocalVariableScanner(trees) |
||||||
|
} |
||||||
|
|
||||||
|
private fun getPath(): Path? { |
||||||
|
val map = processingEnv.options["map"] ?: return null |
||||||
|
return Paths.get(map) |
||||||
|
} |
||||||
|
|
||||||
|
override fun process(annotations: Set<TypeElement>, env: RoundEnvironment): Boolean { |
||||||
|
val mapPath = getPath() ?: return true |
||||||
|
|
||||||
|
for (element in env.getElementsAnnotatedWith(OriginalClass::class.java)) { |
||||||
|
check(element is TypeElement) |
||||||
|
|
||||||
|
val originalClass = element.getAnnotation(OriginalClass::class.java)!! |
||||||
|
classes[originalClass.value] = element.qualifiedName.toString().toInternalClassName() |
||||||
|
} |
||||||
|
|
||||||
|
for (element in env.getElementsAnnotatedWith(OriginalMember::class.java)) { |
||||||
|
val path = trees.getPath(element) |
||||||
|
val owner = trees.getScope(path).enclosingClass.qualifiedName.toString().toInternalClassName() |
||||||
|
val name = element.simpleName.toString() |
||||||
|
|
||||||
|
val originalMember = element.getAnnotation(OriginalMember::class.java)!! |
||||||
|
val ref = MemberRef(originalMember.owner, originalMember.name, originalMember.descriptor) |
||||||
|
|
||||||
|
when (element) { |
||||||
|
is VariableElement -> fields[ref] = Field(owner, name) |
||||||
|
is ExecutableElement -> { |
||||||
|
val arguments = element.parameters.map { parameter -> |
||||||
|
val originalArg = parameter.getAnnotation(OriginalArg::class.java)!! |
||||||
|
Pair(originalArg.value, parameter.simpleName.toString()) |
||||||
|
}.toMap(LinkedHashMap()) |
||||||
|
|
||||||
|
val locals = TreeMap<Int, String>() |
||||||
|
localScanner.scan(path, locals) |
||||||
|
|
||||||
|
methods[ref] = Method(owner, name, arguments, locals) |
||||||
|
} |
||||||
|
else -> error("Unexpected element type") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (env.processingOver()) { |
||||||
|
Files.newBufferedWriter(mapPath).use { writer -> |
||||||
|
val mapper = ObjectMapper(YAMLFactory()).registerKotlinModule() |
||||||
|
mapper.writeValue(writer, NameMap(classes, fields, methods)) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return true |
||||||
|
} |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
dev.openrs2.deob.processor.NameMapProcessor |
Loading…
Reference in new issue