123下一页
返回列表 发新帖

[YukiHookAPI] 编写 Xposed 模块教程

  [复制链接]

28

主题

584

回帖

2286

积分

大学生

Rank: 5Rank: 5

金币
457
好评
3
信誉
98
发表于 2023-5-18 23:52:03 | 显示全部楼层 | 阅读模式  来自 湖南
本帖最后由 yinsel 于 2023-5-19 11:57 编辑
论坛似乎好像还有人想编写Xposed模块,但是还是不会写,于是我就决定发个教程。教程是基于用Kotlin构建的Xposed API--YukiHookAPI,适用于小白,基于不熟悉Kotlin,也能简单编写Xposed模块,因为代码量比传统java要少。从Android Studio 开始,依赖导入->Hook配置->基本Hook方法、Hook加固应用。小白发帖,大佬勿喷!!!


介绍


YukiHookAPI 是基于Kotlin编写的一套开源的Xposed API框架,
目的是让Xposed 编写变得简单,优雅,把更多精力放在Hook逻辑上而不是而不是繁琐的代码。
Github地址:Github
官网地址:官网


要求

1. 电脑一台
2. 有编程基础
3. 具有一定学习能力


即使不会Kotlin,也没关系,写Xposed模块也不是很难,不用去理解为什么,只需要知道咋写,因为写起来方便且优雅,多去实践!


基本配置



首先,用Android Stuido创建一个新项目,这里我们选择No Activity (不会写界面,没审美)。









取个名字,语言选择Kotlin,暂时抛弃Java,点击完成,之后需下载一波Gradle依赖,时间可能有点久





加载完后,删除不必要的资源:



修改xml文件,删除红色部分





点击Gradle Scripts,找到settings.gradle,在如图所示的位置上添加如下代码,并点击同步
  1. repositories {
  2.     google()
  3.     mavenCentral()
  4.     // ❗若你的 Plugin 版本过低,作为 Xposed 模块使用务必添加,其它情况可选
  5.     maven { url "https://dl.bintray.com/kotlin/kotlin-eap" }
  6.     // ❗作为 Xposed 模块使用务必添加,其它情况可选
  7.     maven { url "https://api.xposed.info/" }
  8.     // MavenCentral 有 2 小时缓存,若无法集成最新版本请添加此地址
  9.     maven { url "https://s01.oss.sonatype.org/content/repositories/releases" }
  10. }
复制代码











点击build.gradle (Module: app) ,在图中所示位置分别添加如下代码依赖


plugin中:
  1. id 'com.google.devtools.ksp' version "$ksp_version"
复制代码


dependencies中:
  1. // 基础依赖
  2.     implementation "com.highcapable.yukihookapi:api:$yuki_version"
  3.     implementation 'androidx.core:core-ktx:1.10.0'
  4.     // ❗作为 Xposed 模块使用务必添加,其它情况可选
  5.     compileOnly 'de.robv.android.xposed:api:82'
  6.     // ❗作为 Xposed 模块使用务必添加,其它情况可选
  7.     ksp "com.highcapable.yukihookapi:ksp-xposed:$yuki_version"
复制代码












修改Java 版本 和 kotlin 虚拟机版本为 11 ,如图






在gradle.properties处添加依赖版本变量,方便管理,最后同步


  1. yuki_version = 1.1.11
  2. ksp_version = 1.8.20-1.0.11
复制代码








最后,在AndroidManifest.xml中加入 如下代码:

  1. <application
  2.         android:allowBackup="true"
  3.         android:dataExtractionRules="@xml/data_extraction_rules"
  4.         android:fullBackupContent="@xml/backup_rules"
  5.         android:icon="@mipmap/ic_launcher"
  6.         android:label="@string/app_name"
  7.         android:supportsRtl="true"
  8.         tools:targetApi="31" >

  9.     <!-- 设置为 Xposed 模块 -->
  10.     <meta-data
  11.         android:name="xposedmodule"
  12.         android:value="true" />

  13.     <!-- 设置你的模块描述 -->
  14.     <meta-data
  15.         android:name="xposeddescription"
  16.         android:value="填写你的 Xposed 模块描述" />

  17.     <!-- 最低 Xposed 版本号,若你正在使用 EdXposed/LSPosed,建议最低为 93 -->
  18.     <meta-data
  19.         android:name="xposedminversion"
  20.         android:value="93" />

  21.     <!-- 可选:配置支持 New XSharedPreferences 可无需调整 xposedminversion 为 93 -->
  22.     <meta-data
  23.         android:name="xposedsharedprefs"
  24.         android:value="true"/>
  25.         
  26.     </application>
