Xposed之Hook方法笔记

前言:最近在学习Xposed,想Hook一些方法返回类型和类,但是有的时候不知道到底怎么写返回参数,和传递参数,这里自己做一个学习过程的笔记。

一、获取返回值以及参数,基本数据类型。

获取一些返回字段 int、String、Byte、这些类型。

image.png

Hook代码

     private void hookAvatrPathPlay(ClassLoader classLoader) {
    //图片存放位置
    try {
        XposedHelpers.findAndHookMethod("com.tencent.mm.a.e", classLoader, "e",String.class,int.class,int.class,
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        //返回值
                        byte[] byte1 = (byte[]) param.getResult();
                        //第一个参数
                        String str1 = (String) param.args[0];
                        //第二个参数
                        int int1= (int) param.args[1];
                        //第三个参数
                        int int2= (int) param.args[2];
                        Log.d(TAG, "hook:======emoji==str1==="+ str1);
                        Log.d(TAG, "hook:======emoji==int1==="+ int1);
                        Log.d(TAG, "hook:======emoji==int2==="+ int2);
                        Log.d(TAG, "hook:======emoji==byte1==="+ Arrays.toString(byte1));
                        super.afterHookedMethod(param);
                    }
                });
    } catch (Exception e) {
        e.printStackTrace();
    }
}
二、获取返回值以及参数,对象引用类型。
image.png
image.png

Hook代码

   private void hookWechatStorage(ClassLoader classLoader) {
    //表情存放位置
    try {
        XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.card.ui.k", classLoader, "nV",int.class,
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        //返回值
                        Object result = param.getResult();
                        Object hwR = result.getClass().getField("hwR").get(result);
                        Log.d(TAG, "afterHookedMethod: ======="+hwR);
                        super.afterHookedMethod(param);
                    }
                });
    } catch (Exception e) {
        e.printStackTrace();
    }
}
三、获取返回值以及参数,参数是对象类型。
image.png

Hook代码

 private void hookTest(ClassLoader classLoader) {
    //表情存放位置
    String className="com.tencent.mm.ax.a";
    String methodName="a";
    Class aClass1 = XposedHelpers.findClass("com.tencent.mm.network.e", classLoader);
    Class aClass2 = XposedHelpers.findClass("com.tencent.mm.ac.e", classLoader);
    try {
        XposedHelpers.findAndHookMethod(className, classLoader, methodName,aClass1,aClass2,
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        //返回值
                        int result = (int) param.getResult();
                        //第一个参数
                        Log.d(TAG, "hook:======result==="+ result);
                        super.afterHookedMethod(param);
                    }
                });
    } catch (Exception e) {
        e.printStackTrace();
    }
}
四、打印方法调用的地方,通过打印堆栈信息。
image.png

Hook代码

    private void hookGetStackTraceString(ClassLoader classLoader) {
    try {
        XposedHelpers.findAndHookMethod("com.tencent.mm.a.e", classLoader, "e",String.class,int.class,int.class,
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                         //通过主动抛异常,来通过打印堆栈信息,锁定报错的地方,也就是调用的位置。
                        try {
                            throw new NullPointerException();
                        } catch (Exception e) {
                            Log.d(TAG, "hook:======emoji: -getStackTraceString----"+Log.getStackTraceString(e));
                        }
                        super.afterHookedMethod(param);
                    }
                });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

日志信息


image.png

你可能感兴趣的:(Xposed之Hook方法笔记)