mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-06 10:45:47 +08:00
feat: update demo
This commit is contained in:
@@ -41,7 +41,10 @@ import com.highcapable.yukihookapi.demo_module.data.DataConst
|
|||||||
import com.highcapable.yukihookapi.demo_module.hook.factory.compatStyle
|
import com.highcapable.yukihookapi.demo_module.hook.factory.compatStyle
|
||||||
import com.highcapable.yukihookapi.demo_module.ui.MainActivity
|
import com.highcapable.yukihookapi.demo_module.ui.MainActivity
|
||||||
import com.highcapable.yukihookapi.hook.factory.applyModuleTheme
|
import com.highcapable.yukihookapi.hook.factory.applyModuleTheme
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.constructor
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.method
|
||||||
import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities
|
import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities
|
||||||
|
import com.highcapable.yukihookapi.hook.param.annotation.LegacyResourcesHook
|
||||||
import com.highcapable.yukihookapi.hook.type.android.ActivityClass
|
import com.highcapable.yukihookapi.hook.type.android.ActivityClass
|
||||||
import com.highcapable.yukihookapi.hook.type.android.BundleClass
|
import com.highcapable.yukihookapi.hook.type.android.BundleClass
|
||||||
import com.highcapable.yukihookapi.hook.type.java.StringArrayClass
|
import com.highcapable.yukihookapi.hook.type.java.StringArrayClass
|
||||||
@@ -50,7 +53,7 @@ import com.highcapable.yukihookapi.hook.type.java.UnitType
|
|||||||
import com.highcapable.yukihookapi.hook.xposed.bridge.event.YukiXposedEvent
|
import com.highcapable.yukihookapi.hook.xposed.bridge.event.YukiXposedEvent
|
||||||
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit
|
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit
|
||||||
|
|
||||||
@InjectYukiHookWithXposed
|
@InjectYukiHookWithXposed(isUsingResourcesHook = true)
|
||||||
object HookEntry : IYukiHookXposedInit {
|
object HookEntry : IYukiHookXposedInit {
|
||||||
|
|
||||||
override fun onInit() {
|
override fun onInit() {
|
||||||
@@ -150,6 +153,7 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@LegacyResourcesHook
|
||||||
override fun onHook() {
|
override fun onHook() {
|
||||||
// Start your hook
|
// Start your hook
|
||||||
// Can be shortened to encase {}
|
// Can be shortened to encase {}
|
||||||
@@ -161,17 +165,14 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
loadZygote {
|
loadZygote {
|
||||||
// Find Class to hook
|
// Find Class to hook
|
||||||
// 得到需要 Hook 的 Class
|
// 得到需要 Hook 的 Class
|
||||||
ActivityClass.hook {
|
ActivityClass.method {
|
||||||
injectMember {
|
name = "onCreate"
|
||||||
method {
|
param(BundleClass)
|
||||||
name = "onCreate"
|
}.hook {
|
||||||
param(BundleClass)
|
after {
|
||||||
}
|
// Add text after the [Activity] title
|
||||||
afterHook {
|
// 在 [Activity] 标题后方加入文字
|
||||||
// Add text after the [Activity] title
|
instance<Activity>().apply { title = "$title [Active]" }
|
||||||
// 在 [Activity] 标题后方加入文字
|
|
||||||
instance<Activity>().apply { title = "$title [Active]" }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Find Resources to hook
|
// Find Resources to hook
|
||||||
@@ -208,29 +209,27 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// Find Class to hook
|
// Find Class to hook
|
||||||
// 得到需要 Hook 的 Class
|
// 得到需要 Hook 的 Class
|
||||||
"$packageName.ui.MainActivity".toClass().hook {
|
"$packageName.ui.MainActivity".toClass().apply {
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method {
|
name = "getFirstText"
|
||||||
name = "getFirstText"
|
emptyParam()
|
||||||
emptyParam()
|
returnType = StringClass
|
||||||
returnType = StringClass
|
}.hook {
|
||||||
}
|
|
||||||
// Replaced hook
|
// Replaced hook
|
||||||
// 执行替换 Hook
|
// 执行替换 Hook
|
||||||
replaceTo(any = "Hello YukiHookAPI!")
|
replaceTo(any = "Hello YukiHookAPI!")
|
||||||
}
|
}
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method {
|
name = "onCreate"
|
||||||
name = "onCreate"
|
param(BundleClass)
|
||||||
param(BundleClass)
|
}.hook {
|
||||||
}
|
|
||||||
// Before hook the method
|
// Before hook the method
|
||||||
// 在方法执行之前拦截
|
// 在方法执行之前拦截
|
||||||
beforeHook {
|
before {
|
||||||
field {
|
field {
|
||||||
name = "secondText"
|
name = "secondText"
|
||||||
type = StringClass
|
type = StringClass
|
||||||
@@ -238,7 +237,7 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// After hook the method
|
// After hook the method
|
||||||
// 在执行方法之后拦截
|
// 在执行方法之后拦截
|
||||||
afterHook {
|
after {
|
||||||
if (prefs.getBoolean("show_dialog_when_demo_app_opend"))
|
if (prefs.getBoolean("show_dialog_when_demo_app_opend"))
|
||||||
MaterialAlertDialogBuilder(instance<Activity>().applyModuleTheme(R.style.Theme_Default))
|
MaterialAlertDialogBuilder(instance<Activity>().applyModuleTheme(R.style.Theme_Default))
|
||||||
.setTitle("Hooked")
|
.setTitle("Hooked")
|
||||||
@@ -254,15 +253,14 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method {
|
name = "getRegularText"
|
||||||
name = "getRegularText"
|
param(StringClass)
|
||||||
param(StringClass)
|
returnType = StringClass
|
||||||
returnType = StringClass
|
}.hook {
|
||||||
}
|
|
||||||
// Before hook the method
|
// Before hook the method
|
||||||
// 在方法执行之前拦截
|
// 在方法执行之前拦截
|
||||||
beforeHook {
|
before {
|
||||||
// Set the 0th param (recomment)
|
// Set the 0th param (recomment)
|
||||||
// 设置 0 号 param (推荐)
|
// 设置 0 号 param (推荐)
|
||||||
args().first().set("I am hook method param")
|
args().first().set("I am hook method param")
|
||||||
@@ -273,15 +271,14 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method {
|
name = "getArray"
|
||||||
name = "getArray"
|
param(StringArrayClass)
|
||||||
param(StringArrayClass)
|
returnType = StringArrayClass
|
||||||
returnType = StringArrayClass
|
}.hook {
|
||||||
}
|
|
||||||
// Before hook the method
|
// Before hook the method
|
||||||
// 在方法执行之前拦截
|
// 在方法执行之前拦截
|
||||||
beforeHook {
|
before {
|
||||||
// Set the 0th param
|
// Set the 0th param
|
||||||
// 设置 0 号 param
|
// 设置 0 号 param
|
||||||
args().first().array<String>()[0] = "peach"
|
args().first().array<String>()[0] = "peach"
|
||||||
@@ -289,12 +286,11 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method {
|
name = "toast"
|
||||||
name = "toast"
|
emptyParam()
|
||||||
emptyParam()
|
returnType = UnitType
|
||||||
returnType = UnitType
|
}.hook {
|
||||||
}
|
|
||||||
// Intercept the entire method
|
// Intercept the entire method
|
||||||
// 拦截整个方法
|
// 拦截整个方法
|
||||||
replaceUnit {
|
replaceUnit {
|
||||||
@@ -322,12 +318,11 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method {
|
name = "getDataText"
|
||||||
name = "getDataText"
|
emptyParam()
|
||||||
emptyParam()
|
returnType = StringClass
|
||||||
returnType = StringClass
|
}.hook {
|
||||||
}
|
|
||||||
// Replaced hook
|
// Replaced hook
|
||||||
// 执行替换 Hook
|
// 执行替换 Hook
|
||||||
replaceTo(prefs.get(DataConst.TEST_KV_DATA))
|
replaceTo(prefs.get(DataConst.TEST_KV_DATA))
|
||||||
@@ -335,14 +330,13 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// Find Class to hook
|
// Find Class to hook
|
||||||
// 得到需要 Hook 的 Class
|
// 得到需要 Hook 的 Class
|
||||||
"$packageName.test.Main".toClass().hook {
|
"$packageName.test.Main".toClass().apply {
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
constructor { param(StringClass) }.hook {
|
||||||
constructor { param(StringClass) }
|
|
||||||
// Before hook the method
|
// Before hook the method
|
||||||
// 在方法执行之前拦截
|
// 在方法执行之前拦截
|
||||||
beforeHook {
|
before {
|
||||||
// Set the 0th param
|
// Set the 0th param
|
||||||
// 设置 0 号 param
|
// 设置 0 号 param
|
||||||
args().first().set("I am hook constructor param")
|
args().first().set("I am hook constructor param")
|
||||||
@@ -350,37 +344,38 @@ object HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method {
|
name = "getSuperString"
|
||||||
name = "getSuperString"
|
emptyParam()
|
||||||
emptyParam()
|
// This method is not in the current Class
|
||||||
// This method is not in the current Class
|
// Just set this find condition to automatically go to the super class of the current Class to find
|
||||||
// Just set this find condition to automatically go to the super class of the current Class to find
|
// Since the method shown will only exist in the super class
|
||||||
// Since the method shown will only exist in the super class
|
// So you can set only the super class to find isOnlySuperClass = true to save time
|
||||||
// So you can set only the super class to find isOnlySuperClass = true to save time
|
// If you want to keep trying to find the current Class, please remove isOnlySuperClass = true
|
||||||
// If you want to keep trying to find the current Class, please remove isOnlySuperClass = true
|
// 这个方法不在当前的 Class
|
||||||
// 这个方法不在当前的 Class
|
// 只需要设置此查找条件即可自动前往当前 Class 的父类查找
|
||||||
// 只需要设置此查找条件即可自动前往当前 Class 的父类查找
|
// 由于演示的方法只会在父类存在 - 所以可以设置仅查找父类 isOnlySuperClass = true 节省时间
|
||||||
// 由于演示的方法只会在父类存在 - 所以可以设置仅查找父类 isOnlySuperClass = true 节省时间
|
// 如果想继续尝试查找当前 Class - 请删除 isOnlySuperClass = true
|
||||||
// 如果想继续尝试查找当前 Class - 请删除 isOnlySuperClass = true
|
superClass(isOnlySuperClass = true)
|
||||||
superClass(isOnlySuperClass = true)
|
}.hook {
|
||||||
}
|
|
||||||
// Replaced hook
|
// Replaced hook
|
||||||
// 执行替换 Hook
|
// 执行替换 Hook
|
||||||
replaceTo(any = "I am hook super class method")
|
replaceTo(any = "I am hook super class method")
|
||||||
}
|
}
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method { name = "getTestResultFirst" }.all()
|
name = "getTestResultFirst"
|
||||||
|
}.hookAll {
|
||||||
// Replaced hook
|
// Replaced hook
|
||||||
// 执行替换 Hook
|
// 执行替换 Hook
|
||||||
replaceTo(any = "I am hook all methods first")
|
replaceTo(any = "I am hook all methods first")
|
||||||
}
|
}
|
||||||
// Inject the method to be hooked
|
// Inject the method to be hooked
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
injectMember {
|
method {
|
||||||
method { name = "getTestResultLast" }.all()
|
name = "getTestResultLast"
|
||||||
|
}.hookAll {
|
||||||
// Replaced hook
|
// Replaced hook
|
||||||
// 执行替换 Hook
|
// 执行替换 Hook
|
||||||
replaceTo(any = "I am hook all methods last")
|
replaceTo(any = "I am hook all methods last")
|
||||||
|
@@ -31,6 +31,7 @@ import android.app.Activity;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI;
|
import com.highcapable.yukihookapi.YukiHookAPI;
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.ReflectionFactoryKt;
|
||||||
import com.highcapable.yukihookapi.hook.log.YLog;
|
import com.highcapable.yukihookapi.hook.log.YLog;
|
||||||
import com.highcapable.yukihookapi.hook.xposed.bridge.event.YukiXposedEvent;
|
import com.highcapable.yukihookapi.hook.xposed.bridge.event.YukiXposedEvent;
|
||||||
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit;
|
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit;
|
||||||
@@ -47,7 +48,7 @@ import kotlin.Unit;
|
|||||||
// 建议还是使用 Kotlin 来完成 Hook 部分的编写
|
// 建议还是使用 Kotlin 来完成 Hook 部分的编写
|
||||||
// 请删除下方的注释 "//" 以使用此 Demo - 但要确保注释掉 Kotlin 一边的 HookEntry 的注解
|
// 请删除下方的注释 "//" 以使用此 Demo - 但要确保注释掉 Kotlin 一边的 HookEntry 的注解
|
||||||
// ========
|
// ========
|
||||||
// @InjectYukiHookWithXposed
|
// @InjectYukiHookWithXposed(isUsingResourcesHook = true)
|
||||||
public class HookEntry implements IYukiHookXposedInit {
|
public class HookEntry implements IYukiHookXposedInit {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -77,18 +78,15 @@ public class HookEntry implements IYukiHookXposedInit {
|
|||||||
// 在 Java 中调用 Kotlin 的 lambda 在 Unit 情况下也需要 return Unit.INSTANCE
|
// 在 Java 中调用 Kotlin 的 lambda 在 Unit 情况下也需要 return Unit.INSTANCE
|
||||||
YukiHookAPI.INSTANCE.encase(e -> {
|
YukiHookAPI.INSTANCE.encase(e -> {
|
||||||
e.loadZygote(l -> {
|
e.loadZygote(l -> {
|
||||||
l.hook(Activity.class, false, h -> {
|
var result = ReflectionFactoryKt.method(Activity.class, m -> {
|
||||||
h.injectMember(h.getPRIORITY_DEFAULT(), "Default", i -> {
|
m.setName("onCreate");
|
||||||
i.method(m -> {
|
m.param(Bundle.class);
|
||||||
m.setName("onCreate");
|
return Unit.INSTANCE;
|
||||||
m.param(Bundle.class);
|
});
|
||||||
return null;
|
l.hook(result, h -> {
|
||||||
});
|
h.after(a -> {
|
||||||
i.afterHook(a -> {
|
Activity instance = ((Activity) a.getInstance());
|
||||||
Activity instance = ((Activity) a.getInstance());
|
instance.setTitle(instance.getTitle() + " [Active]");
|
||||||
instance.setTitle(instance.getTitle() + " [Active]");
|
|
||||||
return Unit.INSTANCE;
|
|
||||||
});
|
|
||||||
return Unit.INSTANCE;
|
return Unit.INSTANCE;
|
||||||
});
|
});
|
||||||
return Unit.INSTANCE;
|
return Unit.INSTANCE;
|
||||||
|
Reference in New Issue
Block a user