refact: include each signature in its corresponding patch

This commit is contained in:
oSumAtrIX 2022-04-14 08:49:11 +02:00
parent 36a2780ab1
commit 582ce70ce2
No known key found for this signature in database
GPG Key ID: A9B3094ACDB604B4
7 changed files with 155 additions and 166 deletions

View File

@ -1,11 +0,0 @@
package app.revanced.patches
import app.revanced.patcher.signature.MethodMetadata
import app.revanced.patcher.signature.PatcherMetadata
import app.revanced.patcher.signature.ResolverMethod
import app.revanced.patcher.signature.SignatureMetadata
val SHARED_METADATA = SignatureMetadata(
MethodMetadata(null, null, ""),
PatcherMetadata(ResolverMethod.Direct())
)

View File

@ -1,35 +1,99 @@
package app.revanced.patches.ad package app.revanced.patches.ad
import app.revanced.patcher.cache.Cache import app.revanced.patcher.PatcherData
import app.revanced.patcher.extensions.AccessFlagExtensions.Companion.or import app.revanced.patcher.extensions.AccessFlagExtensions.Companion.or
import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.* import app.revanced.patcher.patch.*
import app.revanced.patcher.signature.MethodMetadata
import app.revanced.patcher.signature.MethodSignature import app.revanced.patcher.signature.MethodSignature
import app.revanced.patcher.signature.MethodSignatureMetadata
import app.revanced.patcher.signature.PatternScanMethod
import app.revanced.patcher.smali.asInstructions import app.revanced.patcher.smali.asInstructions
import app.revanced.patches.SHARED_METADATA
import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
private val compatiblePackages = arrayOf("com.google.android.youtube")
class VideoAdsPatch : Patch( class VideoAdsPatch : Patch(
PatchMetadata( metadata = PatchMetadata(
"video-ads", shortName = "video-ads",
"TODO", name = "YouTube Video Ads Patch",
"TODO" description = "Patch to remove ads in the YouTube video player",
compatiblePackages = compatiblePackages,
version = "0.0.1"
),
signatures = listOf(
MethodSignature(
methodSignatureMetadata = MethodSignatureMetadata(
name = "show-video-ads-constructor",
methodMetadata = MethodMetadata(
definingClass = "zai",
name = "<init>",
),
patternScanMethod = PatternScanMethod.Fuzzy(2),// FIXME: Test this threshold and find the best value.
compatiblePackages = compatiblePackages,
description = """Signature for the constructor of some class.
This signature is being used to find another method in the parent class
and was discovered in the YouTube version v17.03.38""",
version = "0.0.1"
),
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
methodParameters = listOf("L", "L", "L"),
opcodes = listOf(
Opcode.INVOKE_DIRECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.CONST_4,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.CONST_4,
Opcode.IPUT_BOOLEAN,
Opcode.RETURN_VOID
)
)
) )
) { ) {
override fun execute(cache: Cache): PatchResult { override fun execute(patcherData: PatcherData): PatchResult {
val map = cache.methodMap["show-video-ads-constructor"].findParentMethod( val constructorSignature = signatures.first()
MethodSignature( var result = signatures.first().result
"show-video-ads-method", result ?: return PatchResultError(
SHARED_METADATA, "Could not resolve required signature ${constructorSignature.methodSignatureMetadata.name}"
"V", )
AccessFlags.PUBLIC or AccessFlags.FINAL,
listOf("Z"), val responsibleMethodSignature = MethodSignature(
null methodSignatureMetadata = MethodSignatureMetadata(
) name = "show-video-ads-method",
) ?: return PatchResultError("Could not find required method to patch") methodMetadata = MethodMetadata(
definingClass = "zai",
name = null // unknown
),
patternScanMethod = PatternScanMethod.Direct(),
compatiblePackages = compatiblePackages,
description = "Signature to find the method, which is responsible for showing the video ads",
version = "0.0.1"
),
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
methodParameters = listOf("Z"),
opcodes = null
)
result = result.findParentMethod(
responsibleMethodSignature
) ?: return PatchResultError(
"Could not find parent method with signature ${responsibleMethodSignature.methodSignatureMetadata.name}"
)
// Override the parameter by calling shouldShowAds and setting the parameter to the result // Override the parameter by calling shouldShowAds and setting the parameter to the result
map.method.implementation!!.addInstructions( result.method.implementation!!.addInstructions(
0, 0,
""" """
invoke-static { }, Lfi/vanced/libraries/youtube/whitelisting/Whitelist;->shouldShowAds()Z invoke-static { }, Lfi/vanced/libraries/youtube/whitelisting/Whitelist;->shouldShowAds()Z

View File

@ -1,39 +1,99 @@
package app.revanced.patches.misc package app.revanced.patches.misc
import app.revanced.patcher.cache.Cache import app.revanced.patcher.PatcherData
import app.revanced.patcher.extensions.AccessFlagExtensions.Companion.or import app.revanced.patcher.extensions.AccessFlagExtensions.Companion.or
import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.Patch import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.PatchMetadata
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patcher.signature.MethodMetadata
import app.revanced.patcher.signature.MethodSignature
import app.revanced.patcher.signature.MethodSignatureMetadata
import app.revanced.patcher.signature.PatternScanMethod
import app.revanced.patcher.smali.asInstructions import app.revanced.patcher.smali.asInstructions
import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.immutable.ImmutableMethod import org.jf.dexlib2.immutable.ImmutableMethod
import org.jf.dexlib2.immutable.ImmutableMethodImplementation import org.jf.dexlib2.immutable.ImmutableMethodImplementation
private val compatiblePackages = arrayOf("com.google.android.youtube")
class IntegrationsPatch : Patch( class IntegrationsPatch : Patch(
PatchMetadata( metadata = PatchMetadata(
"integrations", "integrations",
"TODO", "Inject integrations",
"TODO" "Applies mandatory patches to implement the ReVanced integrations into the application",
compatiblePackages,
"1.0.0"
),
signatures = listOf(
MethodSignature(
methodSignatureMetadata = MethodSignatureMetadata(
name = "integrations-patch",
methodMetadata = MethodMetadata(null, null), // unknown
patternScanMethod = PatternScanMethod.Fuzzy(2), // FIXME: Test this threshold and find the best value.
compatiblePackages = compatiblePackages,
description = "Inject the integrations into the application with the method of this signature",
version = "0.0.1"
),
returnType = "V",
accessFlags = AccessFlags.PUBLIC.value,
methodParameters = listOf(),
opcodes = listOf(
Opcode.SGET_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IGET_OBJECT,
Opcode.CONST_STRING,
Opcode.IF_NEZ,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.MOVE_OBJECT,
Opcode.CHECK_CAST,
Opcode.MOVE_OBJECT,
Opcode.CHECK_CAST,
Opcode.CONST_4,
Opcode.CONST_STRING,
Opcode.INVOKE_INTERFACE_RANGE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.SPUT_OBJECT,
Opcode.SGET_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
Opcode.INVOKE_VIRTUAL,
Opcode.INVOKE_SUPER,
Opcode.INVOKE_VIRTUAL
)
)
) )
) { ) {
override fun execute(cache: Cache): PatchResult { override fun execute(patcherData: PatcherData): PatchResult {
val map = cache.methodMap["integrations-patch"] val signature = signatures.first()
val implementation = map.method.implementation!! val result = signatures.first().result
result ?: return PatchResultError(
"Could not resolve required signature ${signature.methodSignatureMetadata.name}"
)
val implementation = result.method.implementation!!
val count = implementation.registerCount - 1 val count = implementation.registerCount - 1
implementation.addInstructions( implementation.addInstructions(
map.scanData.endIndex, result.scanData.endIndex,
""" """
invoke-static {v$count}, Lpl/jakubweg/StringRef;->setContext(Landroid/content/Context;)V invoke-static {v$count}, Lpl/jakubweg/StringRef;->setContext(Landroid/content/Context;)V
sput-object v$count, Lapp/revanced/integrations/Globals;->context:Landroid/content/Context; sput-object v$count, Lapp/revanced/integrations/Globals;->context:Landroid/content/Context;
""".trimIndent().asInstructions() """.trimIndent().asInstructions()
) )
val classDef = map.definingClassProxy.resolve() val classDef = result.definingClassProxy.resolve()
classDef.methods.add( classDef.methods.add(
ImmutableMethod( ImmutableMethod(
classDef.type, classDef.type,

View File

@ -5,9 +5,6 @@ import app.revanced.patches.ad.VideoAdsPatch
import app.revanced.patches.interaction.EnableSeekbarTappingPatch import app.revanced.patches.interaction.EnableSeekbarTappingPatch
import app.revanced.patches.layout.* import app.revanced.patches.layout.*
import app.revanced.patches.misc.IntegrationsPatch import app.revanced.patches.misc.IntegrationsPatch
import app.revanced.signatures.SignatureSupplier
import app.revanced.signatures.ad.VideoAdsSignature
import app.revanced.signatures.misc.IntegrationsSignature
/** /**
* Index contains all the patches and signatures. * Index contains all the patches and signatures.
@ -28,13 +25,4 @@ object Index {
::OldQualityLayoutPatch, ::OldQualityLayoutPatch,
::EnableSeekbarTappingPatch ::EnableSeekbarTappingPatch
) )
/**
* Array of signatures.
* New signatures should be added to the array.
*/
val signatures: Array<() -> SignatureSupplier> = arrayOf(
::IntegrationsSignature,
::VideoAdsSignature,
)
} }

View File

@ -1,7 +0,0 @@
package app.revanced.signatures
import app.revanced.patcher.signature.MethodSignature
interface SignatureSupplier {
fun get(): MethodSignature
}

View File

@ -1,45 +0,0 @@
package app.revanced.signatures.ad
import app.revanced.patcher.extensions.AccessFlagExtensions.Companion.or
import app.revanced.patcher.signature.*
import app.revanced.signatures.SignatureSupplier
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
class VideoAdsSignature : SignatureSupplier {
override fun get() = MethodSignature(
"show-video-ads-constructor",
SignatureMetadata(
method = MethodMetadata(
definingClass = "zai",
methodName = "<init>",
comment = "YouTube v17.03.38"
),
patcher = PatcherMetadata(
// FIXME: Test this threshold and find the best value.
resolverMethod = ResolverMethod.Fuzzy(2)
)
),
"V",
AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
listOf("L", "L", "L"),
listOf(
Opcode.INVOKE_DIRECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.CONST_4,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.CONST_4,
Opcode.IPUT_BOOLEAN,
Opcode.RETURN_VOID
)
)
}

View File

@ -1,60 +0,0 @@
package app.revanced.signatures.misc
import app.revanced.patcher.signature.*
import app.revanced.signatures.SignatureSupplier
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
class IntegrationsSignature : SignatureSupplier {
override fun get() = MethodSignature(
"integrations-patch",
SignatureMetadata(
method = MethodMetadata(
definingClass = "???", // TODO: Fill this in.
methodName = "???", // TODO: Fill this in.
comment = "YouTube v17.03.38"
),
patcher = PatcherMetadata(
// FIXME: Test this threshold and find the best value.
resolverMethod = ResolverMethod.Fuzzy(2)
)
),
"V",
AccessFlags.PUBLIC.value,
listOf(),
listOf(
Opcode.SGET_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IGET_OBJECT,
Opcode.CONST_STRING,
Opcode.IF_NEZ,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.MOVE_OBJECT,
Opcode.CHECK_CAST,
Opcode.MOVE_OBJECT,
Opcode.CHECK_CAST,
Opcode.CONST_4,
Opcode.CONST_STRING,
Opcode.INVOKE_INTERFACE_RANGE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.SPUT_OBJECT,
Opcode.SGET_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
Opcode.INVOKE_VIRTUAL,
Opcode.INVOKE_SUPER,
Opcode.INVOKE_VIRTUAL
)
)
}