@@ -174,6 +174,8 @@ class BiliBiliPackage constructor(private val mClassLoader: ClassLoader, mContex
174
174
val liveRTCSourceServiceImplClass by Weak { mHookInfo.liveQuality.sourceService.class_ from mClassLoader }
175
175
val defaultRequestInterceptClass by Weak { mHookInfo.liveQuality.interceptor.class_ from mClassLoader }
176
176
val httpUrlClass by Weak { mHookInfo.okHttp.httpUrl.class_ from mClassLoader }
177
+ val preBuiltConfigClass by Weak { mHookInfo.preBuiltConfig.class_ from mClassLoader }
178
+ val dataSPClass by Weak { mHookInfo.dataSP.class_ from mClassLoader }
177
179
178
180
// for v8.17.0+
179
181
val useNewMossFunc = instance.viewMossClass?.declaredMethods?.any {
@@ -349,6 +351,11 @@ class BiliBiliPackage constructor(private val mClassLoader: ClassLoader, mContex
349
351
350
352
fun httpUrlParseMethod () = mHookInfo.okHttp.httpUrl.parse.orNull
351
353
354
+ fun getPreBuiltConfigMethod () = mHookInfo.preBuiltConfig.get.orNull
355
+
356
+ fun getDataSPMethod () = mHookInfo.dataSP.get.orNull
357
+
358
+
352
359
private fun readHookInfo (context : Context ): Configs .HookInfo {
353
360
try {
354
361
val hookInfoFile = File (context.cacheDir, Constant .HOOK_INFO_FILE_NAME )
@@ -793,21 +800,50 @@ class BiliBiliPackage constructor(private val mClassLoader: ClassLoader, mContex
793
800
}?.name ? : return @class_
794
801
}
795
802
themeName = themeName {
796
- val themeNameClassRegex = Regex (""" ^tv\.danmaku\.bili\.ui\.garb\.\w?$""" )
797
- val themeNameClass = classesList.filter {
798
- it.startsWith(" tv.danmaku.bili.ui.garb" ) && it.contains(themeNameClassRegex)
799
- }.map {
800
- it.findClass(classloader)
801
- }.firstOrNull { c ->
802
- c.declaredFields.count {
803
- Modifier .isStatic(it.modifiers) && it.type == Map ::class .java
804
- } == 1
805
- }
803
+ val mainGarbClass = dexHelper.findMethodUsingString(
804
+ " .garb.GARB_CHANGE" ,
805
+ false ,
806
+ - 1 ,
807
+ - 1 ,
808
+ null ,
809
+ - 1 ,
810
+ null ,
811
+ null ,
812
+ null ,
813
+ true
814
+ ).asSequence().mapNotNull {
815
+ dexHelper.decodeMethodIndex(it)?.declaringClass
816
+ }.firstOrNull() ? : return @themeName
817
+ val id2NameIndex = dexHelper.findMethodUsingString(
818
+ " white" ,
819
+ false ,
820
+ - 1 ,
821
+ 1 ,
822
+ null ,
823
+ dexHelper.encodeClassIndex(mainGarbClass),
824
+ null ,
825
+ null ,
826
+ null ,
827
+ true
828
+ ).asSequence().firstOrNull() ? : return @themeName
829
+ val themeNameClass = dexHelper.findMethodInvoking(
830
+ id2NameIndex,
831
+ dexHelper.encodeClassIndex(Map ::class .java),
832
+ 0 ,
833
+ null ,
834
+ - 1 ,
835
+ null ,
836
+ null ,
837
+ null ,
838
+ true
839
+ ).asSequence().mapNotNull {
840
+ dexHelper.decodeMethodIndex(it)?.declaringClass
841
+ }.firstOrNull() ? : return @themeName
806
842
class_ = class_ {
807
- name = themeNameClass? .name ? : return @class_
843
+ name = themeNameClass.name
808
844
}
809
845
field = field {
810
- name = themeNameClass? .declaredFields? .firstOrNull {
846
+ name = themeNameClass.declaredFields.firstOrNull {
811
847
it.type == Map ::class .java
812
848
&& Modifier .isStatic(it.modifiers)
813
849
}?.name ? : return @field
@@ -2225,7 +2261,55 @@ class BiliBiliPackage constructor(private val mClassLoader: ClassLoader, mContex
2225
2261
intercept = method { name = interceptMethod.name }
2226
2262
}
2227
2263
}
2228
-
2264
+ preBuiltConfig = preBuiltConfig {
2265
+ val getMap = dexHelper.findMethodUsingString(
2266
+ " /config.json" ,
2267
+ false ,
2268
+ - 1 ,
2269
+ - 1 ,
2270
+ null ,
2271
+ - 1 ,
2272
+ null ,
2273
+ null ,
2274
+ null ,
2275
+ true
2276
+ ).asSequence().mapNotNull { dexHelper.decodeMethodIndex(it) }.firstOrNull()
2277
+ ? : return @preBuiltConfig
2278
+ class_ = class_ { name = getMap.declaringClass.name }
2279
+ get = method { name = getMap.name }
2280
+ }
2281
+ dataSP = dataSP {
2282
+ val spxClass =
2283
+ (" com.bilibili.lib.blkv.SharedPrefX" from classloader) ? : return @dataSP
2284
+ val blkvClass = (" com.bilibili.lib.blkv.BLKV" from classloader) ? : return @dataSP
2285
+ val getBLSP = runCatchingOrNull {
2286
+ blkvClass.getDeclaredMethod(
2287
+ " getBLSharedPreferences" ,
2288
+ Context ::class .java,
2289
+ File ::class .java,
2290
+ Boolean ::class .javaPrimitiveType,
2291
+ Int ::class .javaPrimitiveType
2292
+ )
2293
+ } ? : return @dataSP
2294
+ val getDataSP = dexHelper.findMethodInvoked(
2295
+ dexHelper.encodeMethodIndex(getBLSP),
2296
+ dexHelper.encodeClassIndex(spxClass),
2297
+ - 1 ,
2298
+ null ,
2299
+ - 1 ,
2300
+ null ,
2301
+ null ,
2302
+ null ,
2303
+ false
2304
+ ).asSequence().mapNotNull {
2305
+ dexHelper.decodeMethodIndex(it)
2306
+ }.firstOrNull {
2307
+ Log .d(it)
2308
+ it.declaringClass.name.startsWith(" com.bilibili.lib.blconfig.internal.TypedContext" )
2309
+ } ? : return @dataSP
2310
+ class_ = class_ { name = getDataSP.declaringClass.name }
2311
+ get = method { name = getDataSP.name }
2312
+ }
2229
2313
dexHelper.close()
2230
2314
}
2231
2315
0 commit comments