mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-06 18:55:35 +08:00
Modify make hooker safety
This commit is contained in:
@@ -524,11 +524,11 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
|||||||
(if (isReplaceHookMode) YukiHookHelper.hookMethod(member, replaceMent)
|
(if (isReplaceHookMode) YukiHookHelper.hookMethod(member, replaceMent)
|
||||||
else YukiHookHelper.hookMethod(member, beforeAfterHook)).also {
|
else YukiHookHelper.hookMethod(member, beforeAfterHook)).also {
|
||||||
when {
|
when {
|
||||||
it.first.member == null -> error("Hook Member [$member] failed")
|
it.first?.member == null -> error("Hook Member [$member] failed")
|
||||||
it.second -> onAlreadyHookedCallback?.invoke(it.first.member!!)
|
it.second -> onAlreadyHookedCallback?.invoke(it.first?.member!!)
|
||||||
else -> {
|
else -> {
|
||||||
memberUnhook = it.first
|
memberUnhook = it.first
|
||||||
onHookedCallback?.invoke(it.first.member!!)
|
onHookedCallback?.invoke(it.first?.member!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
package com.highcapable.yukihookapi.hook.xposed.bridge.factory
|
package com.highcapable.yukihookapi.hook.xposed.bridge.factory
|
||||||
|
|
||||||
import com.highcapable.yukihookapi.hook.param.wrapper.HookParamWrapper
|
import com.highcapable.yukihookapi.hook.param.wrapper.HookParamWrapper
|
||||||
|
import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookBridge
|
||||||
import de.robv.android.xposed.XC_MethodHook
|
import de.robv.android.xposed.XC_MethodHook
|
||||||
import de.robv.android.xposed.XposedBridge
|
import de.robv.android.xposed.XposedBridge
|
||||||
import java.lang.reflect.Constructor
|
import java.lang.reflect.Constructor
|
||||||
@@ -108,18 +109,20 @@ internal object YukiHookHelper {
|
|||||||
* 对接 [XposedBridge.hookMethod]
|
* 对接 [XposedBridge.hookMethod]
|
||||||
* @param hookMethod 需要 Hook 的方法、构造方法
|
* @param hookMethod 需要 Hook 的方法、构造方法
|
||||||
* @param callback 回调
|
* @param callback 回调
|
||||||
* @return [Pair] - ([YukiMemberHook.Unhook],[Boolean] 是否已经 Hook)
|
* @return [Pair] - ([YukiMemberHook.Unhook] or null,[Boolean] 是否已经 Hook)
|
||||||
*/
|
*/
|
||||||
internal fun hookMethod(hookMethod: Member?, callback: YukiHookCallback): Pair<YukiMemberHook.Unhook, Boolean> {
|
internal fun hookMethod(hookMethod: Member?, callback: YukiHookCallback): Pair<YukiMemberHook.Unhook?, Boolean> {
|
||||||
runCatching {
|
runCatching {
|
||||||
YukiHookedMembers.hookedMembers.takeIf { it.isNotEmpty() }?.forEach {
|
YukiHookedMembers.hookedMembers.takeIf { it.isNotEmpty() }?.forEach {
|
||||||
if (it.member.toString() == hookMethod.toString()) return@runCatching it
|
if (it.member.toString() == hookMethod.toString()) return@runCatching it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return YukiMemberHook.Unhook.wrapper(XposedBridge.hookMethod(hookMethod, callback.compat())).let {
|
return if (YukiHookBridge.hasXposedBridge)
|
||||||
|
YukiMemberHook.Unhook.wrapper(XposedBridge.hookMethod(hookMethod, callback.compat())).let {
|
||||||
YukiHookedMembers.hookedMembers.add(it)
|
YukiHookedMembers.hookedMembers.add(it)
|
||||||
Pair(it, false)
|
Pair(it, false)
|
||||||
}
|
}
|
||||||
|
else Pair(null, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -142,6 +145,7 @@ internal object YukiHookHelper {
|
|||||||
YukiHookedMembers.hookedQueueMethods[allMethodsName]?.forEach { e -> it.add(e) }
|
YukiHookedMembers.hookedQueueMethods[allMethodsName]?.forEach { e -> it.add(e) }
|
||||||
return@also
|
return@also
|
||||||
}
|
}
|
||||||
|
if (YukiHookBridge.hasXposedBridge.not()) return@also
|
||||||
XposedBridge.hookAllMethods(hookClass, methodName, callback.compat()).takeIf { e -> e.isNotEmpty() }
|
XposedBridge.hookAllMethods(hookClass, methodName, callback.compat()).takeIf { e -> e.isNotEmpty() }
|
||||||
?.forEach { e -> it.add(YukiMemberHook.Unhook.wrapper(e, allMethodsName)) }
|
?.forEach { e -> it.add(YukiMemberHook.Unhook.wrapper(e, allMethodsName)) }
|
||||||
YukiHookedMembers.hookedQueueMethods[allMethodsName] = it
|
YukiHookedMembers.hookedQueueMethods[allMethodsName] = it
|
||||||
@@ -166,6 +170,7 @@ internal object YukiHookHelper {
|
|||||||
YukiHookedMembers.hookedQueueConstructors[allConstructorsName]?.forEach { e -> it.add(e) }
|
YukiHookedMembers.hookedQueueConstructors[allConstructorsName]?.forEach { e -> it.add(e) }
|
||||||
return@also
|
return@also
|
||||||
}
|
}
|
||||||
|
if (YukiHookBridge.hasXposedBridge.not()) return@also
|
||||||
XposedBridge.hookAllConstructors(hookClass, callback.compat()).takeIf { e -> e.isNotEmpty() }
|
XposedBridge.hookAllConstructors(hookClass, callback.compat()).takeIf { e -> e.isNotEmpty() }
|
||||||
?.forEach { e -> it.add(YukiMemberHook.Unhook.wrapper(e, allConstructorsName)) }
|
?.forEach { e -> it.add(YukiMemberHook.Unhook.wrapper(e, allConstructorsName)) }
|
||||||
YukiHookedMembers.hookedQueueConstructors[allConstructorsName] = it
|
YukiHookedMembers.hookedQueueConstructors[allConstructorsName] = it
|
||||||
@@ -185,7 +190,7 @@ internal object YukiHookHelper {
|
|||||||
val isHookedMember = YukiHookedMembers.hookedMembers.any { it.member.toString() == member.toString() }
|
val isHookedMember = YukiHookedMembers.hookedMembers.any { it.member.toString() == member.toString() }
|
||||||
val isQueueMethod = YukiHookedMembers.hookedQueueMethods.any { it.value.any { e -> e.member.toString() == member.toString() } }
|
val isQueueMethod = YukiHookedMembers.hookedQueueMethods.any { it.value.any { e -> e.member.toString() == member.toString() } }
|
||||||
val isQueueConstructor = YukiHookedMembers.hookedQueueConstructors.any { it.value.any { e -> e.member.toString() == member.toString() } }
|
val isQueueConstructor = YukiHookedMembers.hookedQueueConstructors.any { it.value.any { e -> e.member.toString() == member.toString() } }
|
||||||
return if (isHookedMember || isQueueMethod || isQueueConstructor)
|
return if (YukiHookBridge.hasXposedBridge && (isHookedMember || isQueueMethod || isQueueConstructor))
|
||||||
XposedBridge.invokeOriginalMethod(member, instance, args)
|
XposedBridge.invokeOriginalMethod(member, instance, args)
|
||||||
else null
|
else null
|
||||||
}
|
}
|
||||||
@@ -308,6 +313,7 @@ internal abstract class YukiMemberHook(override val priority: Int = YukiHookPrio
|
|||||||
* @param isNeedRemove 是否需要从 [YukiHookedMembers.hookedMembers] 中移除
|
* @param isNeedRemove 是否需要从 [YukiHookedMembers.hookedMembers] 中移除
|
||||||
*/
|
*/
|
||||||
private fun unhook(isNeedRemove: Boolean = true) {
|
private fun unhook(isNeedRemove: Boolean = true) {
|
||||||
|
if (YukiHookBridge.hasXposedBridge.not()) return
|
||||||
instance.unhook()
|
instance.unhook()
|
||||||
if (isNeedRemove) runCatching { YukiHookedMembers.hookedMembers.remove(this) }
|
if (isNeedRemove) runCatching { YukiHookedMembers.hookedMembers.remove(this) }
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user