From 485b51ca3227b3ec67dc280c10a7cf8bdb41492f Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Wed, 4 May 2022 09:20:42 +0800 Subject: [PATCH] Fix an hardcore bug --- .../yukihookapi/demo_module/hook/HookEntry.kt | 2 +- docs/api/public/PackageParam.md | 26 +++++++++++++- docs/config/api-example.md | 2 +- docs/guide/example.md | 35 ++++++++++++++++--- .../yukihookapi/hook/param/PackageParam.kt | 26 +++++++++++--- .../hook/xposed/bridge/YukiHookBridge.kt | 3 +- 6 files changed, 81 insertions(+), 13 deletions(-) diff --git a/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/HookEntry.kt b/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/HookEntry.kt index 5e642dce..b0c9b033 100644 --- a/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/HookEntry.kt +++ b/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/HookEntry.kt @@ -78,7 +78,7 @@ class HookEntry : IYukiHookXposedInit { // 开始你的 Hook // 可简写为 encase {} YukiHookAPI.encase { - // 装载到系统框架 + // 装载 APP Zygote 事件 loadZygote { // 得到需要 Hook 的 Class ActivityClass.hook { diff --git a/docs/api/public/PackageParam.md b/docs/api/public/PackageParam.md index 6d3fad33..be986405 100644 --- a/docs/api/public/PackageParam.md +++ b/docs/api/public/PackageParam.md @@ -240,7 +240,11 @@ fun loadApp(name: String, hooker: YukiBaseHooker) `name` 为 APP 的包名,后方的两个参数一个可作为 `lambda` 方法体使用,一个可以直接装载子 Hooker。 -装载并 Hook 指定、全部包名的 APP,若要 Hook 系统框架,请使用 `loadZygote`。 +装载并 Hook 指定、全部包名的 APP。 + +若要装载 APP Zygote 事件,请使用 `loadZygote`。 + +若要 Hook 系统框架,请使用 `loadSystem`。 ### loadZygote [method] @@ -258,6 +262,26 @@ fun loadZygote(hooker: YukiBaseHooker) **功能描述** +> 装载 APP Zygote 事件。 + +方法中的两个参数一个可作为 `lambda` 方法体使用,一个可以直接装载子 Hooker。 + +### loadSystem [method] + +```kotlin +inline fun loadSystem(initiate: PackageParam.() -> Unit) +``` + +```kotlin +fun loadSystem(hooker: YukiBaseHooker) +``` + +**变更记录** + +`v1.0.82` `新增` + +**功能描述** + > 装载并 Hook 系统框架。 方法中的两个参数一个可作为 `lambda` 方法体使用,一个可以直接装载子 Hooker。 diff --git a/docs/config/api-example.md b/docs/config/api-example.md index 3e3f32e5..b0e0d9e4 100644 --- a/docs/config/api-example.md +++ b/docs/config/api-example.md @@ -201,7 +201,7 @@ encase { } ``` -你还可以同时使用 `loadZygote` 方法来装载系统框架。 +你还可以同时使用 `loadZygote` 方法来装载新的进程被 fork 后的第一个事件 `initZygote`。 > 示例如下 diff --git a/docs/guide/example.md b/docs/guide/example.md index 45ead4cb..8bb87792 100644 --- a/docs/guide/example.md +++ b/docs/guide/example.md @@ -192,11 +192,11 @@ TestClass.hook { } ``` -### Hook 系统框架 +### Hook Zygote -在 `YukiHookAPI` 中,Hook 系统框架的实现非常简单。 +在 APP 启动时,新的进程被 fork 后的第一个事件 `initZygote`。 -假设我们要全局 Hook 一个 `Activity` 的 `onCreate` 事件 +假设我们要全局 Hook 一个 APP `Activity` 的 `onCreate` 事件 在 `encase` 方法体中添加代码。 @@ -221,7 +221,34 @@ loadZygote { 这样就实现了上述的 Hook 功能。 -!> `loadZygote` 与 `loadApp(name = "android")` 有直接性区别,`loadZygote` 会在 `initZygote` 中装载,若要 Hook 系统框架,建议使用 `loadZygote`。 +### Hook 系统框架 + +在 `YukiHookAPI` 中,Hook 系统框架的实现非常简单。 + +假设我们要全局 Hook 一个系统 `Activity` 的 `onCreate` 事件 + +在 `encase` 方法体中添加代码。 + +> 示例如下 + +```kotlin +loadSystem { + ActivityClass.hook { + injectMember { + method { + name = "onCreate" + param(BundleClass) + returnType = UnitType + } + afterHook { + // Your code here. + } + } + } +} +``` + +!> `loadZygote` 与 `loadSystem` 有直接性区别,`loadZygote` 会在 `initZygote` 中装载,系统框架被视为一个单独的 APP 而存在,若要 Hook 系统框架,请使用 `loadSystem`。 ### Hook Resources diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt index 3bd26503..527ddccc 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt @@ -169,8 +169,10 @@ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper? /** * 装载并 Hook 指定、全部包名的 APP * - * 若要 Hook 系统框架 - 请使用 [loadZygote] - * @param name 包名 - 不填将过滤除了系统框架的全部 APP + * 若要装载 APP Zygote 事件 - 请使用 [loadZygote] + * + * 若要 Hook 系统框架 - 请使用 [loadSystem] + * @param name 包名 - 不填将过滤除了 [loadZygote] 事件外的全部 APP * @param initiate 方法体 */ inline fun loadApp(name: String = "", initiate: PackageParam.() -> Unit) { @@ -180,8 +182,10 @@ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper? /** * 装载并 Hook 指定、全部包名的 APP * - * 若要 Hook 系统框架 - 请使用 [loadZygote] - * @param name 包名 - 不填将过滤除了系统框架的全部 APP + * 若要装载 APP Zygote 事件 - 请使用 [loadZygote] + * + * 若要 Hook 系统框架 - 请使用 [loadSystem] + * @param name 包名 - 不填将过滤除了 [loadZygote] 事件外的全部 APP * @param hooker Hook 子类 */ fun loadApp(name: String = "", hooker: YukiBaseHooker) { @@ -192,12 +196,24 @@ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper? * 装载并 Hook 系统框架 * @param initiate 方法体 */ + inline fun loadSystem(initiate: PackageParam.() -> Unit) = loadApp(YukiHookBridge.SYSTEM_FRAMEWORK_NAME, initiate) + + /** + * 装载并 Hook 系统框架 + * @param hooker Hook 子类 + */ + fun loadSystem(hooker: YukiBaseHooker) = loadApp(YukiHookBridge.SYSTEM_FRAMEWORK_NAME, hooker) + + /** + * 装载 APP Zygote 事件 + * @param initiate 方法体 + */ inline fun loadZygote(initiate: PackageParam.() -> Unit) { if (wrapper?.type == HookEntryType.ZYGOTE) initiate(this) } /** - * 装载并 Hook 系统框架 + * 装载 APP Zygote 事件 * @param hooker Hook 子类 */ fun loadZygote(hooker: YukiBaseHooker) { diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt index c1095373..c4cc1fc1 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt @@ -56,7 +56,8 @@ import java.lang.reflect.Member object YukiHookBridge { /** Android 系统框架名称 */ - private const val SYSTEM_FRAMEWORK_NAME = "android" + @PublishedApi + internal const val SYSTEM_FRAMEWORK_NAME = "android" /** Xposed 是否装载完成 */ private var isXposedInitialized = false