From 52309463e4c02679f24eadd303e09f6ae3b7cb78 Mon Sep 17 00:00:00 2001 From: josesilveiraa <85128820+josesilveiraa@users.noreply.github.com> Date: Sun, 27 Nov 2022 22:36:39 -0300 Subject: [PATCH] feat(backdrops): `pro-unlock` patch (#1121) --- .../pro/annotations/ProUnlockCompatibility.kt | 7 ++++ .../pro/fingerprints/ProUnlockFingerprint.kt | 15 +++++++ .../misc/pro/patch/ProUnlockPatch.kt | 42 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/backdrops/misc/pro/annotations/ProUnlockCompatibility.kt create mode 100644 src/main/kotlin/app/revanced/patches/backdrops/misc/pro/fingerprints/ProUnlockFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/backdrops/misc/pro/patch/ProUnlockPatch.kt diff --git a/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/annotations/ProUnlockCompatibility.kt b/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/annotations/ProUnlockCompatibility.kt new file mode 100644 index 000000000..60b4832c5 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/annotations/ProUnlockCompatibility.kt @@ -0,0 +1,7 @@ +package app.revanced.patches.backdrops.misc.pro.annotations + +import app.revanced.patcher.annotation.Compatibility +import app.revanced.patcher.annotation.Package + +@Compatibility([Package("com.backdrops.wallpapers")]) +internal annotation class ProUnlockCompatibility \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/fingerprints/ProUnlockFingerprint.kt b/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/fingerprints/ProUnlockFingerprint.kt new file mode 100644 index 000000000..7deff0a9c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/fingerprints/ProUnlockFingerprint.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.backdrops.misc.pro.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.Opcode + +object ProUnlockFingerprint : MethodFingerprint( + opcodes = listOf( + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT_OBJECT, + Opcode.INVOKE_INTERFACE, + Opcode.MOVE_RESULT, + Opcode.IF_EQZ + ), + customFingerprint = { it.definingClass == "Lcom/backdrops/wallpapers/data/local/DatabaseHandlerIAB;" && it.name == "lambda\$existPurchase\$0" } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/patch/ProUnlockPatch.kt b/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/patch/ProUnlockPatch.kt new file mode 100644 index 000000000..0365284d8 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/patch/ProUnlockPatch.kt @@ -0,0 +1,42 @@ +package app.revanced.patches.backdrops.misc.pro.patch + +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.MethodFingerprintExtensions.name +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.instruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultError +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patches.backdrops.misc.pro.annotations.ProUnlockCompatibility +import app.revanced.patches.backdrops.misc.pro.fingerprints.ProUnlockFingerprint +import org.jf.dexlib2.iface.instruction.OneRegisterInstruction + +@Patch +@Name("pro-unlock") +@Description("Unlocks pro-only functions.") +@ProUnlockCompatibility +@Version("0.0.1") +class ProUnlockPatch : BytecodePatch( + listOf(ProUnlockFingerprint) +) { + override fun execute(context: BytecodeContext): PatchResult { + val result = ProUnlockFingerprint.result ?: return PatchResultError("${ProUnlockFingerprint.name} not found") + + val moveRegisterInstruction = result.mutableMethod.instruction(result.scanResult.patternScanResult!!.endIndex - 1) + val register = (moveRegisterInstruction as OneRegisterInstruction).registerA + + result.mutableMethod.addInstructions( + result.scanResult.patternScanResult!!.endIndex, + """ + const/4 v$register, 0x1 + """ + ) + + return PatchResultSuccess() + } +} \ No newline at end of file