返回列表 发新帖

【模块开发】Xposed 快速入门

  [复制链接]

110

主题

2689

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1257
好评
125
信誉
195

考神MT论坛新人MT论坛活跃会员MT论坛帅哥MT论坛灌水老大

QQ
发表于 2025-4-14 10:59:02 来自手机  | 显示全部楼层 | 阅读模式  来自 河南
本帖最后由 陌璃与鱼 于 2025-4-21 08:14 编辑

好久没发帖了,发一个Xposed开发的教程,也算是我的学习笔记吧,可能会有一些错误,请大佬指出,

用的开发软件是AIDE Pro,直接创建模板即可

正文:

基本介绍:
Xposed是一款可以在不修改APK的情况下影响程序运行的框架,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。在这个框架下,我们可以编写并加载自己编写的插件APP,实现对目标apk的注入拦截等。
关于Xposed类定义:
首先必须继承IXposedHookLoadPackage接口,并重写handleLoadPackage回调方法,像这样:

  1. public class HookInit implements IXposedHookLoadPackage {
  2. @Override

  3. public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {}

  4. }
复制代码


(AIDE Pro提供的模板已经帮我创建好了,所以这一步了解一下就好)

其中回调方法的LoadPackageParam lpparam参数是Xposed提供的,他可以获取当前应用的信息,他也提供了很多属性,如classLoader(当前类加载器),packageName(包名称)等

Xposed提供了很多封装好的Hook函数,但是本质使用的还是Java反射,下面我将写一个安卓demo作为案例来教大家怎么使用xposed提供的函数

  1. package com.demo;


  2. import android.app.Activity;

  3. import android.os.Bundle;

  4. import android.widget.Button;

  5. import android.widget.EditText;

  6. import android.view.View;

  7. import android.widget.Toast;



  8. public class MainActivity extends Activity {
  9.     Button button1;

  10.     Button button2;

  11.     Button button3;

  12.     EditText edit;

  13.    

  14.     static String Name="admin";

  15.     static int pass=123456;

  16.    

  17.     @Override

  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);        

  20.         setContentView(R.layout.activity_main);

  21.         

  22.         button1 = findViewById(R.id.puton);

  23.         button2 = findViewById(R.id.statics);

  24.         button3 = findViewById(R.id.cons);

  25.         edit = findViewById(R.id.activitymainEditText1);

  26.         //方法参数测试

  27.         button1.setOnClickListener(

  28.             new View.OnClickListener() {


  29.                 @Override

  30.                 public void onClick(View view) {
  31.                   String pass=edit.getText().toString();           

  32.                   //传入编辑框内容

  33.                   check(pass);



  34.                 }

  35.             });

  36.             //静态变量测试

  37.         button2.setOnClickListener(new View.OnClickListener() {


  38.                 @Override

  39.                 public void onClick(View view) {
  40.                     Toast.makeText(getApplication(), "name:"+Name+"\n"+"pass:"+pass, Toast.LENGTH_SHORT).show();

  41.                 }

  42.             });

  43.             //构造方法测试

  44.         button3.setOnClickListener(new View.OnClickListener() {


  45.                 @Override

  46.                 public void onClick(View view) {
  47.                   demo2test demo =new demo2test("Anna",1);

  48.                     Toast.makeText(getApplication(), "name:"+demo.getName()+"\n"+"id:"+demo.getId(), Toast.LENGTH_SHORT).show();

  49.                 }

  50.             });

  51.     }



  52.     public void check(String pass) {
  53.         // 判断参数内容是否和密码相同

  54.         if (pass.equals("123456")) {
  55.             Toast.makeText(getApplication(), "密码正确", Toast.LENGTH_SHORT).show();

  56.         } else {
  57.             Toast.makeText(getApplication(), "密码错误", Toast.LENGTH_SHORT).show();

  58.         }}

  59.         

  60.       public void test(){
  61.           Toast.makeText(getApplication(), "我被调用了?", Toast.LENGTH_SHORT).show();

  62.       }

  63. }

  64. //新建文件,并创建类:
  65. package com.demo;



  66. /**

  67. * @Author Moiy

  68. * @Date 2025/04/09 09:20

  69. */

  70. public class demo2test {
  71.     String name;

  72.     int id;



  73.     public demo2test(String name, int id) {
  74.         this.name = name;

  75.         this.id = id;

  76.     }

  77.    

  78.    

  79.     public void setName(String name) {
  80.         this.name = name;

  81.     }



  82.     public String getName() {
  83.         return name;

  84.     }



  85.     public void setId(int id) {
  86.         this.id = id;

  87.     }



  88.     public int getId() {
  89.         return id;

  90.     }
  91. }
