diff --git a/api/revanced-patches.api b/api/revanced-patches.api index d6540eac..cfe80fae 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -487,6 +487,12 @@ public final class app/revanced/patches/photomath/misc/unlock/plus/UnlockPlusPat public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } +public final class app/revanced/patches/piccomafr/tracking/DisableTrackingPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/piccomafr/tracking/DisableTrackingPatch; + public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V +} + public final class app/revanced/patches/pixiv/ads/HideAdsPatch : app/revanced/patcher/patch/BytecodePatch { public static final field INSTANCE Lapp/revanced/patches/pixiv/ads/HideAdsPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V diff --git a/src/main/kotlin/app/revanced/patches/piccomafr/tracking/DisableTrackingPatch.kt b/src/main/kotlin/app/revanced/patches/piccomafr/tracking/DisableTrackingPatch.kt new file mode 100644 index 00000000..0830e5a7 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/piccomafr/tracking/DisableTrackingPatch.kt @@ -0,0 +1,80 @@ +package app.revanced.patches.piccomafr.tracking + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstructions +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.CompatiblePackage +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.piccomafr.tracking.fingerprints.AppMesurementFingerprint +import app.revanced.patches.piccomafr.tracking.fingerprints.FacebookSDKFingerprint +import app.revanced.patches.piccomafr.tracking.fingerprints.FirebaseInstallFingerprint +import app.revanced.util.exception +import app.revanced.util.getReference +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.StringReference + +@Patch( + name = "Disable tracking", + description = "Disables tracking by replacing tracking URLs with example.com.", + compatiblePackages = [ + CompatiblePackage( + "com.piccomaeurope.fr", + [ + "6.4.0", + "6.4.1", + "6.4.2", + "6.4.3", + "6.4.4", + "6.4.5", + "6.5.0", + "6.5.1", + "6.5.2", + "6.5.3", + "6.5.4", + "6.6.0", + "6.6.1", + "6.6.2", + ], + ), + ], +) +@Suppress("unused") +object DisableTrackingPatch : BytecodePatch( + setOf(FacebookSDKFingerprint, FirebaseInstallFingerprint, AppMesurementFingerprint), +) { + override fun execute(context: BytecodeContext) { + FacebookSDKFingerprint.result?.mutableMethod?.apply { + getInstructions().filter { instruction -> + instruction.opcode == Opcode.CONST_STRING + }.forEach { instruction -> + instruction as OneRegisterInstruction + + replaceInstruction( + instruction.location.index, + "const-string v${instruction.registerA}, \"example.com\"", + ) + } + } ?: throw FacebookSDKFingerprint.exception + + FirebaseInstallFingerprint.result?.mutableMethod?.apply { + getInstructions().filter { + it.opcode == Opcode.CONST_STRING + }.filter { + it.getReference()?.string == "firebaseinstallations.googleapis.com" + }.forEach { instruction -> + instruction as OneRegisterInstruction + + replaceInstruction( + instruction.location.index, + "const-string v${instruction.registerA}, \"example.com\"", + ) + } + } ?: throw FirebaseInstallFingerprint.exception + + AppMesurementFingerprint.result?.mutableMethod?.addInstruction(0, "return-void") + ?: throw AppMesurementFingerprint.exception + } +} diff --git a/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/AppMesurementFingerprint.kt b/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/AppMesurementFingerprint.kt new file mode 100644 index 00000000..499491a3 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/AppMesurementFingerprint.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.piccomafr.tracking.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + + +internal object AppMesurementFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, + strings = listOf( + "config/app/", + "Fetching remote configuration" + ), + returnType = "V" +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/FacebookSDKFingerprint.kt b/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/FacebookSDKFingerprint.kt new file mode 100644 index 00000000..ff481e81 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/FacebookSDKFingerprint.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.piccomafr.tracking.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + + +internal object FacebookSDKFingerprint : MethodFingerprint( + accessFlags = AccessFlags.STATIC or AccessFlags.CONSTRUCTOR, + strings = listOf( + "instagram.com", + "facebook.com" + ), + returnType = "V" +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/FirebaseInstallFingerprint.kt b/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/FirebaseInstallFingerprint.kt new file mode 100644 index 00000000..ebaa6c12 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/piccomafr/tracking/fingerprints/FirebaseInstallFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.piccomafr.tracking.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + + +internal object FirebaseInstallFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PRIVATE.value, + strings = listOf( + "https://%s/%s/%s", + "firebaseinstallations.googleapis.com" + ) +) \ No newline at end of file