xposed hook例子

package com.example.myxposed;

import android.util.Log;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class Hook implements IXposedHookLoadPackage{
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        Log.d("xiaojianbang", "hook...");
        if (!loadPackageParam.packageName.equals("com.xingin.xhs")) return;
        Log.d("xiaojianbang", "hooking...");

        // Hook 静态变量
        Class<?> clazz = XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo", loadPackageParam.classLoader);
        XposedHelpers.setStaticIntField(clazz, "staticInt", 10000);
        XposedHelpers.setStaticObjectField(clazz,"Tag", "dajianbang");

        // Hook 构造函数
        XposedHelpers.findAndHookConstructor(clazz, new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                Log.d("xiaojianbang", "这个是调用无参构造方法前");
            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                Log.d("xiaojianbang", "这个是调用无参构造方法后");
            }
        });

        XposedHelpers.findAndHookConstructor(clazz, String.class,new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                Log.d("xiaojianbang", "这个是调用有参构造方法前");
            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                Log.d("xiaojianbang", "这个是调用有参构造方法后");
            }
        });

        // Hook复杂参数
        XposedHelpers.findAndHookMethod(clazz,"myTest", String.class, "java.lang.String","[[Ljava.lang.String", Map.class,Class.forName("java.util.ArrayList"),new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                Log.d("xiaojianbang", "这个是调用有参构造方法前");
            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                Log.d("xiaojianbang", "这个是调用有参构造方法后");
            }
        });

        // Hook自定义参数
        // 1.Class.forName()
        // 2."java.lang.String"
        // 3."XposedHelpers.findClass"

        // Class aniclass = loadPackageParam.classLoader.loadClass("com.xiaojianbang.xposeddemo.Animal");
        // Class aniclass = XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Animal", loadPackageParam.classLoader);
        Class aniclass = Class.forName("com.xiaojianbang.xposeddemo.Animal", false, loadPackageParam.classLoader);
        XposedHelpers.findAndHookMethod(clazz,"myTest", aniclass,new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                Log.d("xiaojianbang", "这个是调用有参构造方法前");
            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                Log.d("xiaojianbang", "这个是调用有参构造方法后");
            }
        });

        // Hook 替换函数
        XposedHelpers.findAndHookMethod(clazz, "myTest", aniclass, new XC_MethodReplacement() {
            @Override
            protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
                return null;
            }
        });

        // Hook 内部类
        XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.xiaojianbang.Demo$InnerClass", loadPackageParam.classLoader), "innerFunc",
                String.class,
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        int aa = XposedHelpers.getIntField(param.thisObject, "innerPublicInt");
                        Log.d("xiaojianbang", ""+aa);
                    }
                });

        // Hook 主动调用
        XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.xiaojianbang.Demo$InnerClass", loadPackageParam.classLoader), "innerFunc",
                String.class,
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

                        // 主动调用必须要有实例化对象的时候才能调用
                        Log.d("xiaojianbang", "beforeHookedMethod");
                        XposedHelpers.callMethod(clazz.newInstance(), "ref1");
                        Log.d("xiaojianbang", "afterHookedMethod");


                        int aa = XposedHelpers.getIntField(param.thisObject, "innerPublicInt");
                        Log.d("xiaojianbang", ""+aa);
                    }
                });

        // Hook 打印函数调用栈
        XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.xiaojianbang.Demo$InnerClass", loadPackageParam.classLoader), "innerFunc",
                String.class,
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        // 打印调用堆栈信息
                        Log.e("xiaojianbang", "Stack:", new Throwable("Stack dump"));

                        // 主动调用必须要有实例化对象的时候才能调用
                        Log.d("xiaojianbang", "beforeHookedMethod");
                        XposedHelpers.callMethod(clazz.newInstance(), "ref1");
                        Log.d("xiaojianbang", "afterHookedMethod");


                        int aa = XposedHelpers.getIntField(param.thisObject, "innerPublicInt");
                        Log.d("xiaojianbang", ""+aa);
                    }
                });

        // Hook 反射大法(获取方法)
        XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.xiaojianbang.Demo$InnerClass", loadPackageParam.classLoader), "innerFunc",
                String.class,
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        //1、找到类
                        //2、找到字段或方法  设定访问权限
                        //3、修改字段或调用方法

                        //Class.forName("com.xiaojianbang.app", false, ClassLoader);
                        //Class.forName("com.xiaojianbang.app");
                        //类名.class
                        //对象.getClass()
                        //xp的findClass
                        //classloader的loadClass

                        Object o = clazz.newInstance();
                        Class democlazz = Class.forName("com.xiaojianbang.xposeddemo.Demo", false, loadPackageParam.classLoader);
                        // 获取属性
                        Field reflect = democlazz.getDeclaredField("reflect");

                        // reflect.getType();
                        // reflect.getName();
                        // reflect.getModifiers();

                        reflect.setAccessible(true);
                        String str = (String)reflect.get(o);
                        Log.d("xiaojianbang", "这是放射获取的字段: "+str);
                        // 通过放射设置字段的值
                        reflect.set(o, "fangshedafa");
                        str = (String)reflect.get(o);
                        Log.d("xiaojianbang", "这是放射设置后获取的字段: "+str);
                       /* // 可以获取公有或受保护的方法
                        democlazz.getMethod();
                        // 可以获取全部的方法,包括私有的
                        democlazz.getDeclaredMethod();
                        democlazz.getField();
                        democlazz.getDeclaredField();*/
                        Method ref1 = democlazz.getDeclaredMethod("ref1");
                        ref1.setAccessible(true);
                        //invoke来调用方法
                        ref1.invoke(o);

                    }
                });

        // 遍历所有方法和字段
        Class aClazz = XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo", loadPackageParam.classLoader);
        Method[] md = aClazz.getDeclaredMethods();
        for (int i = 0; i < md.length; i++) {
            Log.d("xiaojianbang", md[i].toString());
        }

        Field[] fd = aClazz.getDeclaredFields();
        for (int i = 0; i < fd.length; i++) {
            Log.d("xiaojianbang", fd[i].toString());
        }

        // 遍历所有内部类
        Class[] declaredClasses = aClazz.getDeclaredClasses();
        for (int i = 0; i < declaredClasses.length; i++) {
            Log.d("xiaojianbang", declaredClasses[i].toString());

            Method[] mds = declaredClasses[i].getDeclaredMethods();
            for (int j = 0; j < mds.length; j++) {
                Log.d("xiaojianbang", mds[j].toString());
            }

            Field[] fds = declaredClasses[i].getDeclaredFields();
            for (int j = 0; j < fds.length; j++) {
                Log.d("xiaojianbang", fds[j].toString());
            }

        }

        // 遍历所有的类
        XposedHelpers.findAndHookMethod(ClassLoader.class,
                "loadClass",
                String.class,
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        Class result = (Class)param.getResult();
                        Log.d("xiaojianbang", "LoadClass: "+result.getName());
                    }
                });


        // 遍历所有类的所有方法

        // XposedBridge.hookAllMethods();
        // XposedBridge.hookAllConstructors();
        // XposedBridge.hookMethod();
        XposedHelpers.findAndHookMethod(ClassLoader.class,
                "loadClass",
                String.class,
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        Class result = (Class)param.getResult();
                        Log.d("xiaojianbang", "LoadClass: "+result.getName());
                        Method[] declaredMethods = result.getDeclaredMethods();
                        for (int i = 0; i < declaredMethods.length; i++) {
                            XposedBridge.hookMethod(declaredMethods[i], new XC_MethodHook() {
                                @Override
                                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                    Log.d("dajianbang", "Hook Method: " + param.args.length);
                                }
                            });
                        }

//                        Method[] mds = result.getDeclaredMethods();
//                        for (int j = 0; j < mds.length; j++) {
//                            Log.d("xiaojianbang", mds[j].toString());
//                        }
//
//                        Field[] fds = result.getDeclaredFields();
//                        for (int j = 0; j < fds.length; j++) {
//                            Log.d("xiaojianbang", fds[j].toString());
//                        }
                    }
                });



    }
}
Categories:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注