Xposed 开发

Xposed 开发

xposed jar下载地址
Xposed 英文tutorial
Xposed Wiki

1.下载jar包

打开xposed jar下载地址 下载jar包,导入工程libs
在 build.gradle 中加入 compileOnly files('libs\\api-82.jar')

2.编写代码

新建 class 实现 IXposedHookLoadPackage 接口

package com.cndlcd.testxposed;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class JulianXposed implements IXposedHookLoadPackage {

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

    }

}

3.配置

  1. AndroidManifest.xml 中加入以下代码
        <meta-data
            android:name="xposedmodule"
            android:value="true" />
        <meta-data
            android:name="xposeddescription"
            android:value="Julian First Xposed Module" />
        <meta-data
            android:name="xposedminversion"
            android:value="53" />
  1. 新建 assets 目录,在 asset 中新建 xposed_init文件,并将 2 中创建的类名全程填入 com.cndlcd.testxposed.JulianXposed

4.运行-写代码-测试

5.案例

正己

  1. Hook 普通方法

    1. 修改返回值
      
      XposedHelpers.findAndHookMethod("com.cndlcd.myapplication", loadPackageParam.classLoader, "method", String.class, new XC_MethodHook() {
          @Override
          protected void afterHookedMethod(MethodHookParam param) throws Throwable {
              super.afterHookedMethod(param);
              param.setResult("result");
          }
      });
      
    2. 修改参数
    
        XposedHelpers.findAndHookMethod("com.cndlcd.myapplication", loadPackageParam.classLoader, "method", String.class, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                super.beforeHookedMethod(param);
    
                param.args[0] = "param1";
            }
        });
        });
    
  2. Hook 复杂自定义参数


       Class a = loadPackageParam.classLoader.loadClass("com.cndlcd.myapplication.Class");
       XposedBridge.hookAllMethods(a, "method", new XC_MethodHook() {
           @Override
           protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
               super.beforeHookedMethod(param);

           }
       });

  1. Hook 替换函数
  Class a = loadPackageParam.classLoader.loadClass("com.cndlcd.myapplication.Hook");
       XposedBridge.hookAllMethods(a, "method", new XC_MethodReplacement() {
           @Override
           protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
               return "";
           }
       });
  1. Hook 变量

    1. Hook 静态变量 public static String TAG = "Hook";
    
        Class clazz = XposedHelpers.findClass("com.cndlcd.myapplication.Hook", loadPackageParam.classLoader);
        XposedHelpers.setStaticObjectField(clazz, "TAG", "TAGTAG");
    
    
    1. Hook 成员变量
    
        Class clazz = XposedHelpers.findClass("com.cndlcd.myapplication.Hook", loadPackageParam.classLoader);
    
        XposedBridge.hookAllConstructors(clazz, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                Object thisObject = param.thisObject;  
                //param.thisObject 为当前对象
                XposedHelpers.setIntField(thisObject, "value", 10000);
            }
        });
    
  2. Hook 构造函数

    1. Hook 无参构造函数
            XposedHelpers.findAndHookConstructor("com.cndlcd.myapplication.Hook", loadPackageParam.classLoader, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                super.beforeHookedMethod(param);
            }
    
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
            }
        });
    
    1. Hook 有参构造函数
    
        XposedHelpers.findAndHookConstructor("com.cndlcd.myapplication.Hook", loadPackageParam.classLoader, String.class, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                super.beforeHookedMethod(param);
            }
    
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
            }
        });
    
  3. Hook multiDex 方法


        XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                Context context = (Context) param.args[0];
                ClassLoader classLoader = context.getClassLoader();
                Class<?> aClass = null;
                try {
                    aClass = classLoader.loadClass("com.cndlcd.myapplication.Hook");
                } catch (ClassNotFoundException exception) {
                    //can't find class
                    return;
                }

                XposedHelpers.findAndHookMethod(aClass, "method", new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);
                    }
                });

            }
        });
  1. Hook 内部类
        XposedHelpers.findAndHookMethod("com.cndlcd.myapplication.Hook$InnerHook", loadPackageParam.classLoader, "method", new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                System.out.println("after hook inner method");
            }
        });
  1. 主动调用

    1. 静态调用
    
        Class clazz = XposedHelpers.findClass("com.cndlcd.myapplication.Hook", loadPackageParam.classLoader);
        XposedHelpers.findAndHookConstructor(clazz, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                XposedHelpers.callMethod(param.thisObject, "method");
            }
        });
    
    
    1. 动态调用
    
        Class clazz = XposedHelpers.findClass("com.cndlcd.myapplication.Hook", loadPackageParam.classLoader);
        XposedHelpers.callStaticMethod(clazz, "method");
    
  2. 自己反射

Class clazz = XposedHelpers.findClass("com.zj.wuaipojie.Demo", lpparam.classLoader);
XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo$InnerClass", lpparam.classLoader, "innerFunc",String.class,  new XC_MethodHook() {  
    @Override  
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {  
        super.beforeHookedMethod(param);  
        //第一步找到类
        //找到方法,如果是私有方法就要setAccessible设置访问权限
        //invoke主动调用或者set修改值(变量)
        Class democlass = Class.forName("com.zj.wuaipojie.Demo",false,lpparam.classLoader);  
        Method demomethod = democlass.getDeclaredMethod("refl");  
        demomethod.setAccessible(true);  
        demomethod.invoke(clazz.newInstance());  
    }  
});

  1. 遍历所有类下的所有方法
XposedHelpers.findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() {  
    @Override  
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
        super.afterHookedMethod(param);  
        Class clazz = (Class) param.getResult();  
        String clazzName = clazz.getName();  
        //排除非包名的类  
        if(clazzName.contains("com.zj.wuaipojie")){  
            Method[] mds = clazz.getDeclaredMethods();  
            for(int i =0;i<mds.length;i++){  
                final Method md = mds[i];  
                int mod = mds[i].getModifiers();  
                //去除抽象、native、接口方法  
                if(!Modifier.isAbstract(mod)  
                    && !Modifier.isNative(mod)  
                    &&!Modifier.isAbstract(mod)){  
                    XposedBridge.hookMethod(mds[i], new XC_MethodHook() {  
                        @Override  
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {  
                            super.beforeHookedMethod(param);  
                            Log.d("zj2595",md.toString());  
                        }  
                    });  
                }  

           }  
        }  

    }  
});

  1. 点击事件监听
XposedHelpers.findAndHookMethod("android.widget.TextView", lpparam.classLoader, "setText", CharSequence.class, new XC_MethodHook() {  
    @Override  
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {  
        super.beforeHookedMethod(param);  
        Log.d("zj2595",param.args[0].toString());  
                if(param.args[0].equals("已过期")){  
                    printStackTrace();  
                }
    }  
});
private static void printStackTrace() {  
    Throwable ex = new Throwable();  
    StackTraceElement[] stackElements = ex.getStackTrace();  
    for (int i = 0; i < stackElements.length; i++) {  
        StackTraceElement element = stackElements[i];  
        Log.d("zj2595","at " + element.getClassName() + "." + element.getMethodName() + "(" + element.getFileName() + ":" + element.getLineNumber() + ")");  
    }  
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值