From 2442902dacc25f2c932a6689e9788e5a02fdff6b Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 21 Nov 2023 23:09:57 +0100 Subject: [PATCH] fix(YouTube - Remove tracking query parameter): Sanitize shared URLs in remaining places --- .../RemoveTrackingQueryParameterPatch.kt | 45 +++++++++++++------ .../SystemShareSheetFingerprint.kt | 14 ++++++ .../YouTubeShareSheetFingerprint.kt | 18 ++++++++ 3 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/privacy/fingerprints/SystemShareSheetFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/privacy/fingerprints/YouTubeShareSheetFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 616b544b5..d4580811d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -1,16 +1,23 @@ package app.revanced.patches.youtube.misc.privacy +import app.revanced.extensions.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patcher.fingerprint.MethodFingerprintResult.MethodFingerprintScanResult.PatternScanResult import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.shared.settings.preference.impl.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.privacy.fingerprints.CopyTextFingerprint +import app.revanced.patches.youtube.misc.privacy.fingerprints.SystemShareSheetFingerprint +import app.revanced.patches.youtube.misc.privacy.fingerprints.YouTubeShareSheetFingerprint import app.revanced.patches.youtube.misc.settings.SettingsPatch +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @Patch( @@ -30,7 +37,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction ) @Suppress("unused") object RemoveTrackingQueryParameterPatch : BytecodePatch( - setOf(CopyTextFingerprint) + setOf(CopyTextFingerprint, SystemShareSheetFingerprint, YouTubeShareSheetFingerprint) ) { const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/RemoveTrackingQueryParameterPatch;" @@ -53,21 +60,31 @@ object RemoveTrackingQueryParameterPatch : BytecodePatch( ) ) - CopyTextFingerprint.result?.let { - val insertIndex = it.scanResult.patternScanResult!!.startIndex + 2 + fun MethodFingerprint.hook( + getInsertIndex: PatternScanResult.() -> Int, + getUrlRegister: MutableMethod.(insertIndex: Int) -> Int + ) = result?.let { + val insertIndex = it.scanResult.patternScanResult!!.getInsertIndex() + val urlRegister = it.mutableMethod.getUrlRegister(insertIndex) - it.mutableMethod.apply { - val urlRegister = getInstruction(insertIndex - 2).registerA + it.mutableMethod.addInstructions( + insertIndex, + """ + invoke-static {v$urlRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$urlRegister + """ + ) + } ?: throw exception - addInstructions( - insertIndex, - """ - invoke-static {v$urlRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$urlRegister - """ - ) - } + // Native YouTube share sheet. + YouTubeShareSheetFingerprint.hook(getInsertIndex = { startIndex + 1 }) + { insertIndex -> getInstruction(insertIndex - 1).registerA } - } + // Native system share sheet. + SystemShareSheetFingerprint.hook(getInsertIndex = { endIndex }) + { insertIndex -> getInstruction(insertIndex - 1).registerA } + + CopyTextFingerprint.hook(getInsertIndex = { startIndex + 2 }) + { insertIndex -> getInstruction(insertIndex - 2).registerA } } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/fingerprints/SystemShareSheetFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/fingerprints/SystemShareSheetFingerprint.kt new file mode 100644 index 000000000..2927e614a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/fingerprints/SystemShareSheetFingerprint.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.youtube.misc.privacy.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.Opcode + +object SystemShareSheetFingerprint : MethodFingerprint( + returnType = "V", + parameters = listOf("L", "Ljava/util/Map;"), + opcodes = listOf( + Opcode.CHECK_CAST, + Opcode.GOTO + ), + strings = listOf("YTShare_Logging_Share_Intent_Endpoint_Byte_Array") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/fingerprints/YouTubeShareSheetFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/fingerprints/YouTubeShareSheetFingerprint.kt new file mode 100644 index 000000000..4aae6f9b0 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/fingerprints/YouTubeShareSheetFingerprint.kt @@ -0,0 +1,18 @@ +package app.revanced.patches.youtube.misc.privacy.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +object YouTubeShareSheetFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("L", "Ljava/util/Map;"), + opcodes = listOf( + Opcode.CHECK_CAST, + Opcode.GOTO, + Opcode.MOVE_OBJECT, + Opcode.INVOKE_VIRTUAL, + ) +) \ No newline at end of file