diff --git a/app/src/main/java/com/highcapable/yukihookapi/demo/InjectLucky.kt b/app/src/main/java/com/highcapable/yukihookapi/demo/InjectLucky.kt new file mode 100644 index 00000000..5acb7e59 --- /dev/null +++ b/app/src/main/java/com/highcapable/yukihookapi/demo/InjectLucky.kt @@ -0,0 +1,55 @@ +/** + * MIT License + * + * Copyright (C) 2022 HighCapable + * + * This file is part of YukiHookAPI. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * This file is Created by fankes on 2022/2/8. + */ +package com.highcapable.yukihookapi.demo + +import androidx.annotation.Keep + +// for test +@Keep +class InjectLucky { + + // for test + @Keep + private var string = "没有" + + // for test + @Keep + constructor() { + string = "原始数据" + } + + // for test + @Keep + constructor(string: String = "原始数据复写") { + this.string = string + } + + // for test + @Keep + fun getString() = string +} \ No newline at end of file diff --git a/app/src/main/java/com/highcapable/yukihookapi/demo/MainActivity.kt b/app/src/main/java/com/highcapable/yukihookapi/demo/MainActivity.kt index ba3f7f23..f4780ba5 100644 --- a/app/src/main/java/com/highcapable/yukihookapi/demo/MainActivity.kt +++ b/app/src/main/java/com/highcapable/yukihookapi/demo/MainActivity.kt @@ -59,10 +59,15 @@ class MainActivity : AppCompatActivity() { .setMessage(InjectTest("文字未更改").getString() + "\n模块是否已激活:${YukiHookModuleStatus.isActive()}") .setPositiveButton("下一个") { _, _ -> AlertDialog.Builder(this) - .setTitle("Hook 构造方法测试(名称)") - .setMessage(InjectTestName("文字没更改").getString() + "\n模块是否已激活:${YukiHookModuleStatus.isActive()}") - .setPositiveButton("完成") { _, _ -> toast() } - .show() + .setTitle("Hook 构造方法测试(多个)") + .setMessage(InjectLucky().getString() + "\n" + InjectLucky(string = "没更改的文字").getString() + "\n模块是否已激活:${YukiHookModuleStatus.isActive()}") + .setPositiveButton("下一个") { _, _ -> + AlertDialog.Builder(this) + .setTitle("Hook 构造方法测试(名称)") + .setMessage(InjectTestName("文字没更改").getString() + "\n模块是否已激活:${YukiHookModuleStatus.isActive()}") + .setPositiveButton("完成") { _, _ -> toast() } + .show() + }.show() }.show() }.show() }.show() diff --git a/app/src/main/java/com/highcapable/yukihookapi/demo/hook/inject/MainInjecter.kt b/app/src/main/java/com/highcapable/yukihookapi/demo/hook/inject/MainInjecter.kt index 3f312e0f..444f7c3a 100644 --- a/app/src/main/java/com/highcapable/yukihookapi/demo/hook/inject/MainInjecter.kt +++ b/app/src/main/java/com/highcapable/yukihookapi/demo/hook/inject/MainInjecter.kt @@ -34,6 +34,7 @@ import android.widget.Toast import com.highcapable.yukihookapi.YukiHookAPI import com.highcapable.yukihookapi.annotation.xposed.InjectYukiHookWithXposed import com.highcapable.yukihookapi.demo.BuildConfig +import com.highcapable.yukihookapi.demo.InjectLucky import com.highcapable.yukihookapi.demo.InjectTest import com.highcapable.yukihookapi.demo.MainActivity import com.highcapable.yukihookapi.hook.factory.encase @@ -106,6 +107,17 @@ class MainInjecter : YukiHookXposedInitProxy { beforeHook { args().set("方法参数已被 Hook 成功") } } } + InjectLucky::class.java.hook { + injectMember { + allConstructors() + afterHook { + field { + name = "string" + type = StringType + }.set(instance, "内容被改掉了") + } + } + } InjectTest::class.java.hook { injectMember { constructor { param(StringType) } diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt index 3645ce24..4e3a0dea 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt @@ -150,6 +150,7 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla * - ⚡如果 [hookClass] 中没有构造方法可能会发生错误 */ fun allConstructors() { + allMethodsName = "" hookAllMembers = HookAllMembers.HOOK_ALL_CONSTRUCTORS isHookMemberSetup = true } @@ -295,14 +296,14 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla */ @DoNotUseMethod fun hook() { - /** 定义替换回调方法体 */ + /** 定义替换 Hook 回调方法体 */ val replaceMent = object : XC_MethodReplacement() { override fun replaceHookedMethod(baseParam: MethodHookParam?): Any? { if (baseParam == null) return null return HookParam(baseParam).let { param -> try { if (replaceHookCallback != null) - onHookLogMsg(msg = "Replace Hook Member [${member}] done [$tag]") + onHookLogMsg(msg = "Replace Hook Member [${member ?: "All Member $allMethodsName"}] done [$tag]") replaceHookCallback?.invoke(param) } catch (e: Throwable) { onConductFailureCallback?.invoke(param, e) @@ -323,7 +324,7 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla runCatching { beforeHookCallback?.invoke(param) if (beforeHookCallback != null) - onHookLogMsg(msg = "Before Hook Member [${member}] done [$tag]") + onHookLogMsg(msg = "Before Hook Member [${member ?: "All of \"$allMethodsName\""}] done [$tag]") }.onFailure { onConductFailureCallback?.invoke(param, it) onAllFailureCallback?.invoke(it) @@ -339,7 +340,7 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla runCatching { afterHookCallback?.invoke(param) if (afterHookCallback != null) - onHookLogMsg(msg = "After Hook Member [${member}] done [$tag]") + onHookLogMsg(msg = "After Hook Member [${member ?: "All of \"$allMethodsName\""}] done [$tag]") }.onFailure { onConductFailureCallback?.invoke(param, it) onAllFailureCallback?.invoke(it)