From 113cb05e91040771adf5e6f84809e20872c9c31c 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. --- .../cocobo1/pupu/xposed/modules/HookScriptLoaderModule.kt | 5 ++++- .../cocobo1/pupu/xposed/modules/PayloadGlobalModule.kt | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/cocobo1/pupu/xposed/modules/HookScriptLoaderModule.kt b/app/src/main/kotlin/cocobo1/pupu/xposed/modules/HookScriptLoaderModule.kt index ac580f1..8d780f3 100644 --- a/app/src/main/kotlin/cocobo1/pupu/xposed/modules/HookScriptLoaderModule.kt +++ b/app/src/main/kotlin/cocobo1/pupu/xposed/modules/HookScriptLoaderModule.kt @@ -47,6 +47,7 @@ class 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" @@ -54,7 +55,7 @@ class HookScriptLoaderModule : Module() { .forEach { hook(it) } } - private fun hook(instance: Class<*>) { + private fun hook(instance: Class<*>) = runCatching { val loadScriptFromAssets = instance.method( "loadScriptFromAssets", AssetManager::class.java, @@ -82,6 +83,8 @@ class 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/cocobo1/pupu/xposed/modules/PayloadGlobalModule.kt b/app/src/main/kotlin/cocobo1/pupu/xposed/modules/PayloadGlobalModule.kt index 48f3cab..b42d8e3 100644 --- a/app/src/main/kotlin/cocobo1/pupu/xposed/modules/PayloadGlobalModule.kt +++ b/app/src/main/kotlin/cocobo1/pupu/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) {