跳转到内容

介绍 ​

YukiHookAPI 是一个集成化的 Hook API 框架,本身不提供任何 Hook 功能,需要 Xposed 相关基础 API 的支持。

背景 ​

这是一个使用 Kotlin 基于 Xposed API 重新构建的高效 Hook API,同时为 Xposed 模块的开发打造了丰富的功能扩展。

名称取自 《ももくり》女主 栗原 雪(Yuki)。

前身为 开发学习项目 中使用的 Innocent Xposed API,现在重新命名并开源。

用途 ​

YukiHookAPI 完全采用 Kotlin lambda 语法构建。

抛弃原始不太友好的 XposedHelpers,你可以使用它来轻松创建 Xposed 模块以及轻松实现自定义 Hook API。

语言要求 ​

请使用 Kotlin,框架部分代码构成同样兼容 Java 但基础 Hook 场景的实现可能完全无法使用。

文档全部的 Demo 示例代码都将使用 Kotlin 进行描述,如果你完全不会使用 Kotlin 那你将有可能无法使用 YukiHookAPI。

灵感来源 ​

以前,我们在构建 Xposed 模块的时候,首先需要在 assets 下创建 xposed_init 文件。

然后,将自己的入口类名手动填入文件中,使用 XposedHelpers 去实现我们的 Hook 逻辑。

自 Kotlin 作为 Android 主要开发语言以来,这套 API 用起来确实已经不是很优雅了。

有没有什么 好用、轻量、优雅 的解决办法呢?

本着这样的想法,YukiHookAPI 诞生了。

现在,我们只需要编写少量的代码,一切时间开销和花费交给自动化处理。

借助 Kotlin 优雅的 lambda 写法以及 YukiHookAPI,可以让你的 Hook 逻辑更加美观清晰。

示例如下

kotlin
@InjectYukiHookWithXposed
object HookEntry : IYukiHookXposedInit {

    override fun onHook() = encase {
        loadZygote {
            Activity::class.resolve().firstMethod {
                name = "onCreate"
                parameters(Bundle::class)
            }.hook {
                before {
                  // Your code here.
                }
                after {
                  // Your code here.
                }
            }
        }
        loadApp(name = "com.android.browser") {
            Activity::class.resolve().firstMethod {
                name = "onCreate"
                parameters(Bundle::class)
            }.hook {
                before {
                  // Your code here.
                }
                after {
                  // Your code here.
                }
            }
        }
    }
}
kotlin
class HookEntry : IXposedHookZygoteInit, IXposedHookLoadPackage {

    private lateinit var moduleResources: XModuleResources

    override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam) {
        moduleResources = XModuleResources.createInstance(sparam.modulePath, null)
        XposedHelpers.findAndHookMethod(
                Activity::class.java.name,
                null, "onCreate",
                Bundle::class.java,
                object : XC_MethodHook() {
                    override fun beforeHookedMethod(param: MethodHookParam?) {
                        // Your code here.
                    }

                    override fun afterHookedMethod(param: MethodHookParam?) {
                        // Your code here.
                    }
                })
    }

    override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
        if (lpparam.packageName == "com.android.browser")
            XposedHelpers.findAndHookMethod(
                Activity::class.java.name,
                lpparam.classLoader, "onCreate",
                Bundle::class.java,
                object : XC_MethodHook() {
                    override fun beforeHookedMethod(param: MethodHookParam?) {
                        // Your code here.
                    }

                    override fun afterHookedMethod(param: MethodHookParam?) {
                        // Your code here.
                    }
                })
    }
}

是的,你没有看错,仅仅就需要这些代码,就能完全取代传统的 Xposed API 实现同样的功能。

现在,借助高效强大的 YukiHookAPI,你就可以实现一个非常简单的 Xposed 模块。

小提示

从 1.3.0 版本开始,YukiHookAPI 已将自身的反射 API 部分迁移至 KavaRef (包括上方演示的反射 API 部分)。

现在,你可以借助 KavaRef 的强大反射能力让 YukiHookAPI 更加易用。

基于 Apache-2.0 许可发布