diff --git a/src/main/kotlin/app/revanced/patches/photomath/detection/signature/annotations/DisableSignatureDetectionCompatibility.kt b/src/main/kotlin/app/revanced/patches/photomath/detection/signature/annotations/DisableSignatureDetectionCompatibility.kt new file mode 100644 index 000000000..3181281f4 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/detection/signature/annotations/DisableSignatureDetectionCompatibility.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.photomath.detection.signature.annotations + +import app.revanced.patcher.annotation.Compatibility +import app.revanced.patcher.annotation.Package + +@Compatibility([Package("com.microblink.photomath")]) +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +internal annotation class DisableSignatureDetectionCompatibility \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/photomath/detection/signature/fingerprints/CheckSignatureFingerprint.kt b/src/main/kotlin/app/revanced/patches/photomath/detection/signature/fingerprints/CheckSignatureFingerprint.kt new file mode 100644 index 000000000..26fb72655 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/detection/signature/fingerprints/CheckSignatureFingerprint.kt @@ -0,0 +1,21 @@ +package app.revanced.patches.photomath.detection.signature.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.Opcode + +object CheckSignatureFingerprint : MethodFingerprint( + strings = listOf( + "currentSignature" + ), + opcodes = listOf( + Opcode.CONST_STRING, + Opcode.CONST_STRING, + Opcode.INVOKE_STATIC, + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT_OBJECT, + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT, + ) +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/photomath/detection/signature/fingerprints/MainOnCreateFingerprint.kt b/src/main/kotlin/app/revanced/patches/photomath/detection/signature/fingerprints/MainOnCreateFingerprint.kt new file mode 100644 index 000000000..f263f0b73 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/detection/signature/fingerprints/MainOnCreateFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.photomath.detection.signature.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags + +object MainOnCreateFingerprint : MethodFingerprint( + returnType = "V", + access = AccessFlags.PUBLIC or AccessFlags.FINAL, + customFingerprint = { methodDef -> + methodDef.definingClass == "Lcom/microblink/photomath/PhotoMath;" && methodDef.name == "onCreate" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/photomath/detection/signature/patch/SignatureDetectionPatch.kt b/src/main/kotlin/app/revanced/patches/photomath/detection/signature/patch/SignatureDetectionPatch.kt new file mode 100644 index 000000000..f8a07bd9e --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/detection/signature/patch/SignatureDetectionPatch.kt @@ -0,0 +1,42 @@ +package app.revanced.patches.photomath.detection.signature.patch + +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.instruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patches.photomath.detection.signature.annotations.DisableSignatureDetectionCompatibility +import app.revanced.patches.photomath.detection.signature.fingerprints.CheckSignatureFingerprint +import app.revanced.patches.photomath.detection.signature.fingerprints.MainOnCreateFingerprint +import org.jf.dexlib2.iface.instruction.OneRegisterInstruction + +@Description("Disables detection of incorrect signature.") +@DisableSignatureDetectionCompatibility +@Version("0.0.1") +class SignatureDetectionPatch : BytecodePatch( + listOf( + MainOnCreateFingerprint + ) +) { + override fun execute(context: BytecodeContext): PatchResult { + val mainOnCreate = MainOnCreateFingerprint.result!! + + val patternResult = CheckSignatureFingerprint.also { + it.resolve(context, mainOnCreate.method, mainOnCreate.classDef) + }.result!!.scanResult.patternScanResult!! + + mainOnCreate.mutableMethod.apply { + val signatureCheckInstruction = instruction(patternResult.endIndex) + val checkRegister = (signatureCheckInstruction as OneRegisterInstruction).registerA + + replaceInstruction(signatureCheckInstruction.location.index, "const/4 v$checkRegister, 0x1") + } + + return PatchResultSuccess() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/annotations/UnlockPlusCompatibilty.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/annotations/UnlockPlusCompatibilty.kt new file mode 100644 index 000000000..91b1ad413 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/annotations/UnlockPlusCompatibilty.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.photomath.misc.unlockplus.annotations + +import app.revanced.patcher.annotation.Compatibility +import app.revanced.patcher.annotation.Package + +@Compatibility([Package("com.microblink.photomath")]) +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +internal annotation class UnlockPlusCompatibilty \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/fingerprints/IsPlusUnlockedFingerprint.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/fingerprints/IsPlusUnlockedFingerprint.kt new file mode 100644 index 000000000..eb2f74644 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/fingerprints/IsPlusUnlockedFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.photomath.misc.unlockplus.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags + +object IsPlusUnlockedFingerprint : MethodFingerprint( + returnType = "Z", + access = AccessFlags.PUBLIC or AccessFlags.FINAL, + strings = listOf( + "genius" + ), + customFingerprint = { + methodDef -> methodDef.definingClass.endsWith("/User;") + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/patch/UnlockPlusPatch.kt b/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/patch/UnlockPlusPatch.kt new file mode 100644 index 000000000..eb5cb8064 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/photomath/misc/unlockplus/patch/UnlockPlusPatch.kt @@ -0,0 +1,43 @@ +package app.revanced.patches.photomath.misc.unlockplus.patch + +import app.revanced.extensions.toErrorResult +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.addInstructions +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patcher.patch.annotations.DependsOn +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patches.photomath.detection.signature.patch.SignatureDetectionPatch +import app.revanced.patches.photomath.misc.unlockplus.annotations.UnlockPlusCompatibilty +import app.revanced.patches.photomath.misc.unlockplus.fingerprints.IsPlusUnlockedFingerprint + +@Patch +@Name("unlock-plus") +@DependsOn([SignatureDetectionPatch::class]) +@Description("Unlocks plus features.") +@UnlockPlusCompatibilty +@Version("0.0.1") +class UnlockPlusPatch : BytecodePatch( + listOf( + IsPlusUnlockedFingerprint + ) +) { + override fun execute(context: BytecodeContext): PatchResult { + IsPlusUnlockedFingerprint.result?.mutableMethod?.apply { + addInstructions( + 0, + """ + const/4 v0, 0x1 + return v0 + """ + ) + } ?: return IsPlusUnlockedFingerprint.toErrorResult() + + return PatchResultSuccess() + } + +} \ No newline at end of file