From ce352914358e3812fe3a578b64858fad9035f817 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Fri, 20 Jan 2023 20:27:01 +0800 Subject: [PATCH] Fix invoke original member "Wrong number of arguments" problem when hooking or called original function --- .../hook/core/api/compat/HookCompatHelper.kt | 2 +- .../hook/core/api/helper/YukiHookHelper.kt | 26 +++++++++++++------ .../hook/core/finder/members/MethodFinder.kt | 4 +-- .../yukihookapi/hook/param/HookParam.kt | 4 ++- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/compat/HookCompatHelper.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/compat/HookCompatHelper.kt index 6a446de6..41647778 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/compat/HookCompatHelper.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/compat/HookCompatHelper.kt @@ -113,7 +113,7 @@ internal object HookCompatHelper { * @param args 参数实例 * @return [Any] or null */ - internal fun invokeOriginalMember(member: Member?, instance: Any?, vararg args: Any?): Any? { + internal fun invokeOriginalMember(member: Member?, instance: Any?, args: Array?): Any? { if (member == null) return null return when (HookApiCategoryHelper.currentCategory) { HookApiCategory.ROVO89_XPOSED -> XposedBridge.invokeOriginalMethod(member, instance, args) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/helper/YukiHookHelper.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/helper/YukiHookHelper.kt index 9fb28441..e5768513 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/helper/YukiHookHelper.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/helper/YukiHookHelper.kt @@ -76,6 +76,16 @@ internal object YukiHookHelper { } } + /** + * 获取当前 [Member] 是否被 Hook + * @param member 实例 + * @return [Boolean] + */ + internal fun isMemberHooked(member: Member?): Boolean { + if (member == null) return false + return HookApiCategoryHelper.hasAvailableHookApi && YukiHookCacheStore.hookedMembers.any { it.member.toString() == member.toString() } + } + /** * 执行原始 [Member] * @@ -83,15 +93,15 @@ internal object YukiHookHelper { * @param member 实例 * @param args 参数实例 * @return [Any] or null + * @throws IllegalStateException 如果 [Member] 参数个数不正确 */ - internal fun invokeOriginalMember(member: Member?, instance: Any?, vararg args: Any?) = - if (HookApiCategoryHelper.hasAvailableHookApi && YukiHookCacheStore.hookedMembers.any { it.member.toString() == member.toString() }) - member?.let { - runCatching { HookCompatHelper.invokeOriginalMember(member, instance, args) } - .onFailure { yLoggerE(msg = "Invoke original Member [$member] failed", e = it) } - .getOrNull() - } - else null + internal fun invokeOriginalMember(member: Member?, instance: Any?, args: Array?) = + if (isMemberHooked(member)) member?.let { + runCatching { HookCompatHelper.invokeOriginalMember(member, instance, args) }.onFailure { + if (it.message?.lowercase()?.contains("wrong number of arguments") == true) error(it.message ?: it.toString()) + yLoggerE(msg = "Invoke original Member [$member] failed", e = it) + }.getOrNull() + } else null /** * 使用当前 Hook API 自带的日志功能打印日志 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt index a2b0ab28..5c20f37a 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt @@ -702,8 +702,8 @@ class MethodFinder @PublishedApi internal constructor( * @return [Any] or null */ private fun baseCall(vararg param: Any?) = - if (isCallOriginal) - method?.let { YukiHookHelper.invokeOriginalMember(it, instance, *param) ?: it.invoke(instance, *param) } + if (isCallOriginal && YukiHookHelper.isMemberHooked(method)) + YukiHookHelper.invokeOriginalMember(method, instance, param) else method?.invoke(instance, *param) /** diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt index 060cf0d4..3110474e 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt @@ -87,6 +87,8 @@ class HookParam internal constructor( */ val args get() = param?.args ?: error("Current hooked Member args is null") + //val instanceOrNull? + /** * 获取当前 Hook 实例的对象 * @@ -231,7 +233,7 @@ class HookParam internal constructor( * @return [T] or null */ @JvmName(name = "invokeOriginal_Generics") - fun invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, param?.instance, *args) as T? + fun invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, param?.instance, args) as T? /** * 设置当前 Hook 对象方法的 [result] 返回值为 true