美文网首页Xposed
Xposed之Hook方法笔记

Xposed之Hook方法笔记

作者: 神一般的男子 | 来源:发表于2018-08-07 13:52 被阅读459次

    前言:最近在学习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方法笔记

        本文链接:https://www.haomeiwen.com/subject/qgbovftx.html