import{_ as o,r as p,o as c,c as i,b as s,d as e,a as l,e as n}from"./app.b0c3bf74.js";const r={},t=l(`

\u7528\u6CD5\u793A\u4F8B

\u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u7684\u57FA\u672C\u5DE5\u4F5C\u65B9\u5F0F\u4EE5\u53CA\u5217\u4E3E\u4E86\u7B80\u5355\u7684 Hook \u4F8B\u5B50\u548C\u5E38\u7528\u529F\u80FD\u3002

\u7ED3\u6784\u56FE\u89E3

\u4E0B\u65B9\u7684\u7ED3\u6784\u63CF\u8FF0\u4E86 YukiHookAPI \u7684\u57FA\u672C\u5DE5\u4F5C\u65B9\u5F0F\u548C\u539F\u7406\u3002

Host Environment
\u2514\u2500\u2500 YukiMemberHookCreator
    \u2514\u2500\u2500 Class
        \u2514\u2500\u2500 MemberHookCreator
            \u2514\u2500\u2500 Member
                \u251C\u2500\u2500 Before
                \u2514\u2500\u2500 After
            MemberHookCreator
            \u2514\u2500\u2500 Member
                \u251C\u2500\u2500 Before
                \u2514\u2500\u2500 After
            ...
    YukiResourcesHookCreator
    \u2514\u2500\u2500 Resources
        \u2514\u2500\u2500 ResourcesHookCreator
            \u2514\u2500\u2500 Drawable
                \u2514\u2500\u2500 Replace
            ResourcesHookCreator
            \u2514\u2500\u2500 Layout
                \u2514\u2500\u2500 Inject
            ...

\u4E0A\u65B9\u7684\u7ED3\u6784\u6362\u505A\u4EE3\u7801\u5C06\u53EF\u5199\u4E3A\u5982\u4E0B\u5F62\u5F0F\u3002

TargetClass.hook { 
    injectMember { 
        method { 
            // Your code here.
        }
        beforeHook {
            // Your code here.
        }
        afterHook {
            // Your code here.
        }
    }
}
resources().hook {
    injectResource {
        conditions {
            // Your code here.
        }
        replaceTo(...)
    }
}

Demo

\u4F60\u53EF\u4EE5\u5728\u4E0B\u65B9\u627E\u5230 API \u63D0\u4F9B\u7684 Demo \u6765\u5B66\u4E60 YukiHookAPI \u7684\u4F7F\u7528\u65B9\u6CD5\u3002

`,9),d=n("\u5BBF\u4E3B APP Demo "),u={href:"https://github.com/fankes/YukiHookAPI/tree/master/demo-app",target:"_blank",rel:"noopener noreferrer"},A=n("\u70B9\u51FB\u8FD9\u91CC\u67E5\u770B"),v=n("\u6A21\u5757 APP Demo "),y={href:"https://github.com/fankes/YukiHookAPI/tree/master/demo-module",target:"_blank",rel:"noopener noreferrer"},m=n("\u70B9\u51FB\u8FD9\u91CC\u67E5\u770B"),b=l(`

\u540C\u65F6\u5B89\u88C5\u5BBF\u4E3B\u548C\u6A21\u5757 Demo\uFF0C\u901A\u8FC7\u6FC0\u6D3B\u6A21\u5757\u6765\u6D4B\u8BD5\u5BBF\u4E3B\u4E2D\u88AB Hook \u7684\u529F\u80FD\u3002

\u4E00\u4E2A\u7B80\u5355\u7684 Hook \u4F8B\u5B50

\u8FD9\u91CC\u7ED9\u51FA\u4E86 Hook APP\u3001Hook \u7CFB\u7EDF\u6846\u67B6\u4E0E Hook Resources \u7B49\u4F8B\u5B50\uFF0C\u53EF\u4F9B\u53C2\u8003\u3002

Hook APP

\u5047\u8BBE\uFF0C\u6211\u4EEC\u8981 Hook com.android.browser \u4E2D\u7684 onCreate \u65B9\u6CD5\u5E76\u5F39\u51FA\u4E00\u4E2A\u5BF9\u8BDD\u6846\u3002

\u5728 encase \u65B9\u6CD5\u4F53\u4E2D\u6DFB\u52A0\u4EE3\u7801\u3002

\u793A\u4F8B\u5982\u4E0B

loadApp(name = "com.android.browser") {
    ActivityClass.hook { 
        injectMember { 
            method { 
                name = "onCreate"
                param(BundleClass)
                returnType = UnitType
            }
            afterHook {
                AlertDialog.Builder(instance())
                    .setTitle("Hooked")
                    .setMessage("I am hook!")
                    .setPositiveButton("OK", null)
                    .show()
            }
        }
    }
}

\u81F3\u6B64\uFF0ConCreate \u65B9\u6CD5\u5C06\u88AB\u6210\u529F Hook \u5E76\u5728 com.android.browser \u4E2D\u7684\u6BCF\u4E2A Activity \u542F\u52A8\u65F6\u5F39\u51FA\u6B64\u5BF9\u8BDD\u6846\u3002

\u90A3\u4E48\uFF0C\u6211\u60F3\u7EE7\u7EED Hook onStart \u65B9\u6CD5\u8981\u600E\u4E48\u505A\u5462\uFF1F

\u5728\u521A\u521A\u7684\u4EE3\u7801\u4E2D\uFF0C\u7EE7\u7EED\u63D2\u5165\u4E00\u4E2A injectMember \u65B9\u6CD5\u4F53\u5373\u53EF\u3002

\u793A\u4F8B\u5982\u4E0B

loadApp(name = "com.android.browser") {
    ActivityClass.hook { 
        injectMember { 
            method { 
                name = "onCreate"
                param(BundleClass)
                returnType = UnitType
            }
            afterHook {
                AlertDialog.Builder(instance())
                    .setTitle("Hooked")
                    .setMessage("I am hook!")
                    .setPositiveButton("OK", null)
                    .show()
            }
        }
        injectMember { 
            method { 
                name = "onStart"
                emptyParam()
                returnType = UnitType
            }
            afterHook {
                // Your code here.
            }
        }
    }
}

\u5BF9\u4E8E\u5F53\u524D\u9879\u76EE\u4E0B\u6CA1\u6709\u7684 Class\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 stub \u65B9\u5F0F\u6216 findClass \u65B9\u6CD5\u6765\u5F97\u5230\u9700\u8981 Hook \u7684\u7C7B\u3002

\u6BD4\u5982\uFF0C\u6211\u8981\u5F97\u5230 com.example.demo.TestClass\u3002

\u793A\u4F8B\u5982\u4E0B

findClass(name = "com.example.demo.TestClass").hook {
    injectMember {
        // Your code here.
    }
}

\u82E5 com.example.demo \u662F\u4F60\u8981 Hook \u7684 APP\uFF0C\u90A3\u4E48\u5199\u6CD5\u53EF\u4EE5\u66F4\u7B80\u5355\u3002

\u793A\u4F8B\u5982\u4E0B

findClass(name = "$packageName.TestClass").hook {
    injectMember {
        // Your code here.
    }
}

\u5230\u8FD9\u91CC\u6709\u4E9B\u540C\u5B66\u53EF\u80FD\u5C31\u5F00\u59CB\u8BF4\u4E86\uFF0C\u5728\u67D0\u4E9B\u573A\u666F\u4E0B findClass \u663E\u5F97\u6709\u4E9B\u7E41\u7410\u3002

\u56E0\u4E3A\u53EF\u80FD\u6709\u4E9B\u540C\u5B66\u6709\u5982\u4E0B\u9700\u6C42\u3002

\u793A\u4F8B\u5982\u4E0B

const val TestClass = "com.example.demo.TestClass"

TestClass.hook {
    injectMember {
        // Your code here.
    }
}

\u6CA1\u5173\u7CFB\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528\u5B57\u7B26\u4E32\u7C7B\u540D\u76F4\u63A5\u521B\u5EFA\u4E00\u4E2A Hook\u3002

\u793A\u4F8B\u5982\u4E0B

"$packageName.TestClass".hook {
    injectMember {
        // Your code here.
    }
}

\u5C0F\u63D0\u793A

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

Hook Zygote

\u5728 APP \u542F\u52A8\u65F6\uFF0C\u65B0\u7684\u8FDB\u7A0B\u88AB fork \u540E\u7684\u7B2C\u4E00\u4E2A\u4E8B\u4EF6 initZygote\u3002

\u5047\u8BBE\u6211\u4EEC\u8981\u5168\u5C40 Hook \u4E00\u4E2A APP Activity \u7684 onCreate \u4E8B\u4EF6

\u5728 encase \u65B9\u6CD5\u4F53\u4E2D\u6DFB\u52A0\u4EE3\u7801\u3002

\u793A\u4F8B\u5982\u4E0B

loadZygote {
    ActivityClass.hook { 
        injectMember { 
            method { 
                name = "onCreate"
                param(BundleClass)
                returnType = UnitType
            }
            afterHook {
                // Your code here.
            }
        }
    }
}

\u6CE8\u610F

\u5728 loadZygote \u4E2D\u8FDB\u884C\u7684\u529F\u80FD\u5341\u5206\u6709\u9650\uFF0C\u51E0\u4E4E\u5F88\u5C11\u7684\u60C5\u51B5\u4E0B\u9700\u8981\u7528\u5230 loadZygote \u65B9\u6CD5\u3002

Hook \u7CFB\u7EDF\u6846\u67B6

\u5728 YukiHookAPI \u4E2D\uFF0CHook \u7CFB\u7EDF\u6846\u67B6\u7684\u5B9E\u73B0\u975E\u5E38\u7B80\u5355\u3002

\u5047\u8BBE\uFF0C\u4F60\u8981\u5F97\u5230 ApplicationInfo \u4E0E PackageInfo \u5E76\u5BF9\u5B83\u4EEC\u8FDB\u884C\u4E00\u4E9B\u64CD\u4F5C\u3002

\u5728 encase \u65B9\u6CD5\u4F53\u4E2D\u6DFB\u52A0\u4EE3\u7801\u3002

\u793A\u4F8B\u5982\u4E0B

loadSystem {
    ApplicationInfoClass.hook {
        // Your code here.
    }
    PackageInfoClass.hook {
        // Your code here.
    }
}

\u7279\u522B\u6CE8\u610F

loadZygote \u4E0E loadSystem \u6709\u76F4\u63A5\u6027\u533A\u522B\uFF0CloadZygote \u4F1A\u5728 initZygote \u4E2D\u88C5\u8F7D\uFF0C\u7CFB\u7EDF\u6846\u67B6\u88AB\u89C6\u4E3A loadApp(name = "android") \u800C\u5B58\u5728\uFF0C\u82E5\u8981 Hook \u7CFB\u7EDF\u6846\u67B6\uFF0C\u53EF\u76F4\u63A5\u4F7F\u7528 loadSystem\u3002

Hook Resources

\u5047\u8BBE\uFF0C\u6211\u4EEC\u8981 Hook com.android.browser \u4E2D string \u7C7B\u578B\u7684 app_name \u5185\u5BB9\u66FF\u6362\u4E3A 123\u3002

\u5728 encase \u65B9\u6CD5\u4F53\u4E2D\u6DFB\u52A0\u4EE3\u7801\u3002

\u793A\u4F8B\u5982\u4E0B

loadApp(name = "com.android.browser") {
    resources().hook {
        injectResource {
            conditions {
                name = "app_name"
                string()
            }
            replaceTo("123")
        }
    }
}

\u82E5\u5F53\u524D APP \u4F7F\u7528 app_name \u8BBE\u7F6E\u4E86\u6807\u9898\u680F\u6587\u672C\uFF0C\u5219\u5B83\u5C31\u4F1A\u53D8\u6210\u6211\u4EEC\u7684 123\u3002

\u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528\u5F53\u524D Xposed \u6A21\u5757\u7684 Resources \u66FF\u6362 Hook APP \u7684 Resources\u3002

\u5047\u8BBE\uFF0C\u6211\u4EEC\u8981\u7EE7\u7EED Hook com.android.browser \u4E2D mipmap \u7C7B\u578B\u7684 ic_launcher\u3002

\u793A\u4F8B\u5982\u4E0B

loadApp(name = "com.android.browser") {
    resources().hook {
        injectResource {
            conditions {
                name = "ic_launcher"
                mipmap()
            }
            replaceToModuleResource(R.mipmap.ic_launcher)
        }
    }
}

\u81F3\u6B64\u76EE\u6807 APP \u7684\u56FE\u6807\u5C06\u4F1A\u88AB\u66FF\u6362\u4E3A\u6211\u4EEC\u8BBE\u7F6E\u7684\u56FE\u6807\u3002

\u82E5\u4F60\u60F3\u66FF\u6362\u7CFB\u7EDF\u6846\u67B6\u7684\u8D44\u6E90\uFF0C\u540C\u6837\u4E5F\u53EF\u4EE5\u8FD9\u6837\u5B9E\u73B0\uFF0C\u53EA\u9700\u8981\u628A loadApp \u6362\u6210 loadZygote \u5373\u53EF\u3002

\u793A\u4F8B\u5982\u4E0B

loadZygote {
    resources().hook {
        // Your code here.
    }
}

\u5C0F\u63D0\u793A

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

\u89E3\u9664 Hook

\u539F\u751F\u7684 Xposed \u4E3A\u6211\u4EEC\u63D0\u4F9B\u4E86\u4E00\u4E2A XC_MethodHook.Unhook \u529F\u80FD\uFF0C\u53EF\u4EE5\u4ECE Hook \u961F\u5217\u4E2D\u5C06\u5F53\u524D Hook \u79FB\u9664\uFF0CYukiHookAPI \u540C\u6837\u53EF\u4EE5\u5B9E\u73B0\u6B64\u529F\u80FD\u3002

\u7B2C\u4E00\u79CD\u65B9\u6CD5\uFF0C\u4FDD\u5B58\u5F53\u524D\u6CE8\u5165\u5BF9\u8C61\u7684 Result \u5B9E\u4F8B\uFF0C\u5728\u9002\u5F53\u7684\u65F6\u5019\u548C\u5730\u65B9\u8C03\u7528 remove \u5373\u53EF\u89E3\u9664\u8BE5\u6CE8\u5165\u5BF9\u8C61\u3002

\u793A\u4F8B\u5982\u4E0B

// \u8BBE\u7F6E\u4E00\u4E2A\u53D8\u91CF\u4FDD\u5B58\u5F53\u524D\u5B9E\u4F8B
val hookResult = injectMember { 
    method { 
        name = "test"
        returnType = UnitType
    }
    afterHook {
        // ...
    }
}
// \u5728\u9002\u5F53\u7684\u65F6\u5019\u8C03\u7528\u5982\u4E0B\u65B9\u6CD5\u5373\u53EF
hookResult.remove()

\u7B2C\u4E8C\u79CD\u65B9\u6CD5\uFF0C\u5728 Hook \u56DE\u8C03\u65B9\u6CD5\u4E2D\u8C03\u7528 removeSelf \u79FB\u9664\u81EA\u8EAB\u3002

\u793A\u4F8B\u5982\u4E0B

injectMember { 
    method { 
        name = "test"
        returnType = UnitType
    }
    afterHook {
        // \u76F4\u63A5\u8C03\u7528\u5982\u4E0B\u65B9\u6CD5\u5373\u53EF
        removeSelf()
    }
}

\u5C0F\u63D0\u793A

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

\u5F02\u5E38\u5904\u7406

YukiHookAPI \u91CD\u65B0\u8BBE\u8BA1\u4E86\u5BF9\u5F02\u5E38\u7684\u76D1\u542C\uFF0C\u4EFB\u4F55\u5F02\u5E38\u90FD\u4E0D\u4F1A\u5728 Hook \u8FC7\u7A0B\u4E2D\u629B\u51FA\uFF0C\u907F\u514D\u6253\u65AD\u4E0B\u4E00\u4E2A Hook \u6D41\u7A0B\u5BFC\u81F4 Hook \u8FDB\u7A0B\u201C\u6B7B\u6389\u201D\u3002

\u76D1\u542C\u5F02\u5E38

\u4F60\u53EF\u4EE5\u5904\u7406 Hook \u65B9\u6CD5\u8FC7\u7A0B\u53D1\u751F\u7684\u5F02\u5E38\u3002

\u793A\u4F8B\u5982\u4E0B

injectMember {
    // Your code here.
}.result {
    // \u5904\u7406 Hook \u5F00\u59CB\u65F6\u7684\u5F02\u5E38
    onHookingFailure {}
    // \u5904\u7406 Hook \u8FC7\u7A0B\u4E2D\u7684\u5F02\u5E38
    onConductFailure { param, throwable -> }
    // \u5904\u7406\u5168\u90E8\u5F02\u5E38
    onAllFailure {}
    // ...
}

\u5728 Resources Hook \u65F6\u6B64\u65B9\u6CD5\u540C\u6837\u9002\u7528\u3002

\u793A\u4F8B\u5982\u4E0B

injectResource {
    // Your code here.
}.result {
    // \u5904\u7406 Hook \u65F6\u7684\u4EFB\u610F\u5F02\u5E38
    onHookingFailure {}
    // ...
}

\u4F60\u8FD8\u53EF\u4EE5\u5904\u7406 Hook \u7684 Class \u4E0D\u5B58\u5728\u65F6\u53D1\u751F\u7684\u5F02\u5E38\u3002

\u793A\u4F8B\u5982\u4E0B

TargetClass.hook {
    injectMember {
        // Your code here.
    }
}.onHookClassNotFoundFailure {
    // Your code here.
}

\u4F60\u8FD8\u53EF\u4EE5\u5904\u7406\u67E5\u627E\u65B9\u6CD5\u65F6\u7684\u5F02\u5E38\u3002

\u793A\u4F8B\u5982\u4E0B

method {
    // Your code here.
}.onNoSuchMethod {
    // Your code here.
}

\u5C0F\u63D0\u793A

\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 MemberHookCreator.Result\u3001ResourcesHookCreator.Result\u3002

\u8FD9\u91CC\u4ECB\u7ECD\u4E86\u53EF\u80FD\u53D1\u751F\u7684\u5E38\u89C1\u5F02\u5E38\uFF0C\u82E5\u8981\u4E86\u89E3\u66F4\u591A\u8BF7\u53C2\u8003 API \u5F02\u5E38\u5904\u7406\u3002

\u629B\u51FA\u5F02\u5E38

\u5728\u67D0\u4E9B\u60C5\u51B5\u4E0B\uFF0C\u4F60\u53EF\u4EE5\u624B\u52A8\u629B\u51FA\u5F02\u5E38\u6765\u8FBE\u5230\u63D0\u9192\u67D0\u4E9B\u529F\u80FD\u5B58\u5728\u95EE\u9898\u7684\u76EE\u7684\u3002

\u4E0A\u9762\u5DF2\u7ECF\u4ECB\u7ECD\u8FC7\uFF0C\u5728 hook \u65B9\u6CD5\u4F53\u5185\u629B\u51FA\u7684\u5F02\u5E38\u4F1A\u88AB YukiHookAPI \u63A5\u7BA1\uFF0C\u907F\u514D\u6253\u65AD\u4E0B\u4E00\u4E2A Hook \u6D41\u7A0B\u5BFC\u81F4 Hook \u8FDB\u7A0B\u201C\u6B7B\u6389\u201D\u3002

\u4EE5\u4E0B\u662F YukiHookAPI \u63A5\u7BA1\u65F6\u8FD9\u4E9B\u5F02\u5E38\u7684\u8FD0\u4F5C\u65B9\u5F0F\u3002

\u793A\u4F8B\u5982\u4E0B

// <\u60C5\u666F1>
injectMember {
    method {
        throw RuntimeException("Exception Test")
    }
    afterHook {
        // ...
    }
}.result {
    // \u80FD\u591F\u6355\u83B7\u5230 RuntimeException
    onHookingFailure {}
}
// <\u60C5\u666F2>
injectMember {
    method {
        // ...
    }
    afterHook {
        throw RuntimeException("Exception Test")
    }
}.result {
    // \u80FD\u591F\u6355\u83B7\u5230 RuntimeException
    onConductFailure { param, throwable -> }
}

\u4EE5\u4E0A\u60C5\u666F\u53EA\u4F1A\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u88AB\u5904\u7406\uFF0C\u4E0D\u4F1A\u5BF9\u5BBF\u4E3B\u81EA\u8EAB\u9020\u6210\u4EFB\u4F55\u5F71\u54CD\u3002

\u82E5\u6211\u4EEC\u60F3\u5C06\u8FD9\u4E9B\u5F02\u5E38\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B\uFF0C\u539F\u751F\u7684 Xposed \u4E3A\u6211\u4EEC\u63D0\u4F9B\u4E86 param.throwable \u65B9\u6CD5\uFF0CYukiHookAPI \u540C\u6837\u53EF\u4EE5\u5B9E\u73B0\u6B64\u529F\u80FD\u3002

\u82E5\u60F3\u5728 Hook \u56DE\u8C03\u65B9\u6CD5\u4F53\u4E2D\u5C06\u4E00\u4E2A\u5F02\u5E38\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B\uFF0C\u53EF\u4EE5\u6709\u5982\u4E0B\u5B9E\u73B0\u65B9\u6CD5\u3002

\u793A\u4F8B\u5982\u4E0B

injectMember {
    method {
        // ...
    }
    afterHook {
        RuntimeException("Exception Test").throwToApp()
    }
}

\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5728 Hook \u56DE\u8C03\u65B9\u6CD5\u4F53\u4E2D\u629B\u51FA\u5F02\u5E38\uFF0C\u7136\u540E\u6807\u8BC6\u5C06\u5F02\u5E38\u629B\u7ED9\u5BBF\u4E3B\u3002

\u793A\u4F8B\u5982\u4E0B

injectMember {
    method {
        // ...
    }
    afterHook {
        throw RuntimeException("Exception Test")
    }.onFailureThrowToApp()
}

\u4EE5\u4E0A\u4E24\u79CD\u65B9\u6CD5\u5747\u53EF\u5728\u5BBF\u4E3B\u63A5\u6536\u5230\u5F02\u5E38\u4ECE\u800C\u4F7F\u5BBF\u4E3B\u8FDB\u7A0B\u5D29\u6E83\u3002

\u6CE8\u610F

\u4E3A\u4E86\u4FDD\u8BC1 Hook \u8C03\u7528\u57DF\u4E0E\u5BBF\u4E3B\u5185\u8C03\u7528\u57DF\u76F8\u4E92\u9694\u79BB\uFF0C\u5F02\u5E38\u53EA\u6709\u5728 beforeHook \u4E0E afterHook \u56DE\u8C03\u65B9\u6CD5\u4F53\u4E2D\u624D\u80FD\u629B\u7ED9\u5BBF\u4E3B\u3002

\u5C0F\u63D0\u793A

\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 Throwable.throwToApp\u3001YukiMemberHookCreator.MemberMookCreator.HookCallback\u3002

\u72B6\u6001\u76D1\u542C

\u5728\u4F7F\u7528 XposedHelpers \u7684\u540C\u5B66\u5F80\u5F80\u4F1A\u5728 Hook \u540E\u6253\u5370 Unhook \u7684\u65B9\u6CD5\u786E\u5B9A\u662F\u5426 Hook \u6210\u529F\u3002

\u5728 YukiHookAPI \u4E2D\uFF0C\u4F60\u53EF\u4EE5\u7528\u4EE5\u4E0B\u65B9\u6CD5\u65B9\u4FBF\u5730\u91CD\u65B0\u5B9E\u73B0\u8FD9\u4E2A\u529F\u80FD\u3002

\u9996\u5148\u6211\u4EEC\u53EF\u4EE5\u76D1\u542C Hook \u5DF2\u7ECF\u51C6\u5907\u5F00\u59CB\u3002

\u793A\u4F8B\u5982\u4E0B

YourClass.hook {
    // Your code here.
}.onPrepareHook {
    loggerD(msg = "$instanceClass hook start")
}

\u7279\u522B\u6CE8\u610F

instanceClass \u5EFA\u8BAE\u53EA\u5728 onPrepareHook \u4E2D\u4F7F\u7528\uFF0C\u5426\u5219\u88AB Hook \u7684 Class \u4E0D\u5B58\u5728\u4F1A\u629B\u51FA\u65E0\u6CD5\u62E6\u622A\u7684\u5F02\u5E38\u5BFC\u81F4 Hook \u8FDB\u7A0B\u201C\u6B7B\u6389\u201D\u3002

\u7136\u540E\uFF0C\u6211\u4EEC\u8FD8\u53EF\u4EE5\u5BF9 Hook \u7684\u65B9\u6CD5\u7ED3\u679C\u8FDB\u884C\u76D1\u542C\u662F\u5426\u6210\u529F\u3002

\u793A\u4F8B\u5982\u4E0B

injectMember {
    // Your code here.
}.onHooked { member ->
    loggerD(msg = "$member has hooked")
}

\u6269\u5C55\u7528\u6CD5

\u4F60\u53EF\u4EE5\u5728 Hook \u8FC7\u7A0B\u4E2D\u4F7F\u7528\u4E0B\u9762\u7684\u65B9\u6CD5\u65B9\u4FBF\u5730\u5B9E\u73B0\u5404\u79CD\u5224\u65AD\u548C\u529F\u80FD\u3002

\u591A\u4E2A\u5BBF\u4E3B

\u5982\u679C\u4F60\u7684\u6A21\u5757\u9700\u8981\u540C\u65F6\u5904\u7406\u591A\u4E2A APP \u7684 Hook \u4E8B\u4EF6\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 loadApp \u65B9\u6CD5\u4F53\u6765\u533A\u5206\u4F60\u8981 Hook \u7684 APP\u3002

\u793A\u4F8B\u5982\u4E0B

loadApp(name = "com.android.browser") {
    // Your code here.
}
loadApp(name = "com.android.phone") {
    // Your code here.
}

\u5C0F\u63D0\u793A

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

\u591A\u4E2A\u8FDB\u7A0B

\u5982\u679C\u4F60 Hook \u7684\u5BBF\u4E3B APP \u6709\u591A\u4E2A\u8FDB\u7A0B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 withProcess \u65B9\u6CD5\u4F53\u6765\u5BF9\u5B83\u4EEC\u5206\u522B\u8FDB\u884C Hook\u3002

\u793A\u4F8B\u5982\u4E0B

withProcess(mainProcessName) {
    // Your code here.
}
withProcess(name = "$packageName:tool") {
    // Your code here.
}

\u5C0F\u63D0\u793A

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

\u5199\u6CD5\u4F18\u5316

\u4E3A\u4E86\u4F7F\u4EE3\u7801\u66F4\u52A0\u7B80\u6D01\uFF0C\u4F60\u53EF\u4EE5\u5220\u53BB YukiHookAPI \u7684\u540D\u79F0\uFF0C\u5C06\u4F60\u7684 onHook \u5165\u53E3\u5199\u4F5C lambda \u5F62\u5F0F\u3002

\u793A\u4F8B\u5982\u4E0B

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

Xposed \u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001

\u901A\u5E38\u60C5\u51B5\u4E0B\uFF0C\u6211\u4EEC\u4F1A\u9009\u62E9\u5199\u4E00\u4E2A\u65B9\u6CD5\uFF0C\u4F7F\u5176\u8FD4\u56DE false\uFF0C\u7136\u540E Hook \u6389\u8FD9\u4E2A\u65B9\u6CD5\u4F7F\u5176\u8FD4\u56DE true \u6765\u8BC1\u660E Hook \u5DF2\u7ECF\u751F\u6548\u3002

\u5728 YukiHookAPI \u4E2D\u4F60\u5B8C\u5168\u4E0D\u9700\u8981\u518D\u8FD9\u4E48\u505A\u4E86\uFF0CYukiHookAPI \u5DF2\u7ECF\u5E2E\u4F60\u5C01\u88C5\u597D\u4E86\u8FD9\u4E2A\u64CD\u4F5C\uFF0C\u4F60\u53EF\u4EE5\u76F4\u63A5\u8FDB\u884C\u4F7F\u7528\u3002

\u73B0\u5728\uFF0C\u4F60\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 YukiHookAPI.Status.isXposedModuleActive \u5728\u6A21\u5757\u4E2D\u5224\u65AD\u81EA\u8EAB\u662F\u5426\u88AB\u6FC0\u6D3B\u3002

\u793A\u4F8B\u5982\u4E0B

if(YukiHookAPI.Status.isXposedModuleActive) {
    // Your code here.
}

\u7531\u4E8E\u4E00\u4E9B\u7279\u6B8A\u539F\u56E0\uFF0C\u5728\u592A\u6781\u3001\u65E0\u6781\u4E2D\u7684\u6A21\u5757\u65E0\u6CD5\u4F7F\u7528\u6807\u51C6\u65B9\u6CD5\u68C0\u6D4B\u6FC0\u6D3B\u72B6\u6001\u3002

\u6B64\u65F6\u4F60\u53EF\u4EE5\u4F7F\u7528 YukiHookAPI.Status.isTaiChiModuleActive \u5224\u65AD\u81EA\u8EAB\u662F\u5426\u88AB\u6FC0\u6D3B\u3002

\u793A\u4F8B\u5982\u4E0B

if(YukiHookAPI.Status.isTaiChiModuleActive) {
    // Your code here.
}

\u82E5\u4F60\u60F3\u4F7F\u7528\u4E24\u8005\u5F97\u517C\u7684\u5224\u65AD\u65B9\u6848\uFF0CYukiHookAPI \u540C\u6837\u4E3A\u4F60\u5C01\u88C5\u4E86\u4FBF\u6377\u7684\u65B9\u5F0F\u3002

\u6B64\u65F6\u4F60\u53EF\u4EE5\u4F7F\u7528 YukiHookAPI.Status.isModuleActive \u5224\u65AD\u81EA\u8EAB\u662F\u5426\u5728 Xposed \u6216\u592A\u6781\u3001\u65E0\u6781\u4E2D\u88AB\u6FC0\u6D3B\u3002

\u793A\u4F8B\u5982\u4E0B

if(YukiHookAPI.Status.isModuleActive) {
    // Your code here.
}

\u5C0F\u63D0\u793A

\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookAPI.Status\u3002

\u6CE8\u610F

\u82E5\u6A21\u5757\u6FC0\u6D3B\u5224\u65AD\u4E2D\u5305\u542B\u592A\u6781\u3001\u65E0\u6781\u4E2D\u7684\u6FC0\u6D3B\u72B6\u6001\uFF0C\u5C31\u5FC5\u987B\u5C06\u6A21\u5757\u7684 Application \u7EE7\u627F\u4E8E ModuleApplication \u6216\u76F4\u63A5\u4F7F\u7528 ModuleApplication\uFF1B

1.0.91 \u7248\u672C\u540E\u7684 API \u4FEE\u6539\u4E86\u6FC0\u6D3B\u903B\u8F91\u5224\u65AD\u65B9\u5F0F\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u5728\u6A21\u5757\u4E0E Hook APP (\u5BBF\u4E3B) \u4E2D\u540C\u65F6\u4F7F\u7528\u6B64 API\uFF1B

\u9700\u8981\u786E\u4FDD YukiHookAPI.Configs.isEnableHookModuleStatus \u662F\u542F\u7528\u72B6\u6001\uFF1B

\u9664\u4E86\u63D0\u4F9B\u6807\u51C6 API \u7684 Hook \u6846\u67B6\u4E4B\u5916\uFF0C\u5176\u5B83\u60C5\u51B5\u4E0B\u6A21\u5757\u53EF\u80FD\u90FD\u5C06\u65E0\u6CD5\u5224\u65AD\u81EA\u5DF1\u662F\u5426\u88AB\u6FC0\u6D3B\u3002

`,142);function k(D,C){const a=p("ExternalLinkIcon");return c(),i("div",null,[t,s("ul",null,[s("li",null,[s("p",null,[d,s("a",u,[A,e(a)])])]),s("li",null,[s("p",null,[v,s("a",y,[m,e(a)])])])]),b])}const h=o(r,[["render",k],["__file","example.html.vue"]]);export{h as default};