复制代码





到这里,依赖配置就完成了,下面开始正式编写Hook代码

Hook代码

新建Kotlin类:




这里我们选择对象,名字随便,这里以MainHook为例








在MainHook 中 输入如下代码:
  1. package com.yinsel.myfirstxposed
  2. import com.highcapable.yukihookapi.annotation.xposed.InjectYukiHookWithXposed
  3. import com.highcapable.yukihookapi.hook.factory.encase
  4. import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit

  5. @InjectYukiHookWithXposed
  6. object MainHook:IYukiHookXposedInit {
  7.     override fun onHook() = encase {
  8.         loadApp(name= "Hook的应用包名") {
  9.             
  10.         }
  11.     }
  12. }
复制代码





Hook 类方法
  1. package com.yinsel.myfirstxposed

  2. import android.app.Application
  3. import android.content.Context
  4. import com.highcapable.yukihookapi.annotation.xposed.InjectYukiHookWithXposed
  5. import com.highcapable.yukihookapi.hook.factory.classOf
  6. import com.highcapable.yukihookapi.hook.factory.encase
  7. import com.highcapable.yukihookapi.hook.type.android.ApplicationClass
  8. import com.highcapable.yukihookapi.hook.type.java.DoubleType
  9. import com.highcapable.yukihookapi.hook.type.java.FloatType
  10. import com.highcapable.yukihookapi.hook.type.java.IntType
  11. import com.highcapable.yukihookapi.hook.type.java.StringClass
  12. import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit

  13. @InjectYukiHookWithXposed
  14. object MainHook:IYukiHookXposedInit {
  15.     override fun onHook() = encase {
  16.         //Hook类方法
  17.         loadApp("Hook的应用包名") {
  18.             findClass("类名",appClassLoader).hook {
  19.                 injectMember {
  20.                     method {
  21.                         //方法名
  22.                         name = "methodName"
  23.                         //参数个数
  24.                         paramCount = 3
  25.                         //方法参数类型
  26.                         param(IntType, DoubleType, FloatType, StringClass,Context::class,Application::class)
  27.                     }
  28.                     //在方法执行前Hook
  29.                     beforeHook {
  30.                         //判断参数值args数组存储方法的参数,下标从0开始,依次是第一个参数,第二个...
  31.                         if (args[0] == 1 && args[1] == 1.0f) {
  32.                             //修改返回结果
  33.                             result = "Hook返回结果"
  34.                         }
  35.                     }
  36.                     //方法执行后Hook
  37.                     afterHook {
  38.                         //Hook代码
  39.                     }
  40.                 }
  41.             }
  42.         }
  43.     }
  44. }
复制代码





Hook加固应用:

  1. package com.yinsel.myfirstxposed

  2. import android.app.Application
  3. import android.content.Context
  4. import com.highcapable.yukihookapi.annotation.xposed.InjectYukiHookWithXposed
  5. import com.highcapable.yukihookapi.hook.factory.classOf
  6. import com.highcapable.yukihookapi.hook.factory.encase
  7. import com.highcapable.yukihookapi.hook.type.android.ApplicationClass
  8. import com.highcapable.yukihookapi.hook.type.java.DoubleType
  9. import com.highcapable.yukihookapi.hook.type.java.FloatType
  10. import com.highcapable.yukihookapi.hook.type.java.IntType
  11. import com.highcapable.yukihookapi.hook.type.java.StringClass
  12. import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit

  13. @InjectYukiHookWithXposed
  14. object MainHook:IYukiHookXposedInit {
  15.     override fun onHook() = encase {
  16.         loadApp("Hook的应用包名") {
  17.             //Hook加固应用
  18.             ApplicationClass.hook {
  19.                 injectMember {
  20.                     method {
  21.                         name = "onCreate"
  22.                         //空参数
  23.                         emptyParam()
  24.                     }
  25.                     beforeHook {
  26.                         val classLoader = this.instanceClass.classLoader
  27.                         findClass(name = "Hook的类名",classLoader).hook {
  28.                             injectMember {
  29.                                 method {
  30.                                     name = "方法名"
  31.                                     //方法条件....
  32.                                 }
  33.                                 beforeHook {
  34.                                     //Hook代码
  35.                                 }
  36.                                 afterHook {
  37.                                     //Hook代码
  38.                                 }
  39.                             }
  40.                         }.ignoredHookClassNotFoundFailure()
  41.                     }
  42.                 }
  43.             }
  44.         }
  45.     }
  46. }
复制代码






