From 8a2abce4d3aa67c0db0e023a606c8e0424394c11 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Sun, 7 Aug 2022 01:08:32 +0800 Subject: [PATCH] Modify throwable function to throwToApp in HookParam --- docs/api/public/HookParam.md | 51 ++++++++++++++----- .../yukihookapi/hook/param/HookParam.kt | 44 ++++++++-------- .../hook/param/wrapper/HookParamWrapper.kt | 6 --- 3 files changed, 60 insertions(+), 41 deletions(-) diff --git a/docs/api/public/HookParam.md b/docs/api/public/HookParam.md index 4da33cc9..d44bc446 100644 --- a/docs/api/public/HookParam.md +++ b/docs/api/public/HookParam.md @@ -137,7 +137,7 @@ var result: Any? ### hasThrowable [field] ```kotlin -var hasThrowable: Boolean +val hasThrowable: Boolean ``` **变更记录** @@ -151,7 +151,7 @@ var hasThrowable: Boolean ### throwable [field] ```kotlin -var throwable: Throwable? +val throwable: Throwable? ``` **变更记录** @@ -160,27 +160,50 @@ var throwable: Throwable? **功能描述** -> 获取、设置方法调用抛出的异常。 +> 获取设置的方法调用抛出异常。 + +### throwToApp [method] + +```kotlin +fun Throwable.throwToApp() +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 向 Hook APP 抛出异常。 + +使用 `hasThrowable` 判断当前是否存在被抛出的异常。 + +使用 `throwable` 获取当前设置的方法调用抛出异常。 仅会在回调方法的 `MemberHookCreater.beforeHook` or `MemberHookCreater.afterHook` 中生效。 -你可以使用 `hasThrowable` 判断当前是否存在被抛出的异常。 +!> 设置后会同时执行 `resultNull` 方法并将异常抛出给当前 Hook APP。 -!> 设置后会同时执行 `resultNull` 方法并将异常抛出给当前宿主 APP。 +**功能示例** -### resultOrThrowable [field] +Hook 过程中的异常仅会作用于 (Xposed) 宿主环境,目标 Hook APP 不会受到影响。 + +若想将异常抛给 Hook APP,可以直接使用如下方法。 + +> 示例如下 ```kotlin -var resultOrThrowable: Any? +injectMember { + method { + // ... + } + beforeHook { + RuntimeException("Test Exception").throwToApp() + } +} ``` -**变更记录** - -`v1.0.93` `新增` - -**功能描述** - -> 获取 `result` 或 `throwable`,存在 `throwable` 时优先返回。 +!> 向 Hook APP 抛出异常**会对其暴露被 Hook 的事实**,是不安全的,容易被检测,请按实际场景合理使用。 ### result [method] 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 c02582b7..6ccbd1c8 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 @@ -31,6 +31,7 @@ package com.highcapable.yukihookapi.hook.param import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater.MemberHookCreater +import com.highcapable.yukihookapi.hook.log.yLoggerE import com.highcapable.yukihookapi.hook.param.wrapper.HookParamWrapper import java.lang.reflect.Constructor import java.lang.reflect.Member @@ -90,23 +91,23 @@ class HookParam internal constructor(private val createrInstance: YukiMemberHook * * 在不确定 [Member] 类型为 [Method] 或 [Constructor] 时可以使用此方法 * @return [Member] - * @throws IllegalStateException 如果 [Member] 为空 + * @throws IllegalStateException 如果 [member] 为空 */ - val member get() = wrapper?.member ?: error("Current hook Member is null") + val member get() = wrapper?.member ?: error("Current hooked Member is null") /** * 获取当前 Hook 对象的方法 * @return [Method] - * @throws IllegalStateException 如果 [Method] 为空或方法类型不是 [Method] + * @throws IllegalStateException 如果 [member] 类型不是 [Method] */ - val method get() = wrapper?.member as? Method? ?: error("Current hook Method type is wrong or null") + val method get() = member as? Method? ?: error("Current hooked Member is not a Method") /** * 获取当前 Hook 对象的构造方法 * @return [Constructor] - * @throws IllegalStateException 如果 [Constructor] 为空或方法类型不是 [Constructor] + * @throws IllegalStateException 如果 [member] 类型不是 [Constructor] */ - val constructor get() = wrapper?.member as? Constructor<*>? ?: error("Current hook Constructor type is wrong or null") + val constructor get() = member as? Constructor<*>? ?: error("Current hooked Member is not a Constructor") /** * 获取、设置当前 Hook 对象的 [method] or [constructor] 的返回值 @@ -125,27 +126,28 @@ class HookParam internal constructor(private val createrInstance: YukiMemberHook val hasThrowable get() = wrapper?.hasThrowable /** - * 获取、设置方法调用抛出的异常 + * 获取设置的方法调用抛出异常 + * @return [Throwable] or null + */ + val throwable get() = wrapper?.throwable + + /** + * 向 Hook APP 抛出异常 * - * 仅会在回调方法的 [MemberHookCreater.beforeHook] or [MemberHookCreater.afterHook] 中生效 + * 使用 [hasThrowable] 判断当前是否存在被抛出的异常 * - * 你可以使用 [hasThrowable] 判断当前是否存在被抛出的异常 + * 使用 [throwable] 获取当前设置的方法调用抛出异常 * - * - ❗设置后会同时执行 [resultNull] 方法并将异常抛出给当前宿主 APP + * - 仅会在回调方法的 [MemberHookCreater.beforeHook] or [MemberHookCreater.afterHook] 中生效 + * + * - ❗设置后会同时执行 [resultNull] 方法并将异常抛出给当前 Hook APP * @return [Throwable] or null * @throws Throwable */ - var throwable: Throwable? - get() = wrapper?.throwable - set(value) { - wrapper?.throwable = value - } - - /** - * 获取 [result] 或 [throwable] - 存在 [throwable] 时优先返回 - * @return [Any] or [Throwable] or null - */ - val resultOrThrowable get() = wrapper?.resultOrThrowable + fun Throwable.throwToApp() { + wrapper?.throwable = this + yLoggerE(msg = message ?: "$this", e = this) + } /** * 获取当前 Hook 对象的 [method] or [constructor] 的返回值 [T] diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/HookParamWrapper.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/HookParamWrapper.kt index 2f28228b..5aaf2885 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/HookParamWrapper.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/HookParamWrapper.kt @@ -97,12 +97,6 @@ class HookParamWrapper internal constructor(private var baseParam: XC_MethodHook baseParam?.throwable = value } - /** - * 获取 [result] 或 [throwable] - 存在 [throwable] 时优先返回 - * @return [Any] or null - */ - val resultOrThrowable get() = baseParam?.resultOrThrowable - /** * 设置方法参数 * @param index 数组下标