Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit fa3146d

Browse files
amsyarasyiqmaisymoe
authored andcommitted
[Main] Alternative resources patching
1 parent 05ec9a9 commit fa3146d

File tree

2 files changed

+19
-60
lines changed

2 files changed

+19
-60
lines changed

app/src/main/java/com/vendetta/xposed/Main.kt

Lines changed: 19 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.vendetta.xposed
33
import android.content.Context
44
import android.graphics.Color
55
import android.content.res.AssetManager
6+
import android.content.res.Resources
67
import android.content.res.XModuleResources
78
import android.util.Log
89
import de.robv.android.xposed.IXposedHookLoadPackage
@@ -82,7 +83,7 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
8283
}
8384

8485
override fun handleInitPackageResources(resparam: XC_InitPackageResources.InitPackageResourcesParam) {
85-
if (resparam.packageName == "com.google.android.webview") return
86+
if (resparam.packageName.contains(".webview")) return
8687

8788
// rawColorMap is initialized during handleLoadPackage
8889
rawColorMap.forEach { (key, value) ->
@@ -95,11 +96,9 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
9596
}
9697

9798
override fun handleLoadPackage(param: XC_LoadPackage.LoadPackageParam) {
98-
if (param.packageName == "com.google.android.webview") return
99-
99+
if (param.packageName.contains(".webview")) return
100+
100101
val catalystInstanceImpl = param.classLoader.loadClass("com.facebook.react.bridge.CatalystInstanceImpl")
101-
val resourceDrawableIdHelper = param.classLoader.loadClass("com.facebook.react.views.imagehelper.ResourceDrawableIdHelper")
102-
val soundManagerModule = param.classLoader.loadClass("com.discord.sounds.SoundManagerModule")
103102
val themeManager = param.classLoader.loadClass("com.discord.theme.utils.ColorUtilsKt")
104103
val darkTheme = param.classLoader.loadClass("com.discord.theme.DarkTheme")
105104
val lightTheme = param.classLoader.loadClass("com.discord.theme.LightTheme")
@@ -118,23 +117,6 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
118117
Boolean::class.javaPrimitiveType
119118
).apply { isAccessible = true }
120119

121-
val getResourceDrawableId = resourceDrawableIdHelper.getDeclaredMethod(
122-
"getResourceDrawableId",
123-
Context::class.java,
124-
String::class.java
125-
).apply { isAccessible = true }
126-
127-
val mResourceDrawableIdMapField = resourceDrawableIdHelper.getDeclaredField("mResourceDrawableIdMap").apply {
128-
isAccessible = true
129-
}
130-
131-
val resolveRawResId = soundManagerModule.getDeclaredMethod(
132-
"resolveRawResId",
133-
Context::class.java,
134-
String::class.java,
135-
String::class.java
136-
).apply { isAccessible = true }
137-
138120
val cache = File(param.appInfo.dataDir, "cache").also { it.mkdirs() }
139121
val vendetta = File(cache, "vendetta.js")
140122
val etag = File(cache, "vendetta_etag.txt")
@@ -189,6 +171,7 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
189171
)
190172
XposedBridge.hookMethod(getColorCompat, object : XC_MethodHook() {
191173
override fun afterHookedMethod(param: MethodHookParam) {
174+
@Suppress("DEPRECATION")
192175
param.result = (param.args[0] as Context).resources.getColor(param.args[1] as Int)
193176
}
194177
})
@@ -244,45 +227,21 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPacka
244227

245228
XposedBridge.hookMethod(loadScriptFromAssets, patch)
246229
XposedBridge.hookMethod(loadScriptFromFile, patch)
247-
XposedBridge.hookMethod(getResourceDrawableId, object: XC_MethodHook() {
248-
@Suppress("UNCHECKED_CAST")
249-
override fun beforeHookedMethod(param: MethodHookParam) {
250-
val context = param.args[0] as Context
251-
val str = param.args[1] as String?
252-
val mResourceDrawableIdMap = mResourceDrawableIdMapField.get(param.thisObject) as HashMap<String, Int>
253-
if(str.isNullOrEmpty()) {
254-
param.result = 0; return
255-
}
256-
val replace = str.replace("-", "_")
257-
try {
258-
param.result = Integer.parseInt(replace); return
259-
} catch (e: Throwable) {
260-
synchronized(param.thisObject) {
261-
if(mResourceDrawableIdMap.containsKey(replace)) {
262-
param.result = mResourceDrawableIdMap[replace]!!.toInt()
263-
}
264230

265-
// Hardcode package name to fix resource loading when patched app has modified package name
266-
val identifier = context.resources.getIdentifier(replace, "drawable", "com.discord")
267-
mResourceDrawableIdMap[replace] = identifier
268-
param.result = identifier; return
269-
}
231+
// Fighting the side effects of changing the package name
232+
if (param.packageName != "com.discord") {
233+
val getIdentifier = Resources::class.java.getDeclaredMethod(
234+
"getIdentifier",
235+
String::class.java,
236+
String::class.java,
237+
String::class.java
238+
);
239+
240+
XposedBridge.hookMethod(getIdentifier, object: XC_MethodHook() {
241+
override fun beforeHookedMethod(mhparam: MethodHookParam) = with(mhparam) {
242+
if (args[2] == param.packageName) args[2] = "com.discord"
270243
}
271-
}
272-
})
273-
XposedBridge.hookMethod(resolveRawResId, object: XC_MethodHook() {
274-
override fun beforeHookedMethod(param: MethodHookParam) {
275-
val context = param.args[0] as Context
276-
val str = param.args[1] as String
277-
val str2 = param.args[2] as String
278-
279-
// Hardcode package name to fix resource loading when patched app has modified package name
280-
val identifier = context.resources.getIdentifier(str, str2, "com.discord")
281-
if(identifier > 0) {
282-
param.result = identifier; return
283-
}
284-
throw IllegalArgumentException("Trying to resolve unknown sound $str")
285-
}
286-
})
244+
})
245+
}
287246
}
288247
}

gradlew

100644100755
File mode changed.

0 commit comments

Comments
 (0)