From 9a2a86d8b4d94f57ca291804d4b855ab327678ba Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Mon, 8 Aug 2022 01:18:47 +0800 Subject: [PATCH] Modify move package name to global host process name and set to current logger in LoggerFactory --- docs/api/public/YukiMemberHookCreater.md | 6 +++- docs/api/public/YukiResourcesHookCreater.md | 6 +++- .../highcapable/yukihookapi/YukiHookAPI.kt | 11 +++--- .../hook/core/YukiMemberHookCreater.kt | 21 ++++-------- .../hook/core/YukiResourcesHookCreater.kt | 13 ++----- .../hook/core/finder/FieldFinder.kt | 4 +-- .../hook/core/finder/base/BaseFinder.kt | 5 ++- .../yukihookapi/hook/log/LoggerFactory.kt | 34 +++++++++++++------ .../yukihookapi/hook/param/PackageParam.kt | 8 ----- .../hook/param/wrapper/PackageParamWrapper.kt | 8 +---- .../hook/xposed/bridge/YukiHookBridge.kt | 11 ++++++ 11 files changed, 65 insertions(+), 62 deletions(-) diff --git a/docs/api/public/YukiMemberHookCreater.md b/docs/api/public/YukiMemberHookCreater.md index e7737e5a..001eb1cb 100644 --- a/docs/api/public/YukiMemberHookCreater.md +++ b/docs/api/public/YukiMemberHookCreater.md @@ -133,7 +133,7 @@ injectMember(priority = PRIORITY_HIGHEST) { ### MemberHookCreater [class] ```kotlin -inner class MemberHookCreater internal constructor(private val priority: Int, internal val tag: String, internal val packageName: String) +inner class MemberHookCreater internal constructor(private val priority: Int, internal val tag: String) ``` **变更记录** @@ -148,6 +148,10 @@ inner class MemberHookCreater internal constructor(private val priority: Int, in 增加 `packageName` 当前 Hook 的 APP 包名 +`v1.0.93` `修改` + +移除 `packageName` + **功能描述** > Hook 核心功能实现类,查找和处理需要 Hook 的方法、构造方法。 diff --git a/docs/api/public/YukiResourcesHookCreater.md b/docs/api/public/YukiResourcesHookCreater.md index dbdd033c..637fc8de 100644 --- a/docs/api/public/YukiResourcesHookCreater.md +++ b/docs/api/public/YukiResourcesHookCreater.md @@ -51,13 +51,17 @@ injectResource(tag = "KuriharaYuki") { ### ResourcesHookCreater [class] ```kotlin -inner class ResourcesHookCreater internal constructor(private val tag: String, private val packageName: String) +inner class ResourcesHookCreater internal constructor(private val tag: String) ``` **变更记录** `v1.0.80` `新增` +`v1.0.93` `修改` + +移除 `packageName` + **功能描述** > Hook 核心功能实现类。 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt index 2fd31fc8..d3c54293 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt @@ -297,7 +297,7 @@ object YukiHookAPI { YukiHookBridge.packageParamCallback = { if (hooker.isNotEmpty()) hooker.forEach { it.assignInstance(packageParam = this) } - else yLoggerE(msg = "Failed to passing \"encase\" method because your hooker param is empty") + else yLoggerE(msg = "Failed to passing \"encase\" method because your hooker param is empty", isShowProcessName = false) } else printNoXposedEnvLog() } @@ -344,7 +344,7 @@ object YukiHookAPI { if (hooker.isNotEmpty()) { printSplashLog() hooker.forEach { it.assignInstance(packageParam = baseContext.packageParam) } - } else yLoggerE(msg = "Failed to passing \"encase\" method because your hooker param is empty")) + } else yLoggerE(msg = "Failed to passing \"encase\" method because your hooker param is empty", isShowProcessName = false)) else printNoXposedEnvLog() } @@ -352,11 +352,14 @@ object YukiHookAPI { private fun printSplashLog() { if (Configs.isDebug.not() || isShowSplashLogOnceTime.not()) return isShowSplashLogOnceTime = false - yLoggerI(msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using ${Status.executorName} API ${Status.executorVersion}") + yLoggerI( + msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using ${Status.executorName} API ${Status.executorVersion}", + isShowProcessName = false + ) } /** 输出找不到 [XposedBridge] 的错误日志 */ - private fun printNoXposedEnvLog() = yLoggerE(msg = "Could not found XposedBridge in current space! Aborted") + private fun printNoXposedEnvLog() = yLoggerE(msg = "Could not found XposedBridge in current space! Aborted", isShowProcessName = false) /** * 通过 baseContext 创建 Hook 入口类 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 969b2bc7..c05fdad7 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 @@ -102,7 +102,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.exhibitName).apply(initiate).apply { preHookMembers[toString()] = this }.build() + MemberHookCreater(priority, tag).apply(initiate).apply { preHookMembers[toString()] = this }.build() /** * Hook 执行入口 @@ -127,7 +127,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } isDisableCreaterRunHook.not() && hookClass.instance == null -> if (onHookClassNotFoundFailureCallback == null) - yLoggerE(msg = "[${packageParam.exhibitName}] HookClass [${hookClass.name}] not found", e = hookClass.throwable) + yLoggerE(msg = "HookClass [${hookClass.name}] not found", e = hookClass.throwable) else onHookClassNotFoundFailureCallback?.invoke(hookClass.throwable ?: Throwable("[${hookClass.name}] not found")) } }.start() @@ -159,11 +159,8 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara * 查找和处理需要 Hook 的方法、构造方法 * @param priority Hook 优先级 * @param tag 当前设置的标签 - * @param packageName 当前 Hook 的 APP 包名 */ - inner class MemberHookCreater @PublishedApi internal constructor( - private val priority: Int, internal val tag: String, internal val packageName: String - ) { + inner class MemberHookCreater @PublishedApi internal constructor(private val priority: Int, internal val tag: String) { /** Hook 结果实例 */ private var result: Result? = null @@ -493,7 +490,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara onHookingFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it) if (isNotIgnoredNoSuchMemberFailure) yLoggerE( - msg = "$hostTagName " + (if (isHookMemberSetup) + msg = (if (isHookMemberSetup) "Hooked Member with a finding error by $hookClass [$tag]" else "Hooked Member cannot be non-null by $hookClass [$tag]"), e = findingThrowable ?: it @@ -587,7 +584,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara * @param msg 调试日志内容 */ private fun onHookLogMsg(msg: String) { - if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = "$hostTagName $msg") + if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = msg) } /** @@ -596,7 +593,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara * @param member 异常 [Member] - 可空 */ private fun onHookFailureMsg(throwable: Throwable, member: Member? = null) = yLoggerE( - msg = "$hostTagName Try to hook [${hookClass.instance ?: hookClass.name}]${member?.let { "[$it]" } ?: ""} got an Exception [$tag]", + msg = "Try to hook [${hookClass.instance ?: hookClass.name}]${member?.let { "[$it]" } ?: ""} got an Exception [$tag]", e = throwable ) @@ -612,12 +609,6 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara */ internal val isNotIgnoredNoSuchMemberFailure get() = onNoSuchMemberFailureCallback == null && isNotIgnoredHookingFailure - /** - * 获取 Hook APP (宿主) 标签 - * @return [String] - */ - internal val hostTagName get() = if (packageParam.appUserId != 0) "[$packageName][${packageParam.appUserId}]" else "[$packageName]" - override fun toString() = "[tag] $tag [priority] $priority [class] $hookClass [members] $members" /** 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 045a7c3c..1a7b32a3 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 @@ -58,7 +58,7 @@ class YukiResourcesHookCreater(@PublishedApi internal val packageParam: PackageP * @return [ResourcesHookCreater.Result] */ inline fun injectResource(tag: String = "Default", initiate: ResourcesHookCreater.() -> Unit) = - ResourcesHookCreater(tag, packageParam.exhibitName).apply(initiate).apply { preHookResources[toString()] = this }.build() + ResourcesHookCreater(tag).apply(initiate).apply { preHookResources[toString()] = this }.build() /** * Hook 执行入口 @@ -78,9 +78,8 @@ class YukiResourcesHookCreater(@PublishedApi internal val packageParam: PackageP * * 查找和处理需要 Hook 的 Resources * @param tag 当前设置的标签 - * @param packageName 当前 Hook 的 APP 包名 */ - inner class ResourcesHookCreater @PublishedApi internal constructor(private val tag: String, private val packageName: String) { + inner class ResourcesHookCreater @PublishedApi internal constructor(private val tag: String) { /** 是否已经执行 Hook */ private var isHooked = false @@ -232,15 +231,9 @@ class YukiResourcesHookCreater(@PublishedApi internal val packageParam: PackageP * @param msg 调试日志内容 */ private fun onHookLogMsg(msg: String) { - if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = "$hostTagName $msg") + if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = msg) } - /** - * 获取 Hook APP (宿主) 标签 - * @return [String] - */ - private val hostTagName get() = if (packageParam.appUserId != 0) "[$packageName][${packageParam.appUserId}]" else "[$packageName]" - /** * Resources 查找条件实现类 */ diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt index 864cd214..55461768 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt @@ -197,8 +197,8 @@ class FieldFinder @PublishedApi internal constructor( if (classSet != null) { runBlocking { setInstance(result) - }.result { - memberInstances.takeIf { it.isNotEmpty() }?.forEach { onHookLogMsg(msg = "Find Field [$it] takes ${it}ms [${hookTag}]") } + }.result { ms -> + memberInstances.takeIf { it.isNotEmpty() }?.forEach { onHookLogMsg(msg = "Find Field [$it] takes ${ms}ms [${hookTag}]") } } Result() } else Result(isNoSuch = true, Throwable("classSet is null")) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.kt index 62a15287..64ae24b2 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.kt @@ -211,7 +211,7 @@ abstract class BaseFinder internal constructor( /** 存在日志时输出日志 */ internal fun printLogIfExist() { if (loggingContent != null) yLoggerE( - msg = "${hookInstance?.hostTagName?.let { "$it " } ?: ""}NoSuch$tag happend in [$classSet] ${loggingContent?.first} [${hookTag}]", + msg = "NoSuch$tag happend in [$classSet] ${loggingContent?.first} [${hookTag}]", e = loggingContent?.second ) /** 仅输出一次 - 然后清掉日志 */ @@ -223,8 +223,7 @@ abstract class BaseFinder internal constructor( * @param msg 调试日志内容 */ internal fun onHookLogMsg(msg: String) { - if (YukiHookAPI.Configs.isDebug && YukiHookBridge.hasXposedBridge) - hookInstance?.also { yLoggerI(msg = "${it.hostTagName} $msg") } ?: yLoggerI(msg = msg) + if (YukiHookAPI.Configs.isDebug && YukiHookBridge.hasXposedBridge) yLoggerI(msg = msg) } /** diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/log/LoggerFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/log/LoggerFactory.kt index 72334e1d..9c8fd236 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/log/LoggerFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/log/LoggerFactory.kt @@ -76,8 +76,9 @@ enum class LoggerType { * @param tag 日志打印的标签 * @param msg 日志打印的内容 * @param e 异常堆栈信息 + * @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log] */ -private fun baseLogger(format: String, type: LoggerType, tag: String, msg: String, e: Throwable? = null) { +private fun baseLogger(format: String, type: LoggerType, tag: String, msg: String, e: Throwable? = null, isShowProcessName: Boolean = true) { /** 打印到 [Log] */ fun loggerInLogd() = when (format) { "D" -> Log.d(tag, msg) @@ -89,8 +90,11 @@ private fun baseLogger(format: String, type: LoggerType, tag: String, msg: Strin /** 打印到 [XposedBridge.log] */ fun loggerInXposed() = runCatching { - XposedBridge.log("[$tag][$format]--> $msg") - e?.also { XposedBridge.log(it) } + YukiHookBridge.hostProcessName.also { + val appUserId = YukiHookBridge.findUserId(it) + XposedBridge.log("[$tag][$format]${if (isShowProcessName) (if (appUserId != 0) "[$it][$appUserId]" else "[$it]") else ""}--> $msg") + e?.also { e -> XposedBridge.log(e) } + } } when (type) { LoggerType.LOGD -> loggerInLogd() @@ -106,38 +110,46 @@ private fun baseLogger(format: String, type: LoggerType, tag: String, msg: Strin /** * [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - D * @param msg 日志打印的内容 + * @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log] * @param isDisableLog 禁止打印日志 - 标识后将什么也不做 - 默认为 false */ -internal fun yLoggerD(msg: String, isDisableLog: Boolean = false) { - if (YukiHookAPI.Configs.isAllowPrintingLogs) if (isDisableLog.not()) loggerD(msg = msg) +internal fun yLoggerD(msg: String, isShowProcessName: Boolean = true, isDisableLog: Boolean = false) { + if (YukiHookAPI.Configs.isAllowPrintingLogs.not() || isDisableLog) return + baseLogger(format = "D", LoggerType.BOTH, YukiHookAPI.Configs.debugTag, msg, isShowProcessName = isShowProcessName) } /** * [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - I * @param msg 日志打印的内容 + * @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log] * @param isDisableLog 禁止打印日志 - 标识后将什么也不做 - 默认为 false */ -internal fun yLoggerI(msg: String, isDisableLog: Boolean = false) { - if (YukiHookAPI.Configs.isAllowPrintingLogs) if (isDisableLog.not()) loggerI(msg = msg) +internal fun yLoggerI(msg: String, isShowProcessName: Boolean = true, isDisableLog: Boolean = false) { + if (YukiHookAPI.Configs.isAllowPrintingLogs.not() || isDisableLog) return + baseLogger(format = "I", LoggerType.BOTH, YukiHookAPI.Configs.debugTag, msg, isShowProcessName = isShowProcessName) } /** * [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - W * @param msg 日志打印的内容 + * @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log] * @param isDisableLog 禁止打印日志 - 标识后将什么也不做 - 默认为 false */ -internal fun yLoggerW(msg: String, isDisableLog: Boolean = false) { - if (YukiHookAPI.Configs.isAllowPrintingLogs) if (isDisableLog.not()) loggerW(msg = msg) +internal fun yLoggerW(msg: String, isShowProcessName: Boolean = true, isDisableLog: Boolean = false) { + if (YukiHookAPI.Configs.isAllowPrintingLogs.not() || isDisableLog) return + baseLogger(format = "W", LoggerType.BOTH, YukiHookAPI.Configs.debugTag, msg, isShowProcessName = isShowProcessName) } /** * [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - E * @param msg 日志打印的内容 * @param e 可填入异常堆栈信息 - 将自动完整打印到控制台 + * @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log] * @param isDisableLog 禁止打印日志 - 标识后将什么也不做 - 默认为 false */ -internal fun yLoggerE(msg: String, e: Throwable? = null, isDisableLog: Boolean = false) { - if (YukiHookAPI.Configs.isAllowPrintingLogs) if (isDisableLog.not()) loggerE(msg = msg, e = e) +internal fun yLoggerE(msg: String, e: Throwable? = null, isShowProcessName: Boolean = true, isDisableLog: Boolean = false) { + if (YukiHookAPI.Configs.isAllowPrintingLogs.not() || isDisableLog) return + baseLogger(format = "E", LoggerType.BOTH, YukiHookAPI.Configs.debugTag, msg, e, isShowProcessName) } /** 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 52396578..286a3055 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 @@ -61,14 +61,6 @@ import com.highcapable.yukihookapi.hook.xposed.prefs.YukiHookModulePrefs */ open class PackageParam internal constructor(@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 153b2251..4dc9003f 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,12 +56,6 @@ class PackageParamWrapper internal constructor( 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] $exhibitName [processName] $processName [appInfo] $appInfo [appResources] $appResources" + "PackageParamWrapper [type] $type [packageName] $packageName [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 3aa6e1e3..c170165e 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 @@ -60,6 +60,7 @@ import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiMemberReplacem import com.highcapable.yukihookapi.hook.xposed.bridge.inject.YukiHookBridge_Injector import com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiHookModuleStatus import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel +import com.highcapable.yukihookapi.hook.xposed.helper.YukiHookAppHelper import dalvik.system.PathClassLoader import de.robv.android.xposed.IXposedHookInitPackageResources import de.robv.android.xposed.IXposedHookLoadPackage @@ -88,6 +89,9 @@ object YukiHookBridge { /** [YukiHookDataChannel] 是否已经注册 */ private var isDataChannelRegister = false + /** 当前 Hook 进程是否正处于 [IXposedHookZygoteInit.initZygote] */ + private var isInitializingZygote = false + /** 已在 [PackageParam] 中被装载的 APP 包名 */ private val loadedPackageNames = HashSet() @@ -128,6 +132,12 @@ object YukiHookBridge { */ internal val moduleGeneratedVersion get() = YukiHookBridge_Injector.getModuleGeneratedVersion() + /** + * 当前宿主正在进行的 Hook 进程标识名称 + * @return [String] + */ + internal val hostProcessName get() = if (isInitializingZygote) "android-zygote" else YukiHookAppHelper.currentPackageName() ?: "unknown" + /** * 获取当前系统框架的 [Context] * @return [Context] ContextImpl 实例对象 @@ -235,6 +245,7 @@ object YukiHookBridge { appInfo: ApplicationInfo? = null, appResources: YukiResources? = null ) = run { + isInitializingZygote = type == HookEntryType.ZYGOTE if (packageParamWrappers[packageName] == null) if (type == HookEntryType.ZYGOTE || appClassLoader != null) PackageParamWrapper(