复制代码


软件界面:


这个安卓app定义了三个按钮,

方法按钮(检测编辑框内容是否正确)
静态按钮(输出静态变量内容)
构造按钮(输出构造函数传入的参数)


Hook方法:

关于Xposed hook,一般使用的都是XposedHelpers类下的函数,比如Hook方法使用的就是findAndHookMethod函数,这个函数有两个重载分别是

  1. findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) {}

  2. findAndHookMethod(Class<?> clazz, String methodName, Object... parameterTypesAndCallback) {}
复制代码


具体使用:
  1. XposedHelpers.findAndHookMethod(

  2.     "com.demo.MainActivity",

  3.     lpparam.classLoader,

  4.     "check",

  5.    String.class,

  6.     new XC_MethodHook(){
  7.      protected void beforeHookedMethod(MethodHookParam param){
  8.        //设置方法参数为123456        

  9.       param.args[0]="123456";

  10.      }

  11.      protected void afterHookedMethod(MethodHookParam param) throws Throwable {     

  12.                         //打印日志   

  13.       XposedBridge.log("方法参数Hook成功: 现参数 = " + param.args[0]);      

  14.      }

  15.     });
复制代码

   
一共五个参数:

第一个参数是类名,

第二个是当前应用的类加载器,

第三个参数是方法名称,

第四个参数是方法的参数类型(空参则不填)

最后的参数是一个类,我是用的XC_MethodHook类,他提供了两个方法,分别是beforeHookedMethod(方法调用前)和afterHookedMethod(方法调用后)执行

这两个方法中需要定义一个参数,MethodHookParam param,这个参数可以获取方法的信息,它提供了很多属性,如args(方法参数数组),thisObject(当前实例对象)等,

如果你只想打印出来是否Hook等不需要方法运行状态的信息,那你可以不填参这个参数

下面是Hook成功打印出来的日志(最后一条):


关于Class对象的获取,Xposed提供的有XposedHelpers.findClass()方法,方法提供了有两个重载,正常直接在方法传入类名与当前应用的类加载器,如XposedHelpers.findClass("xxx.xxx.xx",lpparam.classLoader),然后定义一个Class对象接收即可


Hook静态变量:
​​​​​所需函数:
  1. XposedHelpers.setStaticxxxField(Class<?> clazz, String fieldName, int value) )

  2. XposedHelpers.setStaticObjectField(Object obj, String fieldName, Object value) {})
复制代码


第一个是基础类型的Hook

第二个是对象的Hook



关于基础类型的Hook,XposedHelpers中提供了很多方法,如setStaticIntField(),setStaticByteField(),setStaticCharField()等,

关于对象的就只有setStaticObjectField()方法

具体代码:
  1. //hook静态变量(更改静态变量值(对象,字段名,需要修改的值))

  2.         Class<?> clas = XposedHelpers.findClass("com.demo.MainActivity", lpparam.classLoader);      

  3.         XposedHelpers.setStaticObjectField(clas, "Name", "pass");

  4.         XposedHelpers.setStaticIntField(clas, "pass", 6666);

  5. XposedBridge.log("变量Hook成功");
