mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-23 18:51:03 +00:00
Compare commits
4 Commits
v2.191.0-d
...
v2.191.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f2536814d | ||
|
|
99bc87909e | ||
|
|
928df2428d | ||
|
|
3e9e1e2577 |
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,3 +1,17 @@
|
|||||||
|
# [2.191.0-dev.24](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.23...v2.191.0-dev.24) (2023-09-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **Duolingo:** Remove `Unlock Duolingo Super` patch ([b4b9746](https://github.com/ReVanced/revanced-patches/commit/b4b9746361b5435b9d9429ad065e53364c51904a))
|
||||||
|
|
||||||
|
# [2.191.0-dev.23](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.22...v2.191.0-dev.23) (2023-09-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **SPB Serviceportal Bund:** Add `Remove root detection` patch ([#3049](https://github.com/ReVanced/revanced-patches/issues/3049)) ([481bf58](https://github.com/ReVanced/revanced-patches/commit/481bf583afbf954bef1c4e5349a62ea1c623115a))
|
||||||
|
|
||||||
# [2.191.0-dev.22](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.21...v2.191.0-dev.22) (2023-09-28)
|
# [2.191.0-dev.22](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.21...v2.191.0-dev.22) (2023-09-28)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
org.gradle.caching = true
|
org.gradle.caching = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 2.191.0-dev.22
|
version = 2.191.0-dev.24
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,62 +0,0 @@
|
|||||||
package app.revanced.patches.duolingo.unlocksuper
|
|
||||||
|
|
||||||
import app.revanced.extensions.exception
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
|
||||||
import app.revanced.patcher.patch.PatchException
|
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
|
||||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
|
||||||
import app.revanced.patches.duolingo.unlocksuper.fingerprints.IsUserSuperMethodFingerprint
|
|
||||||
import app.revanced.patches.duolingo.unlocksuper.fingerprints.UserSerializationMethodFingerprint
|
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
|
||||||
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction22c
|
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.Reference
|
|
||||||
|
|
||||||
@Patch(
|
|
||||||
name = "Unlock Duolingo Super",
|
|
||||||
compatiblePackages = [CompatiblePackage("com.duolingo")]
|
|
||||||
)
|
|
||||||
@Suppress("unused")
|
|
||||||
object UnlockDuolingoSuperPatch : BytecodePatch(
|
|
||||||
setOf(
|
|
||||||
UserSerializationMethodFingerprint,
|
|
||||||
IsUserSuperMethodFingerprint
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
/* First find the reference to the isUserSuper field, then patch the instruction that assigns it to false.
|
|
||||||
* This strategy is used because the method that sets the isUserSuper field is difficult to fingerprint reliably.
|
|
||||||
*/
|
|
||||||
override fun execute(context: BytecodeContext) {
|
|
||||||
// Find the reference to the isUserSuper field.
|
|
||||||
val isUserSuperReference = IsUserSuperMethodFingerprint
|
|
||||||
.result
|
|
||||||
?.mutableMethod
|
|
||||||
?.getInstructions()
|
|
||||||
?.filterIsInstance<BuilderInstruction22c>()
|
|
||||||
?.firstOrNull { it.opcode == Opcode.IGET_BOOLEAN }
|
|
||||||
?.reference
|
|
||||||
?: throw IsUserSuperMethodFingerprint.exception
|
|
||||||
|
|
||||||
// Patch the instruction that assigns isUserSuper to true.
|
|
||||||
UserSerializationMethodFingerprint
|
|
||||||
.result
|
|
||||||
?.mutableMethod
|
|
||||||
?.apply {
|
|
||||||
replaceInstructions(
|
|
||||||
indexOfReference(isUserSuperReference) - 1,
|
|
||||||
"const/4 v2, 0x1"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
?: throw UserSerializationMethodFingerprint.exception
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun MutableMethod.indexOfReference(reference: Reference) = getInstructions()
|
|
||||||
.indexOfFirst { it is BuilderInstruction22c && it.opcode == Opcode.IPUT_BOOLEAN && it.reference == reference }
|
|
||||||
.let {
|
|
||||||
if (it == -1) throw PatchException("Could not find index of instruction with supplied reference.")
|
|
||||||
else it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package app.revanced.patches.duolingo.unlocksuper.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
|
||||||
|
|
||||||
object IsUserSuperMethodFingerprint : MethodFingerprint(
|
|
||||||
returnType = "Ljava/lang/Object",
|
|
||||||
parameters = listOf("Ljava/lang/Object"),
|
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
|
||||||
strings = listOf("user"),
|
|
||||||
opcodes = listOf(Opcode.IGET_BOOLEAN),
|
|
||||||
)
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package app.revanced.patches.duolingo.unlocksuper.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
|
||||||
|
|
||||||
object UserSerializationMethodFingerprint : MethodFingerprint(
|
|
||||||
returnType = "V",
|
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
|
||||||
strings = listOf(
|
|
||||||
"betaStatus",
|
|
||||||
"coachOutfit",
|
|
||||||
"globalAmbassadorStatus",
|
|
||||||
),
|
|
||||||
opcodes = listOf(
|
|
||||||
Opcode.MOVE_FROM16,
|
|
||||||
Opcode.IPUT_BOOLEAN,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package app.revanced.patches.serviceportalbund.detection.root
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
|
import app.revanced.patches.serviceportalbund.detection.root.fingerprints.RootDetectionFingerprint
|
||||||
|
|
||||||
|
@Patch(
|
||||||
|
name = "Remove root detection",
|
||||||
|
description = "Removes the check for root permissions and unlocked bootloader.",
|
||||||
|
compatiblePackages = [CompatiblePackage("at.gv.bka.serviceportal")]
|
||||||
|
)
|
||||||
|
@Suppress("unused")
|
||||||
|
object RootDetectionPatch : BytecodePatch(
|
||||||
|
setOf(RootDetectionFingerprint)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext) =
|
||||||
|
RootDetectionFingerprint.result!!.mutableMethod.addInstruction(0, "return-void")
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package app.revanced.patches.serviceportalbund.detection.root.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
object RootDetectionFingerprint : MethodFingerprint(
|
||||||
|
"V",
|
||||||
|
accessFlags = AccessFlags.PUBLIC.value,
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
methodDef.definingClass.endsWith("/DeviceIntegrityCheck;")
|
||||||
|
}
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user