import{_ as s,o as n,c as a,a as l}from"./app.09f06ad9.js";const e={},o=l(`
\u8FD9\u91CC\u4ECB\u7ECD\u4E86
YukiHookAPI
\u7684\u57FA\u672C\u914D\u7F6E\u65B9\u6CD5\u3002
\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
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
\u4E00\u4E2A Xposed \u6A21\u5757\u6216 Hook API \u6700\u91CD\u8981\u7684\u5730\u65B9\u5C31\u662F Hooker \u7684\u521B\u5EFA\u4E0E\u4F7F\u7528\uFF0C
YukiHookAPI
\u63D0\u4F9B\u4E86\u4E24\u79CD\u4F7F\u7528\u65B9\u6CD5\u3002
\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
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
\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
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
\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 ...)
}
\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)
}
\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.
}
}
}
\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
\u88C5\u8F7D initZygote
\u2192 encase
\u88C5\u8F7D handleLoadPackage
\u2192 encase
\u88C5\u8F7D handleInitPackageResources
\u2192 encase
\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 {
// ...
}
}
}
}
\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