import{_ as s,o as n,c as a,a as l}from"./app.01ee3d32.js";const e={},o=l(`

API \u57FA\u672C\u914D\u7F6E

\u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u7684\u57FA\u672C\u914D\u7F6E\u65B9\u6CD5\u3002

\u529F\u80FD\u914D\u7F6E

\u65E0\u8BBA\u662F \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528 \u8FD8\u662F \u4F5C\u4E3A Hook API \u4F7F\u7528\uFF0C\u4F60\u90FD\u53EF\u4EE5\u5728 API \u88C5\u8F7D\u4E4B\u524D\u6216\u88C5\u8F7D\u8FC7\u7A0B\u4E2D\u5BF9 YukiHookAPI \u8FDB\u884C\u914D\u7F6E\u3002

configs \u65B9\u6CD5

fun configs(initiate: Configs.() -> Unit)

configs \u65B9\u6CD5\u5BF9 Configs \u7C7B\u5B9E\u73B0\u4E86\u4E00\u4E2A lambda \u65B9\u6CD5\u4F53\uFF0C\u4F60\u53EF\u4EE5\u8F7B\u677E\u5730\u8C03\u7528\u5B83\u8FDB\u884C\u914D\u7F6E\u3002

\u5C0F\u63D0\u793A

\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookAPI.configs \u65B9\u6CD5\u3002

Hooker \u914D\u7F6E

\u4E00\u4E2A Xposed \u6A21\u5757\u6216 Hook API \u6700\u91CD\u8981\u7684\u5730\u65B9\u5C31\u662F Hooker \u7684\u521B\u5EFA\u4E0E\u4F7F\u7528\uFF0CYukiHookAPI \u63D0\u4F9B\u4E86\u4E24\u79CD\u4F7F\u7528\u65B9\u6CD5\u3002

\u901A\u8FC7 lambda \u521B\u5EFA

\u8FD9\u79CD\u65B9\u6848\u662F\u6700\u7B80\u5355\u7684\uFF0C\u5982\u679C\u4F60\u7684\u6A21\u5757\u529F\u80FD\u4E0D\u591A\uFF0C\u4EE3\u7801\u6570\u91CF\u4E0D\u5927\uFF0C\u4E0D\u9700\u8981\u8FDB\u884C\u5206\u7C7B\u5904\u7406\uFF0C\u63A8\u8350\u4F7F\u7528\u8FD9\u79CD\u65B9\u5F0F\u8FDB\u884C\u521B\u5EFA\u3002

encase \u65B9\u6CD5

fun encase(initiate: PackageParam.() -> Unit)

encase \u65B9\u6CD5\u662F Hook \u4E00\u5207\u751F\u547D\u7684\u5F00\u59CB\uFF0C\u5728\u4E00\u4E2A\u6A21\u5757\u6216\u4E00\u4E2A Hook \u8FC7\u7A0B\u4E2D\uFF0Cencase \u65B9\u6CD5\u53EA\u80FD\u4F5C\u7528\u4E00\u6B21\uFF0C\u7528\u4E8E\u521B\u5EFA Hooker\u3002

PackageParam \u4E3A\u5BBF\u4E3B(\u76EE\u6807 APP)\u7684\u91CD\u8981\u5B9E\u4F8B\u5BF9\u8C61\uFF0C\u901A\u8FC7 PackageParam \u6765\u5B9E\u73B0\u5BF9\u5F53\u524D Hook \u4F5C\u7528\u5BF9\u8C61\u7684\u5168\u90E8 Hook \u64CD\u4F5C\u3002

\u5C0F\u63D0\u793A

\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 PackageParam\u3002

encase \u65B9\u6CD5\u53EF\u4EE5\u5728 onHook \u65B9\u6CD5\u4E2D\u4F7F\u7528\u4E24\u79CD\u65B9\u6848\u521B\u5EFA\u3002

\u793A\u4F8B\u4EE3\u7801 1

YukiHookAPI.encase {
    loadApp(name = "com.example.demo") {
        findClass(name = "$packageName.DemoClass").hook { 
            // Your code here.
        }
    }
}

\u793A\u4F8B\u4EE3\u7801 2

encase {
    loadApp(name = "com.example.demo") {
        findClass(name = "$packageName.DemoClass").hook { 
            // Your code here.
        }
    }
}

\u5728 encase \u65B9\u6CD5\u4E2D\u8FDB\u884C\u4F60\u7684 Hook \u64CD\u4F5C\u3002

\u901A\u8FC7\u81EA\u5B9A\u4E49 Hooker \u521B\u5EFA

\u8FD9\u79CD\u65B9\u6848\u66F4\u52A0\u9002\u7528\u4E8E\u5927\u578B\u9879\u76EE\uFF0C\u4F8B\u5982\u9700\u8981\u5BF9 Hooker \u8FDB\u884C\u5206\u7C7B\u6216\u5BF9 Hook \u7684\u4F5C\u7528\u5BF9\u8C61\u8FDB\u884C\u5206\u7C7B\u3002

encase \u65B9\u6CD5

fun encase(vararg hooker: YukiBaseHooker)

\u540C\u6837\u4E3A encase \u65B9\u6CD5\uFF0C\u8FD9\u91CC\u7684\u65B9\u6CD5\u53EF\u53D8\u6570\u7EC4\u53C2\u6570 hooker \u4E3A\u521B\u5EFA\u5165\u53E3\u63D0\u4F9B\u4E86\u4E00\u4E2A\u5BF9\u8C61\uFF0C\u4F60\u53EF\u4EE5\u5C06\u6240\u6709\u7EE7\u627F\u4E8E YukiBaseHooker \u7684 Hooker \u4E00\u6B21\u6027\u8FDB\u884C\u88C5\u8F7D\u3002

YukiBaseHooker \u7528\u6CD5

YukiBaseHooker \u7EE7\u627F\u4E8E PackageParam\uFF0C\u4F60\u9700\u8981\u5C06\u4F60\u7684\u5B50 Hooker \u7EE7\u627F\u4E8E YukiBaseHooker\u3002

\u5C0F\u63D0\u793A

\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiBaseHooker\u3002

\u793A\u4F8B\u5982\u4E0B

object CustomHooker : YukiBaseHooker() {

    override fun onHook() {
        // Your code here.
    }
}

\u5B50 Hooker \u5EFA\u8BAE\u4F7F\u7528\u5355\u4F8B object \u521B\u5EFA\uFF0C\u4F60\u4E5F\u53EF\u4EE5\u4F7F\u7528 class \u4F46\u4E00\u822C\u60C5\u51B5\u4E0B\u4E0D\u63A8\u8350\u3002

\u6CE8\u610F

\u4F60\u65E0\u9700\u518D\u5728\u7EE7\u627F\u4E8E YukiBaseHooker \u7684 onHook \u65B9\u6CD5\u4E2D\u91CD\u65B0\u8C03\u7528 encase\uFF0C\u8FD9\u662F\u9519\u8BEF\u7684\uFF0C\u4E14\u4E0D\u4F1A\u751F\u6548\uFF0C\u4F60\u5E94\u8BE5\u76F4\u63A5\u5F00\u59CB\u7F16\u5199\u4F60\u7684 Hook \u4EE3\u7801\u3002

\u793A\u4F8B\u5982\u4E0B

object CustomHooker : YukiBaseHooker() {

    override fun onHook() {
        loadApp(name = "com.example.demo1") {
            findClass(name = "$packageName.DemoClass").hook { 
                // Your code here.
            }
        }
        loadApp(name = "com.example.demo2") {
            findClass(name = "$packageName.CustomClass").hook { 
                // Your code here.
            }
        }
    }
}

\u4F5C\u4E3A\u5B50 Hooker \u4F7F\u7528\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u5728\u5916\u90E8\u8C03\u7528 loadApp \u65B9\u6CD5\uFF0C\u7136\u540E\u5728\u5185\u90E8\u76F4\u63A5\u5F00\u59CB Hook\u3002

\u793A\u4F8B\u5982\u4E0B

object HookEntry : IYukiHookXposedInit {

    override fun onHook() = encase {
        loadApp(name = "com.example.demo", ChildCustomHooker)
    }
}

object ChildCustomHooker : YukiBaseHooker() {

    override fun onHook() {
        findClass(name = "$packageName.DemoClass").hook { 
            // Your code here.
        }
    }
}

\u4F60\u53EF\u4EE5\u4F7F\u7528 loadHooker \u65B9\u6CD5\u5728\u5B50 Hooker \u4E2D\u591A\u5C42\u88C5\u8F7D\u53E6\u4E00\u4E2A Hooker\uFF0C\u8BF7\u6309\u7167\u4F60\u7684\u559C\u597D\u8FDB\u884C\u5373\u53EF\u3002

\u793A\u4F8B\u5982\u4E0B

object FirstHooker : YukiBaseHooker() {

    override fun onHook() {
        findClass(name = "$packageName.DemoClass").hook { 
            // Your code here.
        }
        loadHooker(SecondHooker)
        loadHooker(ThirdHooker)
    }
}

\u642D\u5EFA\u5B8C\u5168\u90E8 Hooker \u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u5728\u4F60\u7684 Hook \u5165\u53E3\u7C7B\u4E2D\u7684 onHook \u65B9\u6CD5\u4E2D\u88C5\u8F7D\u4F60\u7684 Hooker \u4E86\u3002

\u793A\u4F8B\u5982\u4E0B

object HookEntry : IYukiHookXposedInit {

    override fun onHook() = 
        YukiHookAPI.encase(FirstHooker, SecondHooker, ThirdHooker ...)
}

\u5F53\u7136\uFF0C\u6211\u4EEC\u540C\u6837\u53EF\u4EE5\u5BF9\u5176\u8FDB\u884C\u7B80\u5199\u3002

\u793A\u4F8B\u5982\u4E0B

object HookEntry : IYukiHookXposedInit {

    override fun onHook() = encase(FirstHooker, SecondHooker, ThirdHooker ...)
}

\u7279\u6B8A\u60C5\u51B5

\u4E0A\u9762\u6211\u4EEC\u8BF4\u5230\uFF0C\u5728\u4E00\u822C\u60C5\u51B5\u4E0B\u4E0D\u63A8\u8350\u4F7F\u7528 class \u521B\u5EFA\u5B50 Hooker\uFF0C\u4F46\u662F\u6709\u4E00\u79CD\u7279\u6B8A\u60C5\u51B5\uFF0C\u5B83\u53EF\u80FD\u4F9D\u7136\u9700\u8981\u4FDD\u6301\u4F60\u7684 Hooker \u652F\u6301\u591A\u4F8B\u3002

\u6709\u6781\u5C11\u7684\u53EF\u80FD\u6027\u4F1A\u51FA\u73B0\u5728\u4E00\u4E2A\u8FDB\u7A0B\u4E2D\u5B58\u5728\u591A\u4E2A\u5305\u540D\u7684\u60C5\u51B5\uFF0C\u8FD9\u79CD\u60C5\u51B5\u4E0B\uFF0CYukiHookAPI \u53D1\u73B0\u5B50 Hooker \u4E3A\u5355\u4F8B\u65F6\uFF0C\u5C06\u4F1A\u5FFD\u7565\u5E76\u6253\u5370\u4E00\u6761\u8B66\u544A\u4FE1\u606F\u3002

This Hooker "HOOKER" is singleton or reused, but the current process has multiple package name "NAME", the original is "NAME"
Make sure your Hooker supports multiple instances for this situation
The process with package name "NAME" will be ignored

\u9047\u5230\u8FD9\u79CD\u60C5\u51B5\u65F6\uFF0C\u6211\u4EEC\u53EA\u9700\u8981\u4FEE\u6539 object \u4E3A class \u6216\u8005\u5728\u88C5\u8F7D\u65F6\u5224\u65AD\u5305\u540D\u540E\u518D\u88C5\u8F7D\u5B50 Hooker\u3002

\u4F8B\u5982\u4EE5\u4E0A\u60C5\u51B5\u4E2D\u53EF\u4F7F\u7528\u4EE5\u4E0B\u5F62\u5F0F\u6765\u88C5\u8F7D\u3002

\u793A\u4F8B\u5982\u4E0B

encase {
    // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u9700\u8981\u88C5\u8F7D\u7684 APP \u5305\u540D\u548C\u5B50 Hooker
    loadApp("com.example.demo", YourCustomHooker)
}

\u6269\u5C55\u7279\u6027

\u5982\u679C\u4F60\u5F53\u524D\u4F7F\u7528\u7684 Hook Framework \u652F\u6301\u5E76\u542F\u7528\u4E86\u8D44\u6E90\u94A9\u5B50(Resources Hook)\u529F\u80FD\uFF0C\u4F60\u73B0\u5728\u53EF\u4EE5\u76F4\u63A5\u5728 encase \u4E2D\u521B\u5EFA Resources Hook\u3002

\u4F60\u5B8C\u5168\u4E0D\u9700\u8981\u4E0E\u4E4B\u524D\u5728\u4F7F\u7528 Xposed API \u90A3\u6837\u533A\u5206 initZygote\u3001handleLoadPackage\u3001handleInitPackageResources \u65B9\u6CD5\u6765\u6267\u884C\u4E0D\u540C\u7684\u529F\u80FD\u3002

\u5728 YukiHookAPI \u4E2D\uFF0C\u8FD9\u4E9B\u529F\u80FD\u662F\u65E0\u7F1D\u7684\u3002

\u793A\u4F8B\u5982\u4E0B

encase {
    loadApp(name = "com.example.demo") {
        findClass(name = "$packageName.DemoClass").hook { 
            // Your code here.
        }
        // \u521B\u5EFA\u4E00\u4E2A Resources Hook (\u56FA\u5B9A\u7528\u6CD5)
        resources().hook {
            // Your code here.
        }
    }
}

\u4F60\u8FD8\u53EF\u4EE5\u540C\u65F6\u4F7F\u7528 loadZygote \u65B9\u6CD5\u6765\u88C5\u8F7D\u65B0\u7684\u8FDB\u7A0B\u88AB fork \u540E\u7684\u7B2C\u4E00\u4E2A\u4E8B\u4EF6 initZygote\u3002

\u793A\u4F8B\u5982\u4E0B

encase {
    loadZygote {
        ActivityClass.hook { 
            // Your code here.
        }
        // \u5728 Zygote \u4E2D\u521B\u5EFA Resources Hook
        resources().hook {
            // Your code here.
        }
    }
    loadApp(name = "com.example.demo") {
        findClass(name = "$packageName.DemoClass").hook { 
            // Your code here.
        }
        // \u5728 APP \u4E2D\u521B\u5EFA Resources Hook
        resources().hook {
            // Your code here.
        }
    }
}

\u6CE8\u610F\u4E8B\u9879

\u76F4\u63A5\u88C5\u8F7D Hooker \u6216\u76F4\u63A5\u5F00\u59CB Hook \u662F\u9519\u8BEF\u7684\uFF0Cencase \u4E8B\u4EF6\u5728\u88AB Hook Framework \u88C5\u8F7D\u540E\uFF0C\u4F1A\u7ECF\u5386\u4E09\u6B21\u56DE\u8C03\u3002

\u5728\u8FD9\u4E2A\u8FC7\u7A0B\u4E2D\uFF0C\u4F60\u9700\u8981\u4F7F\u7528 loadApp\u3001loadSystem\u3001loadZygote \u6765\u533A\u5206\u6BCF\u4E00\u6B21\u88C5\u8F7D\u4EE3\u7801\u7684\u8C03\u7528\u57DF\uFF0C\u5426\u5219\u4F60\u7684\u4EE3\u7801\u5C31\u4F1A\u88AB\u591A\u6B21\u6267\u884C\u9020\u6210\u9519\u8BEF\u3002

\u6CE8\u610F

\u65E0\u8BBA\u4F7F\u7528 encase \u521B\u5EFA lambda \u65B9\u6CD5\u4F53\u8FD8\u662F\u76F4\u63A5\u4F7F\u7528 Hooker \u5F62\u5F0F\uFF0C\u4F60\u90FD\u4E0D\u5E94\u8BE5\u76F4\u63A5\u5728\u9996\u4E2A onHook \u4E8B\u4EF6\u4E2D\u76F4\u63A5\u88C5\u8F7D Hooker \u6216\u76F4\u63A5\u5F00\u59CB Hook\u3002

\u4E0B\u9762\u662F\u4E24\u4E2A\u9519\u8BEF\u793A\u4F8B\u3002

\u793A\u4F8B\u4EE3\u7801 1

encase {
    // \u2757\u9519\u8BEF\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u5F00\u59CB Hook
    findClass(name = "com.example.demo.DemoClass").hook {
        // ...
    }
    // \u2757\u9519\u8BEF\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u5F00\u59CB Hook
    resources().hook {
        // ...
    }
}

\u793A\u4F8B\u4EE3\u7801 2

object HookEntry : IYukiHookXposedInit {

    override fun onHook() {
        // <\u60C5\u666F1>
        encase {
            loadHooker(CustomHooker)
        }
        // <\u60C5\u666F2>
        encase(CustomHooker)
    }
}

object CustomHooker : YukiBaseHooker() {

    override fun onHook() {
        // \u2757\u9519\u8BEF\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u7531\u4E8E\u5916\u5C42\u6CA1\u6709\u4EFB\u4F55\u5224\u65AD\u5BF9\u8C61\uFF0C\u4E0D\u80FD\u76F4\u63A5\u5F00\u59CB Hook
        findClass(name = "com.example.demo.DemoClass").hook {
            // ...
        }
    }
}

\u4E0B\u9762\u662F\u4E0A\u8FF0\u9519\u8BEF\u793A\u4F8B\u7684\u6B63\u786E\u793A\u4F8B\u3002

\u793A\u4F8B\u4EE3\u7801 1

encase {
    // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5728 Zygote \u4E2D\u88C5\u8F7D
    loadZygote(CustomHooker)
     // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5728 Zygote \u4E2D\u88C5\u8F7D
    loadZygote {
        // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5728 Zygote \u5185 Hook
        resources().hook {
            // ...
        }
    }
    // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u4F7F\u7528 APP \u4F5C\u7528\u57DF\u88C5\u8F7D
    loadApp(/** name \u53C2\u6570\u53EF\u9009 */, hooker = CustomHooker)
    // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5224\u65AD APP \u4F5C\u7528\u57DF\u540E\u518D\u88C5\u8F7D Hooker
    loadApp(/** name \u53C2\u6570\u53EF\u9009 */) {
        loadHooker(CustomHooker)
         // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5728 APP \u4F5C\u7528\u57DF\u5185 Hook
        findClass(name = "com.example.demo.DemoClass").hook {
            // ...
        }
        // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5728 APP \u4F5C\u7528\u57DF\u5185 Hook
        resources().hook {
            // ...
        }
    }
}

\u793A\u4F8B\u4EE3\u7801 2

object HookEntry : IYukiHookXposedInit {

    override fun onHook() {
        encase(CustomHooker)
    }
}

object CustomHooker : YukiBaseHooker() {

    override fun onHook() {
        // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u7531\u4E8E\u5916\u5C42\u6CA1\u6709\u4EFB\u4F55\u5224\u65AD\u5BF9\u8C61\uFF0C\u9700\u8981\u5224\u65AD APP \u4F5C\u7528\u57DF\u540E\u518D\u8FDB\u884C Hook
        loadApp(/** name \u53C2\u6570\u53EF\u9009 */) {
            findClass(name = "com.example.demo.DemoClass").hook {
                // ...
            }
        }
    }
}

\u4F5C\u4E3A Hook API \u4F7F\u7528\u9700\u8981\u6CE8\u610F\u7684\u5730\u65B9

\u82E5\u4F60\u4F5C\u4E3A Hook API \u4F7F\u7528\uFF0C\u90A3\u4E48\u4F60\u53EA\u9700\u8981\u5728\u5165\u53E3\u5904\u5BF9 encase \u65B9\u6CD5\u8FDB\u884C\u533A\u5206\u3002

\u6CE8\u610F

encase \u65B9\u6CD5\u5BF9\u4F5C\u4E3A Hook API \u4F7F\u7528\u63D0\u4F9B\u4E86\u4E24\u4E2A\u5B8C\u5168\u4E00\u6837\u7684\u65B9\u6CD5\uFF0C\u4F46\u662F\u6BD4\u524D\u4E24\u8005\u4EC5\u591A\u51FA\u4E00\u4E2A\u53C2\u6570 baseContext\u3002

\u65B9\u6CD5 1

fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)

\u65B9\u6CD5 2

fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)

\u6B64\u5904\u7684 baseContext \u53EA\u9700\u586B\u5165\u4F60\u5728 attachBaseContext \u5904\u5F97\u5230\u7684 Context \u5373\u53EF\uFF0C\u5176\u5B83\u7528\u6CD5\u4E0E\u4E0A\u8FF0\u5185\u5BB9\u5B8C\u5168\u4E00\u81F4\u3002

\u7279\u522B\u6CE8\u610F

\u5207\u52FF\u4EE5 Xposed \u65B9\u5F0F\u4F7F\u7528 encase \u65B9\u6CD5\u800C\u6F0F\u6389 baseContext \u53C2\u6570\uFF0C\u5426\u5219\u4F60\u7684 Hook \u5C06\u5B8C\u5168\u4E0D\u5DE5\u4F5C\u3002

Resources Hook \u529F\u80FD\u4E0D\u652F\u6301\u4F5C\u4E3A Hook API \u4F7F\u7528\u3002

`,90),p=[o];function c(i,r){return n(),a("div",null,p)}const d=s(e,[["render",c],["__file","api-example.html.vue"]]);export{d as default};