feat(YouTube - Spoof streaming data): Add setting to change PoToken / Visitor Data https://github.com/inotia00/ReVanced_Extended/issues/2630#issuecomment-2566310025

This commit is contained in:
inotia00
2024-12-31 21:17:51 +09:00
parent 83f2d82d0a
commit 00fbd318e7
10 changed files with 132 additions and 22 deletions

View File

@ -21,6 +21,7 @@ import app.revanced.util.fingerprint.definingClassOrThrow
import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall
import app.revanced.util.fingerprint.matchOrThrow
import app.revanced.util.fingerprint.methodOrThrow
import app.revanced.util.fingerprint.mutableClassOrThrow
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.AccessFlags
@ -362,6 +363,24 @@ fun baseSpoofStreamingDataPatch(
// endregion
// region Set DroidGuard poToken.
poTokenToStringFingerprint.mutableClassOrThrow().let {
val poTokenClass = it.fields.find { field ->
field.accessFlags == AccessFlags.PRIVATE.value && field.type.startsWith("L")
}!!.type
findMethodOrThrow(poTokenClass) {
name == "<init>" &&
parameters == listOf("[B")
}.addInstruction(
1,
"invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->setDroidGuardPoToken([B)V"
)
}
// endregion
findMethodOrThrow("$PATCHES_PATH/PatchStatus;") {
name == "SpoofStreamingData"
}.replaceInstruction(

View File

@ -197,3 +197,18 @@ internal val hlsCurrentTimeFingerprint = legacyFingerprint(
parameters = listOf("Z", "L"),
literals = listOf(HLS_CURRENT_TIME_FEATURE_FLAG),
)
internal val poTokenToStringFingerprint = legacyFingerprint(
name = "poTokenToStringFingerprint",
returnType = "Ljava/lang/String;",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = emptyList(),
strings = listOf("UTF-8"),
customFingerprint = { method, classDef ->
method.name == "toString" &&
classDef.fields.find { it.type == "[B" } != null &&
// In YouTube, this field's type is 'Lcom/google/android/gms/potokens/PoToken;'.
// In YouTube Music, this class name is obfuscated.
classDef.fields.find { it.accessFlags == AccessFlags.PRIVATE.value && it.type.startsWith("L") } != null
},
)