commit e4ebb324fbaa8da2d29c383cbbcb75e7290e051a
parent 6f97584622204b4484c74a84d8b3e2f65039a6b5
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Sat, 27 May 2023 19:43:52 +0200
feat: meo passcode bypass
Diffstat:
6 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/app/src/main/assets/lang/en_US.json b/app/src/main/assets/lang/en_US.json
@@ -53,7 +53,8 @@
"block_ads": "Block Ads",
"streak_expiration_info": "Show Streak Expiration Info",
"new_map_ui": "New Map UI",
- "use_download_manager": "Use Android Download Manager"
+ "use_download_manager": "Use Android Download Manager",
+ "meo_passcode_bypass": "My Eyes Only Passcode Bypass"
},
"option": {
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt b/app/src/main/kotlin/me/rhunk/snapenhance/config/ConfigProperty.kt
@@ -209,6 +209,12 @@ enum class ConfigProperty(
"description.use_download_manager",
ConfigCategory.EXPERIMENTAL,
ConfigStateValue(false)
+ ),
+ MEO_PASSCODE_BYPASS(
+ "property.meo_passcode_bypass",
+ "description.meo_passcode_bypass",
+ ConfigCategory.EXPERIMENTAL,
+ ConfigStateValue(false)
);
companion object {
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/MeoPasscodeBypass.kt b/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/MeoPasscodeBypass.kt
@@ -0,0 +1,21 @@
+package me.rhunk.snapenhance.features.impl
+
+import me.rhunk.snapenhance.config.ConfigProperty
+import me.rhunk.snapenhance.features.Feature
+import me.rhunk.snapenhance.features.FeatureLoadParams
+import me.rhunk.snapenhance.hook.HookStage
+import me.rhunk.snapenhance.hook.Hooker
+
+class MeoPasscodeBypass : Feature("Meo Passcode Bypass", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
+ override fun asyncOnActivityCreate() {
+ Hooker.hook(
+ context.mappings.getMappedClass("BCryptClass"),
+ context.mappings.getMappedValue("BCryptClassHashMethod"),
+ HookStage.BEFORE,
+ { context.config.bool(ConfigProperty.MEO_PASSCODE_BYPASS) },
+ ) { param ->
+ //set the hash to the result of the method
+ param.setResult(param.arg(1))
+ }
+ }
+}+
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/FeatureManager.kt
@@ -5,14 +5,15 @@ import me.rhunk.snapenhance.ModContext
import me.rhunk.snapenhance.features.Feature
import me.rhunk.snapenhance.features.FeatureLoadParams
import me.rhunk.snapenhance.features.impl.ConfigEnumKeys
+import me.rhunk.snapenhance.features.impl.MeoPasscodeBypass
import me.rhunk.snapenhance.features.impl.Messaging
import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload
import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader
import me.rhunk.snapenhance.features.impl.extras.AntiAutoSave
import me.rhunk.snapenhance.features.impl.extras.AutoSave
-import me.rhunk.snapenhance.features.impl.extras.MediaQualityLevelOverride
import me.rhunk.snapenhance.features.impl.extras.DisableVideoLengthRestriction
import me.rhunk.snapenhance.features.impl.extras.ExternalMediaAsSnap
+import me.rhunk.snapenhance.features.impl.extras.MediaQualityLevelOverride
import me.rhunk.snapenhance.features.impl.extras.Notifications
import me.rhunk.snapenhance.features.impl.extras.SnapchatPlus
import me.rhunk.snapenhance.features.impl.extras.UnlimitedSnapViewTime
@@ -70,6 +71,7 @@ class FeatureManager(private val context: ModContext) : Manager {
register(UnlimitedSnapViewTime::class)
register(DisableVideoLengthRestriction::class)
register(MediaQualityLevelOverride::class)
+ register(MeoPasscodeBypass::class)
initializeFeatures()
}
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt b/app/src/main/kotlin/me/rhunk/snapenhance/manager/impl/MappingManager.kt
@@ -12,6 +12,7 @@ import me.rhunk.snapenhance.ModContext
import me.rhunk.snapenhance.bridge.common.impl.file.BridgeFileType
import me.rhunk.snapenhance.manager.Manager
import me.rhunk.snapenhance.mapping.Mapper
+import me.rhunk.snapenhance.mapping.impl.BCryptClassMapper
import me.rhunk.snapenhance.mapping.impl.CallbackMapper
import me.rhunk.snapenhance.mapping.impl.EnumMapper
import me.rhunk.snapenhance.mapping.impl.GridMediaItemMapper
@@ -29,6 +30,7 @@ class MappingManager(private val context: ModContext) : Manager {
add(OperaPageViewControllerMapper())
add(PlusSubscriptionMapper())
add(GridMediaItemMapper())
+ add(BCryptClassMapper())
}
private val mappings = ConcurrentHashMap<String, Any>()
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/BCryptClassMapper.kt b/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/BCryptClassMapper.kt
@@ -0,0 +1,26 @@
+package me.rhunk.snapenhance.mapping.impl
+
+import me.rhunk.snapenhance.mapping.Mapper
+import java.lang.reflect.Modifier
+
+class BCryptClassMapper : Mapper() {
+ override fun useClasses(
+ classLoader: ClassLoader,
+ classes: List<Class<*>>,
+ mappings: MutableMap<String, Any>
+ ) {
+ for (clazz in classes) {
+ if (!Modifier.isFinal(clazz.modifiers)) continue
+ clazz.fields.firstOrNull { it.type == IntArray::class.java && Modifier.isStatic(it.modifiers)}?.let { field ->
+ val fieldData = field.get(null)
+ if (fieldData !is IntArray) return@let
+ if (fieldData.size != 18 || fieldData[0] != 608135816) return@let
+ mappings["BCryptClass"] = clazz.name
+ mappings["BCryptClassHashMethod"] = clazz.methods.first {
+ it.parameterTypes.size == 2 && it.returnType == String::class.java && it.parameterTypes[0] == String::class.java && it.parameterTypes[1] == String::class.java
+ }.name
+ return
+ }
+ }
+ }
+}+
\ No newline at end of file