forked from ReVanced/revanced-patches
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(YouTube - Client spoof): Spoof all user agents
- Loading branch information
Showing
3 changed files
with
74 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
102 changes: 69 additions & 33 deletions
102
src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/ClientSpoofPatch.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,51 +1,87 @@ | ||
package app.revanced.patches.youtube.misc.fix.playback | ||
|
||
import app.revanced.util.exception | ||
import app.revanced.patcher.data.BytecodeContext | ||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction | ||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction | ||
import app.revanced.patcher.patch.BytecodePatch | ||
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.youtube.misc.fix.playback.fingerprints.UserAgentHeaderBuilderFingerprint | ||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction | ||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod | ||
import app.revanced.patches.all.misc.transformation.BaseTransformInstructionsPatch | ||
import app.revanced.patches.all.misc.transformation.IMethodCall | ||
import app.revanced.patches.all.misc.transformation.Instruction35cInfo | ||
import app.revanced.patches.all.misc.transformation.filterMapInstruction35c | ||
import app.revanced.util.getReference | ||
import com.android.tools.smali.dexlib2.iface.ClassDef | ||
import com.android.tools.smali.dexlib2.iface.Method | ||
import com.android.tools.smali.dexlib2.iface.instruction.Instruction | ||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction | ||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference | ||
|
||
@Patch( | ||
name = "Client spoof", | ||
description = "Adds options to spoof the client to allow video playback.", | ||
dependencies = [SpoofSignaturePatch::class], | ||
compatiblePackages = [ | ||
CompatiblePackage( | ||
"com.google.android.youtube", [ | ||
"18.48.39", | ||
"18.49.37", | ||
"19.01.34", | ||
"19.02.39", | ||
"19.03.36", | ||
"19.04.38", | ||
"19.05.36", | ||
"19.06.39", | ||
"19.07.40", | ||
"19.08.36", | ||
"19.09.37" | ||
] | ||
) | ||
] | ||
CompatiblePackage("com.google.android.youtube"), | ||
], | ||
) | ||
object ClientSpoofPatch : BytecodePatch( | ||
setOf(UserAgentHeaderBuilderFingerprint) | ||
) { | ||
object ClientSpoofPatch : BaseTransformInstructionsPatch<Instruction35cInfo>() { | ||
private const val ORIGINAL_PACKAGE_NAME = "com.google.android.youtube" | ||
private const val USER_AGENT_STRING_BUILDER_APPEND_METHOD_REFERENCE = | ||
"Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;" | ||
|
||
override fun execute(context: BytecodeContext) { | ||
UserAgentHeaderBuilderFingerprint.result?.let { result -> | ||
val insertIndex = result.scanResult.patternScanResult!!.endIndex | ||
result.mutableMethod.apply { | ||
val packageNameRegister = getInstruction<FiveRegisterInstruction>(insertIndex).registerD | ||
override fun filterMap( | ||
classDef: ClassDef, | ||
method: Method, | ||
instruction: Instruction, | ||
instructionIndex: Int, | ||
) = filterMapInstruction35c<MethodCall>( | ||
"Lapp/revanced/integrations", | ||
classDef, | ||
instruction, | ||
instructionIndex, | ||
) | ||
|
||
addInstruction(insertIndex, "const-string v$packageNameRegister, \"$ORIGINAL_PACKAGE_NAME\"") | ||
} | ||
override fun transform(mutableMethod: MutableMethod, entry: Instruction35cInfo) { | ||
val (_, _, instructionIndex) = entry | ||
|
||
} ?: throw UserAgentHeaderBuilderFingerprint.exception | ||
// Replace the result of context.getPackageName(), if it is used in a user agent string. | ||
mutableMethod.apply { | ||
// After context.getPackageName() the result is moved to a register. | ||
val targetRegister = ( | ||
getInstruction(instructionIndex + 1) | ||
as? OneRegisterInstruction ?: return | ||
).registerA | ||
|
||
// IndexOutOfBoundsException is not possible here, | ||
// but no such occurrences are present in the app. | ||
val referee = getInstruction(instructionIndex + 2).getReference<MethodReference>()?.toString() | ||
|
||
// This can technically also match non-user agent string builder append methods, | ||
// but no such occurrences are present in the app. | ||
if (referee != USER_AGENT_STRING_BUILDER_APPEND_METHOD_REFERENCE) { | ||
return | ||
} | ||
|
||
// Overwrite the result of context.getPackageName() with the original package name. | ||
replaceInstruction( | ||
instructionIndex + 1, | ||
"const-string v$targetRegister, \"${ORIGINAL_PACKAGE_NAME}\"", | ||
) | ||
} | ||
} | ||
|
||
@Suppress("unused") | ||
private enum class MethodCall( | ||
override val definedClassName: String, | ||
override val methodName: String, | ||
override val methodParams: Array<String>, | ||
override val returnType: String, | ||
) : IMethodCall { | ||
GetPackageName( | ||
"Landroid/content/Context;", | ||
"getPackageName", | ||
emptyArray(), | ||
"Ljava/lang/String;", | ||
), | ||
} | ||
} |
10 changes: 0 additions & 10 deletions
10
...anced/patches/youtube/misc/fix/playback/fingerprints/UserAgentHeaderBuilderFingerprint.kt
This file was deleted.
Oops, something went wrong.