From ebcf8eaf4df4cb9c3282b05bf46628916b46078d Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Tue, 18 Nov 2025 19:51:28 +0700 Subject: [PATCH] fix: support 307201+ Discord bumped React Native to 0.81.4 and script loader classes are now named differently. --- .../revenge/xposed/modules/HookScriptLoaderModule.kt | 5 ++++- .../github/revenge/xposed/modules/PayloadGlobalModule.kt | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/io/github/revenge/xposed/modules/HookScriptLoaderModule.kt b/app/src/main/kotlin/io/github/revenge/xposed/modules/HookScriptLoaderModule.kt index 9229a72..1e0d282 100644 --- a/app/src/main/kotlin/io/github/revenge/xposed/modules/HookScriptLoaderModule.kt +++ b/app/src/main/kotlin/io/github/revenge/xposed/modules/HookScriptLoaderModule.kt @@ -45,13 +45,14 @@ object HookScriptLoaderModule : Module() { mainScript = File(cacheDir, Constants.MAIN_SCRIPT_FILE).apply { asFile() } listOf( + "com.facebook.react.runtime.ReactInstance\$loadJSBundle$1", "com.facebook.react.runtime.ReactInstance$1", // TODO: Remove once Discord fully switches to Bridgeless "com.facebook.react.bridge.CatalystInstanceImpl" ).mapNotNull { classLoader.safeLoadClass(it) }.forEach { hook(it) } } - private fun hook(instance: Class<*>) { + private fun hook(instance: Class<*>) = runCatching { val loadScriptFromAssets = instance.method( "loadScriptFromAssets", AssetManager::class.java, String::class.java, Boolean::class.javaPrimitiveType ) @@ -73,6 +74,8 @@ object HookScriptLoaderModule : Module() { runCustomScripts(loadScriptFromFile, loadScriptFromAssets) } } + }.onFailure { + Log.e("Failed to hook script loading methods in ${instance.name}:", it) } private fun HookScope.runCustomScripts(loadScriptFromFile: Method, loadScriptFromAssets: Method) { diff --git a/app/src/main/kotlin/io/github/revenge/xposed/modules/PayloadGlobalModule.kt b/app/src/main/kotlin/io/github/revenge/xposed/modules/PayloadGlobalModule.kt index 86c549a..e6907fe 100644 --- a/app/src/main/kotlin/io/github/revenge/xposed/modules/PayloadGlobalModule.kt +++ b/app/src/main/kotlin/io/github/revenge/xposed/modules/PayloadGlobalModule.kt @@ -28,7 +28,8 @@ class PayloadGlobalModule(private val modules: List) : Module() { override fun onLoad(packageParam: XC_LoadPackage.LoadPackageParam) = with(packageParam) { val catalystInstance = classLoader.safeLoadClass("com.facebook.react.bridge.CatalystInstanceImpl") - val reactInstance = classLoader.safeLoadClass("com.facebook.react.runtime.ReactInstance$1") + val scriptLoader = classLoader.safeLoadClass("com.facebook.react.runtime.ReactInstance\$loadJSBundle$1") + ?: classLoader.safeLoadClass("com.facebook.react.runtime.ReactInstance$1") val setGlobalVariable: (XC_MethodHook.MethodHookParam, String, String) -> Unit = { param, key, json -> runCatching { @@ -43,7 +44,7 @@ class PayloadGlobalModule(private val modules: List) : Module() { writeText("this[${JSON.encodeToString(key)}]=$json") XposedBridge.invokeOriginalMethod( - reactInstance!!.method( + scriptLoader!!.method( "loadScriptFromFile", String::class.java, String::class.java, @@ -64,7 +65,7 @@ class PayloadGlobalModule(private val modules: List) : Module() { build() } - listOf(catalystInstance, reactInstance).forEach { if (it != null) hook(it, hook) } + listOf(catalystInstance, scriptLoader).forEach { if (it != null) hook(it, hook) } } private fun hook(instance: Class<*>, hook: XC_MethodHook) {