From 675c409a59a4c0b2aa051d756631b0145b9a5701 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Fri, 18 Mar 2022 20:46:24 +0100 Subject: [PATCH] Rework patcher --- build.gradle.kts | 9 +++- .../kotlin/net/revanced/patcher/Patcher.kt | 43 +++++------------ .../net/revanced/patcher/patch/Patch.kt | 6 +-- .../net/revanced/patcher/patch/PatchResult.kt | 24 ++++++++++ .../revanced/patcher/signature/Signature.kt | 48 +++++++++++++++++++ .../patcher/signatures/ElementType.kt | 15 ------ .../revanced/patcher/signatures/Signature.kt | 44 ----------------- .../patcher/signatures/SignatureSupplier.kt | 5 -- .../patcher/signatures/v17_03_38/Sigs.kt | 34 ------------- .../patcher/sigscan/SignatureScanner.kt | 12 ----- .../net/revanced/patcher/store/PatchStore.kt | 11 +++++ .../revanced/patcher/store/SignatureStore.kt | 11 +++++ .../net/revanced/patcher/version/YTVersion.kt | 26 ---------- .../net/revanced/patcher/PatcherTest.kt | 16 +++++++ 14 files changed, 131 insertions(+), 173 deletions(-) create mode 100644 src/main/kotlin/net/revanced/patcher/patch/PatchResult.kt create mode 100644 src/main/kotlin/net/revanced/patcher/signature/Signature.kt delete mode 100644 src/main/kotlin/net/revanced/patcher/signatures/ElementType.kt delete mode 100644 src/main/kotlin/net/revanced/patcher/signatures/Signature.kt delete mode 100644 src/main/kotlin/net/revanced/patcher/signatures/SignatureSupplier.kt delete mode 100644 src/main/kotlin/net/revanced/patcher/signatures/v17_03_38/Sigs.kt delete mode 100644 src/main/kotlin/net/revanced/patcher/sigscan/SignatureScanner.kt create mode 100644 src/main/kotlin/net/revanced/patcher/store/PatchStore.kt create mode 100644 src/main/kotlin/net/revanced/patcher/store/SignatureStore.kt delete mode 100644 src/main/kotlin/net/revanced/patcher/version/YTVersion.kt create mode 100644 src/test/kotlin/net/revanced/patcher/PatcherTest.kt diff --git a/build.gradle.kts b/build.gradle.kts index 9641224..76ce09d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,6 +12,11 @@ repositories { dependencies { implementation(kotlin("stdlib")) + testImplementation(kotlin("test")) - implementation("org.smali:dexlib2:2.5.2") -} \ No newline at end of file + implementation("org.ow2.asm:asm:9.2") +} + +tasks.test { + useJUnitPlatform() +} diff --git a/src/main/kotlin/net/revanced/patcher/Patcher.kt b/src/main/kotlin/net/revanced/patcher/Patcher.kt index b5a1a07..36445a2 100644 --- a/src/main/kotlin/net/revanced/patcher/Patcher.kt +++ b/src/main/kotlin/net/revanced/patcher/Patcher.kt @@ -1,35 +1,18 @@ package net.revanced.patcher + import net.revanced.patcher.patch.Patch -import net.revanced.patcher.signatures.Signature -import net.revanced.patcher.sigscan.SignatureScanner -import org.jf.dexlib2.DexFileFactory -import org.jf.dexlib2.dexbacked.DexBackedDexFile -import org.jf.dexlib2.dexbacked.DexBackedMethod -import org.jf.dexlib2.iface.DexFile -import java.io.File -import kotlin.math.sign +import net.revanced.patcher.signature.Signature +import net.revanced.patcher.store.PatchStore +import net.revanced.patcher.store.SignatureStore +import java.io.InputStream -class Patcher(private val dexFilePath: File) { - private lateinit var patches: MutableList; - private lateinit var methodCache: List; - - private var dexFile: DexFile = DexFileFactory.loadDexFile(dexFilePath, null); - - fun writeDexFile(path: String) { - DexFileFactory.writeDexFile(path, dexFile) - } - - fun addPatch(patch: Patch) { - patches.add(patch) - } - - fun addSignatures(vararg signatures: Signature) { - methodCache = SignatureScanner(dexFile.classes.flatMap { classDef -> classDef.methods }).resolve(signatures) - } - - fun execute() { - patches.forEach{ patch -> - patch.Execute(); - } +class Patcher( + private val input: InputStream, + signatures: Array, + patches: Array, +) { + init { + SignatureStore.addSignatures(*signatures) + PatchStore.addPatches(*patches) } } \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/patch/Patch.kt b/src/main/kotlin/net/revanced/patcher/patch/Patch.kt index 5beea98..1b39ed4 100644 --- a/src/main/kotlin/net/revanced/patcher/patch/Patch.kt +++ b/src/main/kotlin/net/revanced/patcher/patch/Patch.kt @@ -1,7 +1,3 @@ package net.revanced.patcher.patch -class Patch { - fun Execute(){ - TODO() - } -} \ No newline at end of file +class Patch(val fn: Function) \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/patch/PatchResult.kt b/src/main/kotlin/net/revanced/patcher/patch/PatchResult.kt new file mode 100644 index 0000000..8bc239f --- /dev/null +++ b/src/main/kotlin/net/revanced/patcher/patch/PatchResult.kt @@ -0,0 +1,24 @@ +package net.revanced.patcher.patch + +interface PatchResult { + fun error(): PatchResultError? { + if (this is PatchResultError) { + return this + } + return null + } + fun success(): PatchResultSuccess? { + if (this is PatchResultSuccess) { + return this + } + return null + } +} + +class PatchResultError(private val errorMessage: String) : PatchResult { + fun errorMessage(): String { + return errorMessage + } +} + +class PatchResultSuccess : PatchResult \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/signature/Signature.kt b/src/main/kotlin/net/revanced/patcher/signature/Signature.kt new file mode 100644 index 0000000..864e7d0 --- /dev/null +++ b/src/main/kotlin/net/revanced/patcher/signature/Signature.kt @@ -0,0 +1,48 @@ +package net.revanced.patcher.signature + +import org.objectweb.asm.Type + +/** + * An ASM signature list for the Patcher. + * + * @param name The name of the method. + * Do not use the actual method name, instead try to guess what the method name originally was. + * If you are unable to guess a method name, doing something like "patch-name-1" is fine too. + * For example: "override-codec-1". + * This method name will be used to find the corresponding patch. + * @param returns The return type/signature of the method. + * @param accessors The accessors of the method. + * @param parameters The parameter types/signatures of the method. + * @param opcodes The opcode pattern of the method, used to find the method by signature scanning. + */ +data class Signature( + val name: String, + val returns: Type, + val accessors: Array, + val parameters: Array, + val opcodes: Array +) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Signature + + if (name != other.name) return false + if (returns != other.returns) return false + if (!accessors.contentEquals(other.accessors)) return false + if (!parameters.contentEquals(other.parameters)) return false + if (!opcodes.contentEquals(other.opcodes)) return false + + return true + } + + override fun hashCode(): Int { + var result = name.hashCode() + result = 31 * result + returns.hashCode() + result = 31 * result + accessors.contentHashCode() + result = 31 * result + parameters.contentHashCode() + result = 31 * result + opcodes.contentHashCode() + return result + } +} diff --git a/src/main/kotlin/net/revanced/patcher/signatures/ElementType.kt b/src/main/kotlin/net/revanced/patcher/signatures/ElementType.kt deleted file mode 100644 index 27fa9d3..0000000 --- a/src/main/kotlin/net/revanced/patcher/signatures/ElementType.kt +++ /dev/null @@ -1,15 +0,0 @@ -package net.revanced.patcher.signatures - -class ElementType private constructor() { - companion object { - const val Void = "()V" - const val Boolean = "()Z" - const val Byte = "()B" - const val Char = "()C" - const val Short = "()S" - const val Int = "()I" - const val Long = "()J" - const val Float = "()F" - const val Double = "()D" - } -} \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/signatures/Signature.kt b/src/main/kotlin/net/revanced/patcher/signatures/Signature.kt deleted file mode 100644 index 603093e..0000000 --- a/src/main/kotlin/net/revanced/patcher/signatures/Signature.kt +++ /dev/null @@ -1,44 +0,0 @@ -package net.revanced.patcher.signatures - -import org.jf.dexlib2.Opcode - -/** - * An ASM signature. - * - * ``` - * Signature( - * arrayOf(Opcode.ADD_INT), - * Modifier.PUBLIC or Modifier.STATIC, - * "Ljava/lang/String;" - * ) - * ``` - * - * @param opcodes the opcode signature - * @param attributes the modifiers of the method you are searching for - * @param returnType the return type of the method as string, see: https://stackoverflow.com/a/9909370 - */ -data class Signature( - val opcodes: Array, - val attributes: Int, - val returnType: String -) { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as Signature - - if (!opcodes.contentEquals(other.opcodes)) return false - if (attributes != other.attributes) return false - if (returnType != other.returnType) return false - - return true - } - - override fun hashCode(): Int { - var result = opcodes.contentHashCode() - result = 31 * result + attributes.hashCode() - result = 31 * result + returnType.hashCode() - return result - } -} diff --git a/src/main/kotlin/net/revanced/patcher/signatures/SignatureSupplier.kt b/src/main/kotlin/net/revanced/patcher/signatures/SignatureSupplier.kt deleted file mode 100644 index f42db46..0000000 --- a/src/main/kotlin/net/revanced/patcher/signatures/SignatureSupplier.kt +++ /dev/null @@ -1,5 +0,0 @@ -package net.revanced.patcher.signatures - -interface SignatureSupplier { - fun signatures(): Array -} \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/signatures/v17_03_38/Sigs.kt b/src/main/kotlin/net/revanced/patcher/signatures/v17_03_38/Sigs.kt deleted file mode 100644 index f39caf4..0000000 --- a/src/main/kotlin/net/revanced/patcher/signatures/v17_03_38/Sigs.kt +++ /dev/null @@ -1,34 +0,0 @@ -package net.revanced.patcher.signatures.v17_03_38 - -import net.revanced.patcher.signatures.SignatureSupplier -import net.revanced.patcher.signatures.ElementType -import net.revanced.patcher.signatures.Signature -import java.lang.reflect.Modifier - -import org.jf.dexlib2.Opcode.* - -class Sigs: SignatureSupplier { - override fun signatures(): Array { - return arrayOf( - // public static aT(Landroid/content/Context;I)Z - Signature( - arrayOf( - IF_LT, // if-lt p0, p1, :cond_1 - CONST_4, // const/4 p0, 0x1 - // TODO(Inject): - // invoke-static {p0}, Lfi/razerman/youtube/XGlobals;->getOverride(Z)Z - // move-result p0 - RETURN, // return p0 - // :cond_1 - CONST_4, // const/4 p0, 0x0 - // TODO(Inject): - // invoke-static {p0}, Lfi/razerman/youtube/XGlobals;->getOverride(Z)Z - // move-result p0 - RETURN, // return p0 - ), - Modifier.PUBLIC or Modifier.STATIC, - ElementType.Boolean - ) - ) - } -} \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/sigscan/SignatureScanner.kt b/src/main/kotlin/net/revanced/patcher/sigscan/SignatureScanner.kt deleted file mode 100644 index d090bbe..0000000 --- a/src/main/kotlin/net/revanced/patcher/sigscan/SignatureScanner.kt +++ /dev/null @@ -1,12 +0,0 @@ -package net.revanced.patcher.sigscan - -import net.revanced.patcher.signatures.Signature -import org.jf.dexlib2.dexbacked.DexBackedMethod -import org.jf.dexlib2.iface.Method - - -class SignatureScanner(methods: List) { - fun resolve(signature: Array) : List { - TODO() - } -} \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/store/PatchStore.kt b/src/main/kotlin/net/revanced/patcher/store/PatchStore.kt new file mode 100644 index 0000000..6493135 --- /dev/null +++ b/src/main/kotlin/net/revanced/patcher/store/PatchStore.kt @@ -0,0 +1,11 @@ +package net.revanced.patcher.store + +import net.revanced.patcher.patch.Patch + +object PatchStore { + private val patches: MutableList = mutableListOf() + + fun addPatches(vararg patches: Patch) { + this.patches.addAll(patches) + } +} \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/store/SignatureStore.kt b/src/main/kotlin/net/revanced/patcher/store/SignatureStore.kt new file mode 100644 index 0000000..fe06950 --- /dev/null +++ b/src/main/kotlin/net/revanced/patcher/store/SignatureStore.kt @@ -0,0 +1,11 @@ +package net.revanced.patcher.store + +import net.revanced.patcher.signature.Signature + +object SignatureStore { + private val signatures: MutableList = mutableListOf() + + fun addSignatures(vararg signatures: Signature) { + this.signatures.addAll(signatures) + } +} \ No newline at end of file diff --git a/src/main/kotlin/net/revanced/patcher/version/YTVersion.kt b/src/main/kotlin/net/revanced/patcher/version/YTVersion.kt deleted file mode 100644 index bf96244..0000000 --- a/src/main/kotlin/net/revanced/patcher/version/YTVersion.kt +++ /dev/null @@ -1,26 +0,0 @@ -package net.revanced.patcher.version - -import net.revanced.patcher.signatures.SignatureSupplier -import net.revanced.patcher.signatures.v17_03_38.Sigs - -enum class YTVersion( - val versionNumber: Triple, - val sigs: SignatureSupplier -) { - V17_03_38( - Triple(17, 3, 38), - Sigs() - ); - - companion object { - private val vm: Map, YTVersion> = buildMap { - values().forEach { - this[it.versionNumber] = it - } - } - - fun versionFor(versionNumber: Triple): YTVersion? { - return vm[versionNumber] - } - } -} \ No newline at end of file diff --git a/src/test/kotlin/net/revanced/patcher/PatcherTest.kt b/src/test/kotlin/net/revanced/patcher/PatcherTest.kt new file mode 100644 index 0000000..a72dea8 --- /dev/null +++ b/src/test/kotlin/net/revanced/patcher/PatcherTest.kt @@ -0,0 +1,16 @@ +package net.revanced.patcher + +import net.revanced.patcher.patch.Patch +import net.revanced.patcher.patch.PatchResult +import net.revanced.patcher.patch.PatchResultError +import net.revanced.patcher.patch.PatchResultSuccess +import org.junit.jupiter.api.Test + +import org.junit.jupiter.api.Assertions.* + +internal class PatcherTest { + @Test + fun template() { + + } +} \ No newline at end of file