Fix an hardcore bug

This commit is contained in:
2022-05-04 09:20:42 +08:00
parent 4ebb674913
commit 485b51ca32
6 changed files with 81 additions and 13 deletions

View File

@@ -78,7 +78,7 @@ class HookEntry : IYukiHookXposedInit {
// 开始你的 Hook
// 可简写为 encase {}
YukiHookAPI.encase {
// 装载到系统框架
// 装载 APP Zygote 事件
loadZygote {
// 得到需要 Hook 的 Class
ActivityClass.hook {

View File

@@ -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。

View File

@@ -201,7 +201,7 @@ encase {
}
```
你还可以同时使用 `loadZygote` 方法来装载系统框架
你还可以同时使用 `loadZygote` 方法来装载新的进程被 fork 后的第一个事件 `initZygote`
> 示例如下

View File

@@ -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

View File

@@ -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) {

View File

@@ -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