mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Fix some bugs
This commit is contained in:
@@ -383,7 +383,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
||||
val replaceMent = object : XC_MethodReplacement() {
|
||||
override fun replaceHookedMethod(baseParam: MethodHookParam?): Any? {
|
||||
if (baseParam == null) return null
|
||||
return HookParam(HookParamWrapper(baseParam)).let { param ->
|
||||
return HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).let { param ->
|
||||
try {
|
||||
if (replaceHookCallback != null)
|
||||
onHookLogMsg(msg = "Replace Hook Member [${member ?: "All Member $allMethodsName"}] done [$tag]")
|
||||
@@ -402,7 +402,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
||||
val beforeAfterHook = object : XC_MethodHook() {
|
||||
override fun beforeHookedMethod(baseParam: MethodHookParam?) {
|
||||
if (baseParam == null) return
|
||||
HookParam(HookParamWrapper(baseParam)).also { param ->
|
||||
HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).also { param ->
|
||||
runCatching {
|
||||
beforeHookCallback?.invoke(param)
|
||||
if (beforeHookCallback != null)
|
||||
@@ -417,7 +417,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
||||
|
||||
override fun afterHookedMethod(baseParam: MethodHookParam?) {
|
||||
if (baseParam == null) return
|
||||
HookParam(HookParamWrapper(baseParam)).also { param ->
|
||||
HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).also { param ->
|
||||
runCatching {
|
||||
afterHookCallback?.invoke(param)
|
||||
if (afterHookCallback != null)
|
||||
|
@@ -29,6 +29,7 @@
|
||||
|
||||
package com.highcapable.yukihookapi.hook.param
|
||||
|
||||
import com.highcapable.yukihookapi.hook.core.YukiHookCreater
|
||||
import com.highcapable.yukihookapi.hook.param.wrapper.HookParamWrapper
|
||||
import java.lang.reflect.Constructor
|
||||
import java.lang.reflect.Member
|
||||
@@ -36,9 +37,10 @@ import java.lang.reflect.Method
|
||||
|
||||
/**
|
||||
* Hook 方法、构造类的目标对象实现类
|
||||
* @param createrInstance [YukiHookCreater] 的实例对象
|
||||
* @param wrapper [HookParam] 的参数包装类实例
|
||||
*/
|
||||
class HookParam(private val wrapper: HookParamWrapper) {
|
||||
class HookParam(private val createrInstance: YukiHookCreater, private val wrapper: HookParamWrapper) {
|
||||
|
||||
/**
|
||||
* 获取当前 Hook 对象 [method] or [constructor] 的参数对象数组
|
||||
@@ -62,16 +64,18 @@ class HookParam(private val wrapper: HookParamWrapper) {
|
||||
|
||||
/**
|
||||
* 获取当前 Hook 实例的对象
|
||||
*
|
||||
* - ❗如果你当前 Hook 的对象是一个静态 - 那么它将不存在实例的对象
|
||||
* @return [Any]
|
||||
* @throws IllegalStateException 如果对象为空
|
||||
*/
|
||||
val instance get() = wrapper.instance ?: error("HookParam must with a non-null instance")
|
||||
val instance get() = wrapper.instance ?: error("HookParam instance got null,Is this a static member?")
|
||||
|
||||
/**
|
||||
* 获取当前 Hook 实例的类对象
|
||||
* @return [Class]
|
||||
*/
|
||||
val instanceClass get() = instance.javaClass
|
||||
val instanceClass get() = wrapper.instance?.javaClass ?: createrInstance.instanceClass
|
||||
|
||||
/**
|
||||
* 获取当前 Hook 对象的方法
|
||||
|
@@ -136,6 +136,8 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
|
||||
* 通过字符串转换为实体类
|
||||
*
|
||||
* - 使用当前 [appClassLoader] 装载目标 [Class]
|
||||
*
|
||||
* - 若要使用指定的 [ClassLoader] 装载 - 请手动调用 [classOf] 方法
|
||||
* @return [Class]
|
||||
* @throws NoClassDefFoundError 如果找不到 [Class]
|
||||
*/
|
||||
@@ -165,13 +167,13 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
|
||||
/**
|
||||
* 通过字符串查找类是否存在
|
||||
*
|
||||
* - 使用当前 [appClassLoader] 装载目标 [Class]
|
||||
* - 默认使用当前 [appClassLoader] 装载目标 [Class]
|
||||
* @return [Boolean] 是否存在
|
||||
*/
|
||||
val String.hasClass get() = hasClass(appClassLoader)
|
||||
|
||||
/**
|
||||
* 通过 [appClassLoader] 查询并装载 [Class]
|
||||
* 默认使用当前 [appClassLoader] 查询并装载 [Class]
|
||||
* @param name 类名
|
||||
* @return [HookClass]
|
||||
*/
|
||||
@@ -182,7 +184,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过 [appClassLoader] 查询并装载 [Class]
|
||||
* 默认使用当前 [appClassLoader] 查询并装载 [Class]
|
||||
*
|
||||
* 使用此方法查询将会取 [name] 其中命中存在的第一个 [Class] 作为结果
|
||||
* @param name 可填入多个类名 - 自动匹配
|
||||
@@ -194,32 +196,39 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
|
||||
* Hook 方法、构造类
|
||||
*
|
||||
* - ❗为防止任何字符串都被当做 [Class] 进行 Hook - 推荐优先使用 [findClass]
|
||||
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
|
||||
* @param initiate 方法体
|
||||
* @return [YukiHookCreater.Result]
|
||||
*/
|
||||
fun String.hook(initiate: YukiHookCreater.() -> Unit) = findClass(name = this).hook(initiate)
|
||||
fun String.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
|
||||
findClass(name = this).hook(isUseAppClassLoader, initiate)
|
||||
|
||||
/**
|
||||
* Hook 方法、构造类
|
||||
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
|
||||
* @param initiate 方法体
|
||||
* @return [YukiHookCreater.Result]
|
||||
*/
|
||||
fun Class<*>.hook(initiate: YukiHookCreater.() -> Unit) = hookClass.hook(initiate)
|
||||
fun Class<*>.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
|
||||
hookClass.hook(isUseAppClassLoader, initiate)
|
||||
|
||||
/**
|
||||
* Hook 方法、构造类
|
||||
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
|
||||
* @param initiate 方法体
|
||||
* @return [YukiHookCreater.Result]
|
||||
*/
|
||||
fun VariousClass.hook(initiate: YukiHookCreater.() -> Unit) = hookClass.hook(initiate)
|
||||
fun VariousClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
|
||||
hookClass.hook(isUseAppClassLoader, initiate)
|
||||
|
||||
/**
|
||||
* Hook 方法、构造类
|
||||
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
|
||||
* @param initiate 方法体
|
||||
* @return [YukiHookCreater.Result]
|
||||
*/
|
||||
fun HookClass.hook(initiate: YukiHookCreater.() -> Unit) =
|
||||
YukiHookCreater(packageParam = thisParam, hookClass = bind()).apply(initiate).hook()
|
||||
fun HookClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
|
||||
YukiHookCreater(packageParam = thisParam, hookClass = if (isUseAppClassLoader) bind() else this).apply(initiate).hook()
|
||||
|
||||
/**
|
||||
* [VariousClass] 转换为 [HookClass] 并绑定到 [appClassLoader]
|
||||
@@ -235,7 +244,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
|
||||
/**
|
||||
* 将目标 [Class] 绑定到 [appClassLoader]
|
||||
*
|
||||
* - ❗请注意未绑定到 [appClassLoader] 的 [Class] 不能被装载 - 调用 [hook] 方法会自动绑定
|
||||
* - ❗请注意未绑定到 [appClassLoader] 的 [Class] 是不安全的 - 调用 [hook] 方法会根据设定自动绑定
|
||||
* @return [HookClass]
|
||||
*/
|
||||
private fun HookClass.bind() = try {
|
||||
|
Reference in New Issue
Block a user