Fix cannot hook system framework bug and added zygote name in log

This commit is contained in:
2022-05-04 13:42:01 +08:00
parent ae94fdc767
commit 928df76727
5 changed files with 30 additions and 23 deletions

View File

@@ -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()

View File

@@ -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")
}
/**

View File

@@ -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]

View File

@@ -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"
}

View File

@@ -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) }
}