feat(YouTube/Spoof streaming data): match with ReVanced

This commit is contained in:
inotia00 2024-09-15 18:38:19 +09:00
parent 2d6142bce8
commit 1ef8639a7a
2 changed files with 59 additions and 17 deletions

View File

@ -11,12 +11,13 @@ import app.revanced.patches.youtube.utils.compatibility.Constants
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildBrowseRequestFingerprint import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildBrowseRequestFingerprint
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildInitPlaybackRequestFingerprint import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildInitPlaybackRequestFingerprint
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildMediaDataSourceFingerprint import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildMediaDataSourceFingerprint
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildPlayerRequestURIFingerprint
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.CreateStreamingDataFingerprint import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.CreateStreamingDataFingerprint
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.NerdsStatsVideoFormatBuilderFingerprint import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.NerdsStatsVideoFormatBuilderFingerprint
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.ProtobufClassParseByteBufferFingerprint import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.ProtobufClassParseByteBufferFingerprint
import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH
import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.patches.youtube.video.videoid.VideoIdPatch import app.revanced.util.findOpcodeIndicesReversed
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.patch.BaseBytecodePatch
import app.revanced.util.resultOrThrow import app.revanced.util.resultOrThrow
@ -32,13 +33,13 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
dependencies = setOf( dependencies = setOf(
SettingsPatch::class, SettingsPatch::class,
SpoofUserAgentPatch::class, SpoofUserAgentPatch::class,
VideoIdPatch::class,
), ),
compatiblePackages = Constants.COMPATIBLE_PACKAGE, compatiblePackages = Constants.COMPATIBLE_PACKAGE,
fingerprints = setOf( fingerprints = setOf(
BuildBrowseRequestFingerprint, BuildBrowseRequestFingerprint,
BuildInitPlaybackRequestFingerprint, BuildInitPlaybackRequestFingerprint,
BuildMediaDataSourceFingerprint, BuildMediaDataSourceFingerprint,
BuildPlayerRequestURIFingerprint,
CreateStreamingDataFingerprint, CreateStreamingDataFingerprint,
ProtobufClassParseByteBufferFingerprint, ProtobufClassParseByteBufferFingerprint,
@ -51,6 +52,27 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
override fun execute(context: BytecodeContext) { override fun execute(context: BytecodeContext) {
// region Block /get_watch requests to fall back to /player requests.
BuildPlayerRequestURIFingerprint.resultOrThrow().let {
it.mutableMethod.apply {
val invokeToStringIndex =
BuildPlayerRequestURIFingerprint.indexOfToStringInstruction(this)
val uriRegister =
getInstruction<FiveRegisterInstruction>(invokeToStringIndex).registerC
addInstructions(
invokeToStringIndex,
"""
invoke-static { v$uriRegister }, $INTEGRATIONS_CLASS_DESCRIPTOR->blockGetWatchRequest(Landroid/net/Uri;)Landroid/net/Uri;
move-result-object v$uriRegister
""",
)
}
}
// endregion
// region Block /initplayback requests to fall back to /get_watch requests. // region Block /initplayback requests to fall back to /get_watch requests.
BuildInitPlaybackRequestFingerprint.resultOrThrow().let { BuildInitPlaybackRequestFingerprint.resultOrThrow().let {
@ -71,7 +93,7 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
// endregion // endregion
// region Copy request headers for streaming data fetch. // region Fetch replacement streams.
BuildBrowseRequestFingerprint.resultOrThrow().let { result -> BuildBrowseRequestFingerprint.resultOrThrow().let { result ->
result.mutableMethod.apply { result.mutableMethod.apply {
@ -89,7 +111,7 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
var smaliInstructions = var smaliInstructions =
"invoke-static { v$urlRegister, v$mapRegister }, " + "invoke-static { v$urlRegister, v$mapRegister }, " +
"$INTEGRATIONS_CLASS_DESCRIPTOR->" + "$INTEGRATIONS_CLASS_DESCRIPTOR->" +
"setFetchHeaders(Ljava/lang/String;Ljava/util/Map;)V" "fetchStreams(Ljava/lang/String;Ljava/util/Map;)V"
if (entrySetIndex < 0) smaliInstructions = """ if (entrySetIndex < 0) smaliInstructions = """
move-object/from16 v$mapRegister, p1 move-object/from16 v$mapRegister, p1
@ -160,6 +182,7 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
iget-object v$freeRegister, v$freeRegister, $getStreamingDataField iget-object v$freeRegister, v$freeRegister, $getStreamingDataField
if-eqz v0, :disabled if-eqz v0, :disabled
iput-object v$freeRegister, p0, $setStreamingDataField iput-object v$freeRegister, p0, $setStreamingDataField
""", """,
ExternalLabel("disabled", getInstruction(insertIndex)) ExternalLabel("disabled", getInstruction(insertIndex))
) )
@ -199,12 +222,8 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
// region Append spoof info. // region Append spoof info.
NerdsStatsVideoFormatBuilderFingerprint.resultOrThrow().mutableMethod.apply { NerdsStatsVideoFormatBuilderFingerprint.resultOrThrow().mutableMethod.apply {
for (index in implementation!!.instructions.size - 1 downTo 0) { findOpcodeIndicesReversed(Opcode.RETURN_OBJECT).forEach{ index ->
val instruction = getInstruction(index) val register = getInstruction<OneRegisterInstruction>(index).registerA
if (instruction.opcode != Opcode.RETURN_OBJECT)
continue
val register = (instruction as OneRegisterInstruction).registerA
addInstructions( addInstructions(
index, """ index, """
@ -217,9 +236,6 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
// endregion // endregion
// Prefetch streaming data.
VideoIdPatch.hookPlayerResponseVideoId("$INTEGRATIONS_CLASS_DESCRIPTOR->fetchStreamingData(Ljava/lang/String;Z)V")
/** /**
* Add settings * Add settings
*/ */

View File

@ -0,0 +1,26 @@
package app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildPlayerRequestURIFingerprint.indexOfToStringInstruction
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal object BuildPlayerRequestURIFingerprint : MethodFingerprint(
returnType = "Ljava/lang/String;",
strings = listOf(
"key",
"asig",
),
customFingerprint = { methodDef, _ ->
indexOfToStringInstruction(methodDef) >= 0
},
) {
fun indexOfToStringInstruction(methodDef: Method) =
methodDef.indexOfFirstInstruction {
opcode == Opcode.INVOKE_VIRTUAL &&
getReference<MethodReference>().toString() == "Landroid/net/Uri;->toString()Ljava/lang/String;"
}
}