复制代码


下面是Hook成功打印出来的日志(最后一条):



Hook构造方法
所需函数
  1. XposedHelpers.findAndHookConstructor(Class<?> clazz, Object... parameterTypesAndCallback)
复制代码


参数传入与Hook方式findAndHookMethod方法基本相同

具体代码:
  1. //hook构造方法

  2. Class<?> claz =XposedHelpers.findClass("com.demo.demo2test", lpparam.classLoader);

  3. XposedHelpers.findAndHookConstructor(

  4. claz,

  5. String.class, int.class,

  6. new XC_MethodHook(){
  7.                 protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
  8.                     //设置构造参数

  9.                     param.args[0] = "Moiy";

  10.                     param.args[1] = 9999;

  11.                 }

  12.                 protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {                  

  13.                     //打印日志         

  14.                     XposedBridge.log("构造方法Hook成功: = " + param.args[0] + " " + param.args[1]);                     

  15.                 }

  16.             });
复制代码


这个没什么好讲的,和findAndHookMethod方法基本一样,默认不填参数的话,hook的就是空参构造,有的话就是有参构造

日志输出(最后一条):


什么?你问我为什么不讲更高级的用法?

篇幅有限,下次一定


最后给大家看一下Hook全代码
  1. package con.xposed.demo;



  2. import de.robv.android.xposed.IXposedHookLoadPackage;

  3. import de.robv.android.xposed.XC_MethodHook;

  4. import de.robv.android.xposed.XposedBridge;

  5. import de.robv.android.xposed.XposedHelpers;

  6. import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

  7. import java.lang.reflect.Method;





  8. public class HookInit implements IXposedHookLoadPackage {


  9. @Override

  10. public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
  11.         if (!lpparam.packageName.equals("com.demo")) return; //判断包名

  12. final Class<?> claz =XposedHelpers.findClass("com.demo.demo2test", lpparam.classLoader);

  13. //hook构造方法

  14.         XposedHelpers.findAndHookConstructor(claz, String.class, int.class, new XC_MethodHook(){
  15.                 protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) {
  16.                     //设置构造参数

  17.                     param.args[0] = "Moiy";

  18.                     param.args[1] = 9999;

  19.                 }

  20.                 protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {                  

  21.                     //打印日志         

  22.                     XposedBridge.log("构造方法Hook成功: = " + param.args[0] + " " + param.args[1]);                     

  23.                 }

  24.             });

  25. //hook静态变量(更改静态变量值(对象,字段名,需要修改的值))

  26.         Class<?> clas = XposedHelpers.findClass("com.demo.MainActivity", lpparam.classLoader);      

  27.         XposedHelpers.setStaticObjectField(clas, "Name", "pass");

  28.         XposedHelpers.setStaticIntField(clas, "pass", 6666);

  29.         XposedBridge.log("静态变量Hook成功");

  30. //hook方法(类名,加载器,方法名,参数,匿名类)      

  31.    XposedHelpers.findAndHookMethod(

  32.     "com.demo.MainActivity",

  33.     lpparam.classLoader,

  34.     "check",String.class,

  35.     new XC_MethodHook(){
  36.      protected void beforeHookedMethod(MethodHookParam param){
  37.                         //设置方法参数为123456        

  38.       param.args[0]="123456";                           

  39.      }

  40.      protected void afterHookedMethod(MethodHookParam param) throws Throwable {     

  41.                         //打印日志   

  42.       XposedBridge.log("方法参数Hook成功: 现参数 = " + param.args[0]);      

  43.      }     

  44.     });

  45. }}
复制代码

本帖子中包含更多资源

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

x
已有5人评分好评 金币 理由
清夜含隐空 + 1 可惜我看不懂
是喵星呀 + 1
不晚 + 1
henkeai + 1 + 1 辛苦
青春向上 + 1 感谢分享。

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

回复

