feat(YouTube): add Sanitize sharing links patch

This commit is contained in:
inotia00 2023-11-11 13:33:45 +09:00
parent acee8b679a
commit 4037d9c85b
7 changed files with 221 additions and 0 deletions

View File

@ -0,0 +1,24 @@
package app.revanced.patches.shared.fingerprints.tracking
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.Opcode
/**
* Copy URL from sharing panel
*/
object CopyTextEndpointFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("L", "Ljava/util/Map;"),
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.CONST_STRING,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.RETURN_VOID
),
strings = listOf("text/plain")
)

View File

@ -0,0 +1,40 @@
package app.revanced.patches.shared.patch.tracking
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.patch.BytecodePatch
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
abstract class AbstractSanitizeUrlQueryPatch(
private val descriptor: String,
private val sharedFingerprints: List<MethodFingerprint>,
private val additionalFingerprints: List<MethodFingerprint>? = null
) : BytecodePatch(
buildSet {
addAll(sharedFingerprints)
additionalFingerprints?.let(::addAll)
}
) {
private fun MethodFingerprint.invoke() {
result?.let {
it.mutableMethod.apply {
val targetIndex = it.scanResult.patternScanResult!!.startIndex
val targetRegister = getInstruction<TwoRegisterInstruction>(targetIndex).registerA
addInstructions(
targetIndex + 2, """
invoke-static {v$targetRegister}, $descriptor->stripQueryParameters(Ljava/lang/String;)Ljava/lang/String;
move-result-object v$targetRegister
"""
)
}
} ?: throw exception
}
override fun execute(context: BytecodeContext) {
for (fingerprint in sharedFingerprints)
fingerprint.invoke()
}
}

View File

@ -0,0 +1,100 @@
package app.revanced.patches.youtube.misc.tracking
import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.shared.fingerprints.tracking.CopyTextEndpointFingerprint
import app.revanced.patches.shared.patch.tracking.AbstractSanitizeUrlQueryPatch
import app.revanced.patches.youtube.misc.tracking.fingerprints.ShareLinkFormatterFingerprint
import app.revanced.patches.youtube.misc.tracking.fingerprints.SystemShareLinkFormatterFingerprint
import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.util.integrations.Constants.MISC_PATH
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
@Patch(
name = "Sanitize sharing links",
description = "Removes tracking query parameters from the URLs when sharing links.",
dependencies = [SettingsPatch::class],
compatiblePackages = [
CompatiblePackage(
"com.google.android.youtube",
[
"18.25.40",
"18.27.36",
"18.29.38",
"18.30.37",
"18.31.40",
"18.32.39",
"18.33.40",
"18.34.38",
"18.35.36",
"18.36.39",
"18.37.36",
"18.38.44",
"18.39.41",
"18.40.34"
]
)
]
)
@Suppress("unused")
object SanitizeUrlQueryPatch : AbstractSanitizeUrlQueryPatch(
"$MISC_PATH/SanitizeUrlQueryPatch;",
listOf(CopyTextEndpointFingerprint),
listOf(
ShareLinkFormatterFingerprint,
SystemShareLinkFormatterFingerprint
)
) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"$MISC_PATH/SanitizeUrlQueryPatch;"
override fun execute(context: BytecodeContext) {
super.execute(context)
arrayOf(
ShareLinkFormatterFingerprint,
SystemShareLinkFormatterFingerprint
).forEach { fingerprint ->
fingerprint.result?.let {
it.mutableMethod.apply {
for ((index, instruction) in implementation!!.instructions.withIndex()) {
if (instruction.opcode != Opcode.INVOKE_VIRTUAL)
continue
if ((instruction as ReferenceInstruction).reference.toString() != "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;")
continue
if (getInstruction(index + 1).opcode != Opcode.GOTO)
continue
val invokeInstruction = instruction as FiveRegisterInstruction
replaceInstruction(
index,
"invoke-static {v${invokeInstruction.registerC}, v${invokeInstruction.registerD}, v${invokeInstruction.registerE}}, "
+ "$INTEGRATIONS_CLASS_DESCRIPTOR->stripQueryParameters(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;)V"
)
}
}
} ?: throw fingerprint.exception
}
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"SETTINGS: SANITIZE_SHARING_LINKS"
)
)
SettingsPatch.updatePatchStatus("Sanitize sharing links")
}
}

View File

@ -0,0 +1,39 @@
package app.revanced.patches.youtube.misc.tracking.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
/**
* Sharing panel of YouTube
*
* This fingerprint is quite complex to be compatible with all versions from YouTube v18.25.40 to the latest version.
* If you drop supporting the old version, please change the fingerprint to be more intuitive.
*/
object ShareLinkFormatterFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.CHECK_CAST,
Opcode.GOTO,
Opcode.MOVE_OBJECT,
Opcode.INVOKE_VIRTUAL
),
customFingerprint = custom@{ methodDef, _ ->
if (methodDef.implementation == null)
return@custom false
var count = 0
for (instruction in methodDef.implementation!!.instructions) {
if (instruction.opcode != Opcode.SGET_OBJECT)
continue
val objectInstruction = instruction as ReferenceInstruction
if ((objectInstruction.reference as FieldReference).name != "androidAppEndpoint")
continue
count++
}
count == 2
}
)

View File

@ -0,0 +1,12 @@
package app.revanced.patches.youtube.misc.tracking.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
/**
* Sharing panel of System
*/
object SystemShareLinkFormatterFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("L", "Ljava/util/Map;"),
strings = listOf("YTShare_Logging_Share_Intent_Endpoint_Byte_Array")
)

View File

@ -653,6 +653,8 @@ Tap and hold to set playback speed to 1.0x."</string>
<string name="revanced_ryd_shorts_title">Show dislikes on Shorts</string>
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Hidden</string>
<string name="revanced_sanitize_sharing_links_summary">Removes tracking query parameters from the URLs when sharing links.</string>
<string name="revanced_sanitize_sharing_links_title">Sanitize sharing links</string>
<string name="revanced_save_playback_speed">Changing default speed to:</string>
<string name="revanced_save_video_quality_mobile">Changing default mobile data quality to:</string>
<string name="revanced_save_video_quality_none">Failed to set quality.</string>

View File

@ -300,6 +300,9 @@
<intent android:targetPackage="com.mgoogle.android.gms" android:targetClass="org.microg.gms.ui.SettingsActivity" />
</Preference>PREFERENCE: MICROG_SETTINGS -->
<!-- SETTINGS: SANITIZE_SHARING_LINKS
<SwitchPreference android:title="@string/revanced_sanitize_sharing_links_title" android:key="revanced_sanitize_sharing_links" android:defaultValue="true" android:summary="@string/revanced_sanitize_sharing_links_summary" />SETTINGS: SANITIZE_SHARING_LINKS -->
<!-- SETTINGS: EXPERIMENTAL_FLAGS
<Preference android:title=" " android:selectable="false" android:summary="@string/revanced_experimental_flag" />SETTINGS: EXPERIMENTAL_FLAGS -->
@ -394,6 +397,7 @@
<Preference android:title="Force OPUS codec" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Force video codec" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Layout switch" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Sanitize sharing links" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Spoof app version" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Spoof device dimensions" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>
<Preference android:title="Spoof player parameters" android:summary="@string/revanced_patches_excluded" android:selectable="false"/>