差不多就结束了,如需更多自定义Hook,可查看官方文档,讲的还是很详细的,上方教程可以满足基本的Hook需求了。

Demo
Demo


感谢
fankes/YukiHookAPI: ⛱️ An efficient Hook API and Xposed Module solution built in Kotlin. (github.com)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有1人评分好评 金币 理由
shan0404 + 1 + 1 赞一个!

查看全部评分 总评分:好评 +1  金币 +1 

回复

使用道具 举报

22

主题

3228

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1630
好评
35
信誉
110

考神

发表于 2023-5-19 21:42:36 来自手机  | 显示全部楼层  来自 河南
感谢分享,很好很强大!
回复

使用道具 举报

28

主题

584

回帖

2286

积分

大学生

Rank: 5Rank: 5

金币
457
好评
3
信誉
98
发表于 2023-5-19 22:10:50 来自手机  | 显示全部楼层  来自 湖南
shan0404 发表于 2023-5-19 21:42
感谢分享,很好很强大!

感谢支持
回复

使用道具 举报

7

主题

263

回帖

1053

积分

高中生

Rank: 4

金币
581
好评
1
信誉
100
发表于 2023-5-20 01:08:25 来自手机  | 显示全部楼层  来自 上海
感谢大大
回复

使用道具 举报

8

主题

3840

回帖

8798

积分

硕士生

Rank: 6Rank: 6

金币
2937
好评
6
信誉
96
发表于 2023-5-20 01:09:29 来自手机  | 显示全部楼层  来自 广西
感谢分享
回复

使用道具 举报

0

主题

3275

回帖

8849

积分

硕士生

Rank: 6Rank: 6

金币
5261
好评
2
信誉
100
发表于 2023-5-20 01:14:38 来自手机  | 显示全部楼层  来自 甘肃
感谢分享
回复

使用道具 举报

14

主题

982

回帖

2948

积分

大学生

Rank: 5Rank: 5

金币
1844
好评
2
信誉
100
发表于 2023-5-20 01:18:19 来自手机  | 显示全部楼层  来自 山东
感谢分享
回复

使用道具 举报

16

主题

2126

回帖

5619

积分

硕士生

Rank: 6Rank: 6

金币
122
好评
1
信誉
110

考神MT论坛新人MT论坛最佳新人MT论坛帅哥

QQ
发表于 2023-5-20 02:48:30 来自手机  | 显示全部楼层  来自 广西
感谢分享
回复

使用道具 举报

0

主题

652

回帖

2098

积分

大学生

Rank: 5Rank: 5

金币
1204
好评
1
信誉
100

考神MT论坛新人

QQ
发表于 2023-5-20 03:11:45 来自手机  | 显示全部楼层  来自 贵州
感谢分享
回复

使用道具 举报

85

主题

3590

回帖

1万

积分

博士生

校长

Rank: 7Rank: 7Rank: 7

金币
1756
好评
104
信誉
100

MT论坛帅哥MT论坛最佳新人考神MT论坛活跃会员MT论坛新人

发表于 2023-5-20 07:22:01 来自手机  | 显示全部楼层  来自 浙江
看看
回复

使用道具 举报

1

主题

2538

回帖

7892

积分

硕士生

Rank: 6Rank: 6

金币
6451
好评
1
信誉
102
发表于 2023-5-20 08:07:53 来自手机  | 显示全部楼层  来自 四川
感谢楼主分享
回复

使用道具 举报

14

主题

502

回帖

2521

积分

大学生

昔尘

Rank: 5Rank: 5

金币
1521
好评
9
信誉
100
QQ
发表于 2023-5-20 08:10:03 来自手机  | 显示全部楼层  来自 辽宁
感谢分享
回复

使用道具 举报

1

主题

361

回帖

1085

积分

高中生

Rank: 4

金币
207
好评
0
信誉
100
发表于 2023-5-20 12:57:16 来自手机  | 显示全部楼层  来自 福建
学习学习
回复

使用道具 举报

53

主题

2972

回帖

8186

积分

硕士生

忆光

Rank: 6Rank: 6

金币
4141
好评
21
信誉
100

MT论坛帅哥2019-5.1节快乐考神MT论坛最佳新人MT论坛活跃会员MT论坛新人

发表于 2023-5-20 13:00:15 来自手机  | 显示全部楼层  来自 河南
感谢,学习一下
回复

使用道具 举报

13

主题

4930

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1337
好评
6
信誉
106

考神MT论坛新人MT论坛帅哥

发表于 2023-5-20 16:59:21 来自手机  | 显示全部楼层  来自 江西
谢谢分享
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表