feat: meo passcode bypass

This commit is contained in:
rhunk
2023-05-27 19:43:52 +02:00
parent 6f97584622
commit e4ebb324fb
6 changed files with 60 additions and 2 deletions

View File

@@ -53,7 +53,8 @@
"block_ads": "Block Ads", "block_ads": "Block Ads",
"streak_expiration_info": "Show Streak Expiration Info", "streak_expiration_info": "Show Streak Expiration Info",
"new_map_ui": "New Map UI", "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": { "option": {

View File

@@ -209,6 +209,12 @@ enum class ConfigProperty(
"description.use_download_manager", "description.use_download_manager",
ConfigCategory.EXPERIMENTAL, ConfigCategory.EXPERIMENTAL,
ConfigStateValue(false) ConfigStateValue(false)
),
MEO_PASSCODE_BYPASS(
"property.meo_passcode_bypass",
"description.meo_passcode_bypass",
ConfigCategory.EXPERIMENTAL,
ConfigStateValue(false)
); );
companion object { companion object {

View File

@@ -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))
}
}
}

View File

@@ -5,14 +5,15 @@ import me.rhunk.snapenhance.ModContext
import me.rhunk.snapenhance.features.Feature import me.rhunk.snapenhance.features.Feature
import me.rhunk.snapenhance.features.FeatureLoadParams import me.rhunk.snapenhance.features.FeatureLoadParams
import me.rhunk.snapenhance.features.impl.ConfigEnumKeys 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.Messaging
import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload import me.rhunk.snapenhance.features.impl.downloader.AntiAutoDownload
import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader import me.rhunk.snapenhance.features.impl.downloader.MediaDownloader
import me.rhunk.snapenhance.features.impl.extras.AntiAutoSave import me.rhunk.snapenhance.features.impl.extras.AntiAutoSave
import me.rhunk.snapenhance.features.impl.extras.AutoSave 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.DisableVideoLengthRestriction
import me.rhunk.snapenhance.features.impl.extras.ExternalMediaAsSnap 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.Notifications
import me.rhunk.snapenhance.features.impl.extras.SnapchatPlus import me.rhunk.snapenhance.features.impl.extras.SnapchatPlus
import me.rhunk.snapenhance.features.impl.extras.UnlimitedSnapViewTime import me.rhunk.snapenhance.features.impl.extras.UnlimitedSnapViewTime
@@ -70,6 +71,7 @@ class FeatureManager(private val context: ModContext) : Manager {
register(UnlimitedSnapViewTime::class) register(UnlimitedSnapViewTime::class)
register(DisableVideoLengthRestriction::class) register(DisableVideoLengthRestriction::class)
register(MediaQualityLevelOverride::class) register(MediaQualityLevelOverride::class)
register(MeoPasscodeBypass::class)
initializeFeatures() initializeFeatures()
} }

View File

@@ -12,6 +12,7 @@ import me.rhunk.snapenhance.ModContext
import me.rhunk.snapenhance.bridge.common.impl.file.BridgeFileType import me.rhunk.snapenhance.bridge.common.impl.file.BridgeFileType
import me.rhunk.snapenhance.manager.Manager import me.rhunk.snapenhance.manager.Manager
import me.rhunk.snapenhance.mapping.Mapper 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.CallbackMapper
import me.rhunk.snapenhance.mapping.impl.EnumMapper import me.rhunk.snapenhance.mapping.impl.EnumMapper
import me.rhunk.snapenhance.mapping.impl.GridMediaItemMapper import me.rhunk.snapenhance.mapping.impl.GridMediaItemMapper
@@ -29,6 +30,7 @@ class MappingManager(private val context: ModContext) : Manager {
add(OperaPageViewControllerMapper()) add(OperaPageViewControllerMapper())
add(PlusSubscriptionMapper()) add(PlusSubscriptionMapper())
add(GridMediaItemMapper()) add(GridMediaItemMapper())
add(BCryptClassMapper())
} }
private val mappings = ConcurrentHashMap<String, Any>() private val mappings = ConcurrentHashMap<String, Any>()

View File

@@ -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
}
}
}
}