From 928df767276a439f91c500ccf61c1cfcb0e55789 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Wed, 4 May 2022 13:42:01 +0800 Subject: [PATCH] Fix cannot hook system framework bug and added zygote name in log --- .../hook/core/YukiMemberHookCreater.kt | 4 +-- .../hook/core/YukiResourcesHookCreater.kt | 2 +- .../yukihookapi/hook/param/PackageParam.kt | 8 +++++ .../hook/param/wrapper/PackageParamWrapper.kt | 8 ++++- .../hook/xposed/bridge/YukiHookBridge.kt | 31 +++++++------------ 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt index 70b7f80d..0a4c484a 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt @@ -99,7 +99,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara * @return [MemberHookCreater.Result] */ inline fun injectMember(priority: Int = PRIORITY_DEFAULT, tag: String = "Default", initiate: MemberHookCreater.() -> Unit) = - MemberHookCreater(priority, tag, packageParam.packageName).apply(initiate).apply { preHookMembers.add(this) }.build() + MemberHookCreater(priority, tag, packageParam.exhibitName).apply(initiate).apply { preHookMembers.add(this) }.build() /** * Hook 执行入口 @@ -123,7 +123,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } isDisableCreaterRunHook.not() && hookClass.instance == null -> if (onHookClassNotFoundFailureCallback == null) - yLoggerE(msg = "[${packageParam.packageName}] HookClass [${hookClass.name}] not found", e = hookClass.throwable) + yLoggerE(msg = "[${packageParam.exhibitName}] HookClass [${hookClass.name}] not found", e = hookClass.throwable) else onHookClassNotFoundFailureCallback?.invoke(hookClass.throwable ?: Throwable("[${hookClass.name}] not found")) } }.start() diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreater.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreater.kt index 8230bcb8..bf03b790 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreater.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreater.kt @@ -226,7 +226,7 @@ class YukiResourcesHookCreater(private val packageParam: PackageParam, @Publishe * @param msg 调试日志内容 */ private fun onHookLogMsg(msg: String) { - if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = "[${packageParam.packageName}] $msg") + if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = "[${packageParam.exhibitName}] $msg") } /** diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt index 527ddccc..252846eb 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt @@ -55,6 +55,14 @@ import com.highcapable.yukihookapi.hook.xposed.prefs.YukiHookModulePrefs */ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper? = null) { + /** + * 用于展示的 APP 包名 + * @return [String] + */ + @PublishedApi + internal val exhibitName + get() = wrapper?.exhibitName ?: "unknown" + /** * 获取当前 Hook APP 的 [ClassLoader] * @return [ClassLoader] diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt index 73433846..d9e187bb 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt @@ -56,6 +56,12 @@ class PackageParamWrapper( var appResources: YukiResources? = null ) { + /** + * 用于展示的 APP 包名 + * @return [String] + */ + internal val exhibitName get() = if (type == HookEntryType.ZYGOTE) "android-zygote" else packageName + override fun toString() = - "PackageParamWrapper [type] $type [packageName] $packageName [processName] $processName [appInfo] $appInfo [appResources] $appResources" + "PackageParamWrapper [type] $type [packageName] $exhibitName [processName] $processName [appInfo] $appInfo [appResources] $appResources" } \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt index c4cc1fc1..c712660f 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt @@ -160,8 +160,8 @@ object YukiHookBridge { */ private fun assignWrapper( type: HookEntryType, - packageName: String, - processName: String = "", + packageName: String?, + processName: String? = "", appClassLoader: ClassLoader? = null, appInfo: ApplicationInfo? = null, appResources: YukiResources? = null @@ -169,16 +169,16 @@ object YukiHookBridge { if (packageParamWrappers[packageName] == null) PackageParamWrapper( type = type, - packageName = packageName, - processName = processName, + packageName = packageName ?: SYSTEM_FRAMEWORK_NAME, + processName = processName ?: SYSTEM_FRAMEWORK_NAME, appClassLoader = appClassLoader ?: XposedBridge.BOOTCLASSLOADER, appInfo = appInfo, appResources = appResources - ).also { packageParamWrappers[packageName] = it } + ).also { packageParamWrappers[packageName ?: SYSTEM_FRAMEWORK_NAME] = it } else packageParamWrappers[packageName]?.also { it.type = type - if (packageName.isNotBlank()) it.packageName = packageName - if (processName.isNotBlank()) it.processName = processName + if (packageName?.isNotBlank() == true) it.packageName = packageName + if (processName?.isNotBlank() == true) it.processName = processName if (appClassLoader != null) it.appClassLoader = appClassLoader if (appInfo != null) it.appInfo = appInfo if (appResources != null) it.appResources = appResources @@ -230,22 +230,15 @@ object YukiHookBridge { resparam: XC_InitPackageResources.InitPackageResourcesParam? = null ) { if (isMiuiCatcherPatch(packageName = lpparam?.packageName ?: resparam?.packageName).not()) when { - isZygoteLoaded -> { - if (isPackageLoaded(SYSTEM_FRAMEWORK_NAME, HookEntryType.ZYGOTE).not()) - assignWrapper(HookEntryType.ZYGOTE, SYSTEM_FRAMEWORK_NAME, SYSTEM_FRAMEWORK_NAME) + isZygoteLoaded -> assignWrapper(HookEntryType.ZYGOTE, SYSTEM_FRAMEWORK_NAME, SYSTEM_FRAMEWORK_NAME) + lpparam != null -> + if (isPackageLoaded(lpparam.packageName, HookEntryType.PACKAGE).not()) + assignWrapper(HookEntryType.PACKAGE, lpparam.packageName, lpparam.processName, lpparam.classLoader, lpparam.appInfo) else null - } - lpparam != null -> { - if (lpparam.packageName != null && lpparam.processName != null && lpparam.appInfo != null && lpparam.classLoader != null && - isPackageLoaded(lpparam.packageName, HookEntryType.PACKAGE).not() - ) assignWrapper(HookEntryType.PACKAGE, lpparam.packageName, lpparam.processName, lpparam.classLoader, lpparam.appInfo) - else null - } - resparam != null -> { + resparam != null -> if (isPackageLoaded(resparam.packageName, HookEntryType.RESOURCES).not()) assignWrapper(HookEntryType.RESOURCES, resparam.packageName, appResources = YukiResources.createFromXResources(resparam.res)) else null - } else -> null }?.let { YukiHookAPI.onXposedLoaded(it) } }