generated from ReVanced/revanced-patches-template
-
-
Notifications
You must be signed in to change notification settings - Fork 310
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Add
Check environment
patch (#3610)
Co-authored-by: LisoUseInAIKyrios <[email protected]> Co-authored-by: KobeW50 <[email protected]>
- Loading branch information
1 parent
04e1375
commit fbcbdaf
Showing
12 changed files
with
212 additions
and
2 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
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
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 |
---|---|---|
|
@@ -5,3 +5,5 @@ buildCache { | |
isEnabled = "CI" !in System.getenv() | ||
} | ||
} | ||
|
||
include(":stub") |
116 changes: 116 additions & 0 deletions
116
src/main/kotlin/app/revanced/patches/shared/misc/checks/BaseCheckEnvironmentPatch.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 |
---|---|---|
@@ -0,0 +1,116 @@ | ||
package app.revanced.patches.shared.misc.checks | ||
|
||
import android.os.Build.* | ||
import app.revanced.patcher.data.BytecodeContext | ||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions | ||
import app.revanced.patcher.fingerprint.MethodFingerprint | ||
import app.revanced.patcher.patch.BytecodePatch | ||
import app.revanced.patcher.util.proxy.mutableTypes.encodedValue.MutableEncodedValue | ||
import app.revanced.patcher.util.proxy.mutableTypes.encodedValue.MutableLongEncodedValue | ||
import app.revanced.patcher.util.proxy.mutableTypes.encodedValue.MutableStringEncodedValue | ||
import app.revanced.patches.all.misc.resources.AddResourcesPatch | ||
import app.revanced.patches.shared.misc.checks.fingerprints.PatchInfoBuildFingerprint | ||
import app.revanced.patches.shared.misc.checks.fingerprints.PatchInfoFingerprint | ||
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch | ||
import app.revanced.util.exception | ||
import app.revanced.util.resultOrThrow | ||
import com.android.tools.smali.dexlib2.immutable.value.ImmutableLongEncodedValue | ||
import com.android.tools.smali.dexlib2.immutable.value.ImmutableStringEncodedValue | ||
import java.nio.charset.StandardCharsets | ||
import java.security.MessageDigest | ||
import kotlin.io.encoding.Base64 | ||
import kotlin.io.encoding.ExperimentalEncodingApi | ||
|
||
abstract class BaseCheckEnvironmentPatch( | ||
private val mainActivityOnCreateFingerprint: MethodFingerprint, | ||
compatiblePackages: Set<CompatiblePackage>, | ||
integrationsPatch: BaseIntegrationsPatch, | ||
) : BytecodePatch( | ||
description = "Checks, if the application was patched by, otherwise warns the user.", | ||
compatiblePackages = compatiblePackages, | ||
dependencies = setOf( | ||
AddResourcesPatch::class, | ||
integrationsPatch::class, | ||
), | ||
fingerprints = setOf( | ||
PatchInfoFingerprint, | ||
PatchInfoBuildFingerprint, | ||
mainActivityOnCreateFingerprint, | ||
), | ||
) { | ||
override fun execute(context: BytecodeContext) { | ||
AddResourcesPatch(BaseCheckEnvironmentPatch::class) | ||
|
||
setPatchInfo() | ||
invokeCheck() | ||
} | ||
|
||
private fun setPatchInfo() { | ||
PatchInfoFingerprint.setClassFields( | ||
"PATCH_TIME" to System.currentTimeMillis().encoded, | ||
) | ||
|
||
fun setBuildInfo() { | ||
PatchInfoBuildFingerprint.setClassFields( | ||
"PATCH_BOARD" to BOARD.encodedAndHashed, | ||
"PATCH_BOOTLOADER" to BOOTLOADER.encodedAndHashed, | ||
"PATCH_BRAND" to BRAND.encodedAndHashed, | ||
"PATCH_CPU_ABI" to CPU_ABI.encodedAndHashed, | ||
"PATCH_CPU_ABI2" to CPU_ABI2.encodedAndHashed, | ||
"PATCH_DEVICE" to DEVICE.encodedAndHashed, | ||
"PATCH_DISPLAY" to DISPLAY.encodedAndHashed, | ||
"PATCH_FINGERPRINT" to FINGERPRINT.encodedAndHashed, | ||
"PATCH_HARDWARE" to HARDWARE.encodedAndHashed, | ||
"PATCH_HOST" to HOST.encodedAndHashed, | ||
"PATCH_ID" to ID.encodedAndHashed, | ||
"PATCH_MANUFACTURER" to MANUFACTURER.encodedAndHashed, | ||
"PATCH_MODEL" to MODEL.encodedAndHashed, | ||
"PATCH_ODM_SKU" to ODM_SKU.encodedAndHashed, | ||
"PATCH_PRODUCT" to PRODUCT.encodedAndHashed, | ||
"PATCH_RADIO" to RADIO.encodedAndHashed, | ||
"PATCH_SKU" to SKU.encodedAndHashed, | ||
"PATCH_SOC_MANUFACTURER" to SOC_MANUFACTURER.encodedAndHashed, | ||
"PATCH_SOC_MODEL" to SOC_MODEL.encodedAndHashed, | ||
"PATCH_TAGS" to TAGS.encodedAndHashed, | ||
"PATCH_TYPE" to TYPE.encodedAndHashed, | ||
"PATCH_USER" to USER.encodedAndHashed, | ||
) | ||
} | ||
|
||
try { | ||
Class.forName("android.os.Build") | ||
// This only works on Android, | ||
// because it uses Android APIs. | ||
setBuildInfo() | ||
} catch (_: ClassNotFoundException) { } | ||
} | ||
|
||
private fun invokeCheck() = mainActivityOnCreateFingerprint.result?.mutableMethod?.addInstructions( | ||
0, | ||
"invoke-static/range { p0 .. p0 },$INTEGRATIONS_CLASS_DESCRIPTOR->check(Landroid/app/Activity;)V", | ||
) ?: throw mainActivityOnCreateFingerprint.exception | ||
|
||
private companion object { | ||
private const val INTEGRATIONS_CLASS_DESCRIPTOR = | ||
"Lapp/revanced/integrations/shared/checks/CheckEnvironmentPatch;" | ||
|
||
@OptIn(ExperimentalEncodingApi::class) | ||
private val String.encodedAndHashed | ||
get() = MutableStringEncodedValue( | ||
ImmutableStringEncodedValue( | ||
Base64.encode(MessageDigest.getInstance("SHA-1") | ||
.digest(this.toByteArray(StandardCharsets.UTF_8))), | ||
), | ||
) | ||
|
||
private val Long.encoded get() = MutableLongEncodedValue(ImmutableLongEncodedValue(this)) | ||
|
||
private fun <T : MutableEncodedValue> MethodFingerprint.setClassFields(vararg fieldNameValues: Pair<String, T>) { | ||
val fieldNameValueMap = mapOf(*fieldNameValues) | ||
|
||
resultOrThrow().mutableClass.fields.forEach { field -> | ||
field.initialValue = fieldNameValueMap[field.name] ?: return@forEach | ||
} | ||
} | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
.../kotlin/app/revanced/patches/shared/misc/checks/fingerprints/PatchInfoBuildFingerprint.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 |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package app.revanced.patches.shared.misc.checks.fingerprints | ||
|
||
import app.revanced.patcher.fingerprint.MethodFingerprint | ||
|
||
internal object PatchInfoBuildFingerprint : MethodFingerprint( | ||
customFingerprint = { _, classDef -> classDef.type == "Lapp/revanced/integrations/shared/checks/PatchInfo\$Build;" }, | ||
) |
9 changes: 9 additions & 0 deletions
9
src/main/kotlin/app/revanced/patches/shared/misc/checks/fingerprints/PatchInfoFingerprint.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 |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package app.revanced.patches.shared.misc.checks.fingerprints | ||
|
||
import app.revanced.patcher.fingerprint.MethodFingerprint | ||
|
||
internal object PatchInfoFingerprint : MethodFingerprint( | ||
customFingerprint = { _, classDef -> | ||
classDef.type == "Lapp/revanced/integrations/shared/checks/PatchInfo;" | ||
}, | ||
) |
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
13 changes: 13 additions & 0 deletions
13
src/main/kotlin/app/revanced/patches/youtube/misc/check/CheckEnvironmentPatch.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 |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package app.revanced.patches.youtube.misc.check | ||
|
||
import app.revanced.patches.shared.misc.checks.BaseCheckEnvironmentPatch | ||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch | ||
import app.revanced.patches.youtube.shared.fingerprints.MainActivityOnCreateFingerprint | ||
|
||
@Suppress("unused") | ||
object CheckEnvironmentPatch : | ||
BaseCheckEnvironmentPatch( | ||
mainActivityOnCreateFingerprint = MainActivityOnCreateFingerprint, | ||
integrationsPatch = IntegrationsPatch, | ||
compatiblePackages = setOf(CompatiblePackage("com.google.android.youtube")), | ||
) |
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
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
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 |
---|---|---|
@@ -0,0 +1,10 @@ | ||
plugins { | ||
`java-library` | ||
} | ||
|
||
description = "Provide Android API stubs for ReVanced Patches." | ||
|
||
java { | ||
sourceCompatibility = JavaVersion.VERSION_11 | ||
targetCompatibility = JavaVersion.VERSION_11 | ||
} |
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 |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package android.os; | ||
|
||
public class Build { | ||
public static final String BOARD = null; | ||
public static final String BOOTLOADER = null; | ||
public static final String BRAND = null; | ||
public static final String CPU_ABI = null; | ||
public static final String CPU_ABI2 = null; | ||
public static final String DEVICE = null; | ||
public static final String DISPLAY = null; | ||
public static final String FINGERPRINT = null; | ||
public static final String HARDWARE = null; | ||
public static final String HOST = null; | ||
public static final String ID = null; | ||
public static final String MANUFACTURER = null; | ||
public static final String MODEL = null; | ||
public static final String ODM_SKU = null; | ||
public static final String PRODUCT = null; | ||
public static final String RADIO = null; | ||
public static final String SKU = null; | ||
public static final String SOC_MANUFACTURER = null; | ||
public static final String SOC_MODEL = null; | ||
public static final String TAGS = null; | ||
public static final String TYPE = null; | ||
public static final String USER = null; | ||
} |