使用道具 举报

110

主题

2689

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1257
好评
125
信誉
195

考神MT论坛新人MT论坛活跃会员MT论坛帅哥MT论坛灌水老大

QQ
发表于 2025-4-14 11:03:10 来自手机  | 显示全部楼层  来自 河南
拼拼凑凑

本帖子中包含更多资源

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

x
回复

使用道具 举报

110

主题

2689

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1257
好评
125
信誉
195

考神MT论坛新人MT论坛活跃会员MT论坛帅哥MT论坛灌水老大

QQ
发表于 2025-4-14 11:12:00 来自手机  | 显示全部楼层  来自 河南
demo链接:

https://www.123912.com/s/bx3SVv-bDUBh?提取码:zQlV
回复

使用道具 举报

68

主题

921

回帖

4373

积分

禁止发言

金币
3637
好评
12
信誉
132

考神

发表于 2025-4-14 10:59:49 来自手机  | 显示全部楼层  来自 江苏
看看
回复

使用道具 举报

34

主题

3959

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
8413
好评
14
信誉
100

MT论坛最佳新人

QQ
发表于 2025-4-14 10:59:56 来自手机  | 显示全部楼层  来自 重庆
感谢分享
回复

使用道具 举报

65

主题

1808

回帖

5805

积分

硕士生

Nirithy

Rank: 6Rank: 6

金币
1065
好评
7
信誉
87

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

QQ
发表于 2025-4-14 11:01:56 来自手机  | 显示全部楼层  来自 河北
感谢分享
回复

使用道具 举报

17

主题

1531

回帖

5468

积分

硕士生

Rank: 6Rank: 6

金币
3118
好评
2
信誉
98
发表于 2025-4-14 11:02:17 来自手机  | 显示全部楼层  来自 台湾
感谢分享
回复

使用道具 举报

0

主题

256

回帖

1638

积分

高中生

Rank: 4

金币
808
好评
0
信誉
100
发表于 2025-4-14 11:07:33 来自手机  | 显示全部楼层  来自 安徽
谢谢分享
回复

使用道具 举报

10

主题

4872

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3492
好评
5
信誉
98

MT论坛最佳新人

QQ
发表于 2025-4-14 11:07:54 来自手机  | 显示全部楼层  来自 江苏
看看有什么亮点。
回复

使用道具 举报

43

主题

4302

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4508
好评
1
信誉
100

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

发表于 2025-4-14 11:08:13 来自手机  | 显示全部楼层  来自 中国
看看教程
回复

使用道具 举报

217

主题

1486

回帖

9408

积分

硕士生

Rank: 6Rank: 6

金币
160
好评
26
信誉
102

考神MT论坛灌水老大MT论坛帅哥MT论坛活跃会员

发表于 2025-4-14 11:11:07 来自手机  | 显示全部楼层  来自 河南
看看
回复

使用道具 举报

140

主题

1954

回帖

7486

积分

硕士生

Rank: 6Rank: 6

金币
3833
好评
25
信誉
120
发表于 2025-4-14 11:13:45 来自手机  | 显示全部楼层  来自 广东
感谢分享
回复

使用道具 举报

59

主题

4950

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4096
好评
8
信誉
121
发表于 2025-4-14 11:15:36 来自手机  | 显示全部楼层  来自 广东
感谢分享
回复

使用道具 举报

65

主题

3826

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2360
好评
12
信誉
100

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

发表于 2025-4-14 11:15:58 来自手机  | 显示全部楼层  来自 贵州
必须参观,大佬出品必是精品
回复

使用道具 举报

8

主题

4452

回帖

9781

积分

硕士生

Rank: 6Rank: 6

金币
4912
好评
5
信誉
159

考神

发表于 2025-4-14 11:16:46 来自手机  | 显示全部楼层  来自 安徽
感谢分享
回复

使用道具 举报

发表回复

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

本版积分规则

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