Modify throwable function to throwToApp in HookParam

This commit is contained in:
2022-08-07 01:08:32 +08:00
parent cc823f3408
commit 8a2abce4d3
3 changed files with 60 additions and 41 deletions

View File

@@ -137,7 +137,7 @@ var result: Any?
### hasThrowable [field] ### hasThrowable [field]
```kotlin ```kotlin
var hasThrowable: Boolean val hasThrowable: Boolean
``` ```
**变更记录** **变更记录**
@@ -151,7 +151,7 @@ var hasThrowable: Boolean
### throwable [field] ### throwable [field]
```kotlin ```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` 中生效。 仅会在回调方法的 `MemberHookCreater.beforeHook` or `MemberHookCreater.afterHook` 中生效。
你可以使用 `hasThrowable` 判断当前是否存在被抛出的异常 !> 设置后会同时执行 `resultNull` 方法并将异常抛出给当前 Hook APP
!> 设置后会同时执行 `resultNull` 方法并将异常抛出给当前宿主 APP。 **功能示例**
### resultOrThrowable [field] Hook 过程中的异常仅会作用于 (Xposed) 宿主环境,目标 Hook APP 不会受到影响。
若想将异常抛给 Hook APP可以直接使用如下方法。
> 示例如下
```kotlin ```kotlin
var resultOrThrowable: Any? injectMember {
method {
// ...
}
beforeHook {
RuntimeException("Test Exception").throwToApp()
}
}
``` ```
**变更记录** !> 向 Hook APP 抛出异常<u>**会对其暴露被 Hook 的事实**</u>,是不安全的,容易被检测,请按实际场景合理使用。
`v1.0.93` `新增`
**功能描述**
> 获取 `result` 或 `throwable`,存在 `throwable` 时优先返回。
### result [method] ### result [method]

View File

@@ -31,6 +31,7 @@ package com.highcapable.yukihookapi.hook.param
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater.MemberHookCreater import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater.MemberHookCreater
import com.highcapable.yukihookapi.hook.log.yLoggerE
import com.highcapable.yukihookapi.hook.param.wrapper.HookParamWrapper import com.highcapable.yukihookapi.hook.param.wrapper.HookParamWrapper
import java.lang.reflect.Constructor import java.lang.reflect.Constructor
import java.lang.reflect.Member import java.lang.reflect.Member
@@ -90,23 +91,23 @@ class HookParam internal constructor(private val createrInstance: YukiMemberHook
* *
* 在不确定 [Member] 类型为 [Method] 或 [Constructor] 时可以使用此方法 * 在不确定 [Member] 类型为 [Method] 或 [Constructor] 时可以使用此方法
* @return [Member] * @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 对象的方法 * 获取当前 Hook 对象的方法
* @return [Method] * @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 对象的构造方法 * 获取当前 Hook 对象的构造方法
* @return [Constructor] * @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] 的返回值 * 获取、设置当前 Hook 对象的 [method] or [constructor] 的返回值
@@ -125,28 +126,29 @@ class HookParam internal constructor(private val createrInstance: YukiMemberHook
val hasThrowable get() = wrapper?.hasThrowable 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 * @return [Throwable] or null
* @throws Throwable * @throws Throwable
*/ */
var throwable: Throwable? fun Throwable.throwToApp() {
get() = wrapper?.throwable wrapper?.throwable = this
set(value) { yLoggerE(msg = message ?: "$this", e = this)
wrapper?.throwable = value
} }
/**
* 获取 [result] 或 [throwable] - 存在 [throwable] 时优先返回
* @return [Any] or [Throwable] or null
*/
val resultOrThrowable get() = wrapper?.resultOrThrowable
/** /**
* 获取当前 Hook 对象的 [method] or [constructor] 的返回值 [T] * 获取当前 Hook 对象的 [method] or [constructor] 的返回值 [T]
* @return [T] or null * @return [T] or null

View File

@@ -97,12 +97,6 @@ class HookParamWrapper internal constructor(private var baseParam: XC_MethodHook
baseParam?.throwable = value baseParam?.throwable = value
} }
/**
* 获取 [result] 或 [throwable] - 存在 [throwable] 时优先返回
* @return [Any] or null
*/
val resultOrThrowable get() = baseParam?.resultOrThrowable
/** /**
* 设置方法参数 * 设置方法参数
* @param index 数组下标 * @param index 数组下标