import{_ as s,o as n,c as a,a as l}from"./app.0df13dd9.js";const o={},e=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\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
class 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 HookEntryClass
\u5165\u53E3\u7C7B\u4E2D\u7684 onHook
\u65B9\u6CD5\u4E2D\u88C5\u8F7D\u4F60\u7684 Hooker \u4E86\u3002
\u793A\u4F8B\u5982\u4E0B
class 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
class HookEntry : IYukiHookXposedInit {
override fun onHook() = encase(FirstHooker, SecondHooker, ThirdHooker ...)
}
\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
class 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
class 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