安卓逆向——Xposed插件常用HOOK方法

本文详细介绍了如何使用Xposed框架在Android中hook不同类型的函数,包括普通静态方法、构造方法、匿名内部类以及拦截并替换方法。通过jadx反编译APK,定位到目标类和方法,然后利用XposedHelpers进行hook,实现方法执行前后的自定义逻辑,以及主动调用其他方法。同时,文章提供了具体的代码示例和日志打印技巧,帮助开发者理解hook机制。
摘要由CSDN通过智能技术生成

1.   hook 普通静态方法

jadx 反编译分析查看代码,找到需要hook的类和方法

 Xposed 插件的写法 

        // 判断 当前的 启动的模板程序是否是 需要hook的 应用,这里要知道 应用的报名
        // 如果不判断指定 报名 启动 插件的话,打开所有的应用都会 启动插件,就会保存,其他的应用 不一定用这个指定方法
        if(loadPackageParam.packageName.equals("com.qianyu.helloworld")) {
 
            // hook 方法  普通方法 静态方法
            XposedHelpers.findAndHookMethod(
                    "com.qianyu.helloworld.LoginActivity", // 指定加载类,包名+类名
                    loadPackageParam.classLoader,  // 类加载器
                    "login",           // 指定hook的方法
                    String.class, String.class,    // 指定hook的方法的参数列表,参数类型.class
                    new XC_MethodHook() {
                        @Override  // 执行指定方法之前 要做的操作,就可以在这个方法里面 写逻辑
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                            // param.args 方法的 传入参数
                            XposedBridge.log("args1: " + param.args[0]);
                            XposedBridge.log("args2: " + param.args[1]);
 
                        }
 
                        @Override  // 执行指定方法之后 要做的操作,就可以在这个方法里面 写逻辑
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
 
                            // 在 执行 方法之后,获取方法的返回值 param.getResult()
                            XposedBridge.log("result: " + param.getResult());
 
                        }
                    }
            );
        }

2.  hook 构造方法


jadx 反编译找到 构造方法,使用Xposed的插件hook测试

 Xposed插件hook构造方法的解法

            // hook 构造方法 不需要填写方法名
            XposedHelpers.findAndHookConstructor(
                    "com.qianyu.helloworld.MySQLiteDatabase",  // 指定加载类,包名+类名
                    loadPackageParam.classLoader,
                    Context.class,             // 指定hook的方法的参数列表,参数类型.class
                    new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                            XposedBridge.log("args1 findAndHookConstructor: "+param.args[0]);
                            Toast.makeText((Context) param.args[0],"hook 构造方法 ",Toast.LENGTH_LONG).show();
                        }

                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                        }
                    });

3.  hook 匿名内部类

以 一个实践监听为测试,作为一个 匿名内部类的 hook 测试

android/view/View 匿名内部类,调用 

Xposed 插件的hook 写法 

            // hook 匿名内部类
            Class <?> clazz = XposedHelpers.findClass("com.qianyu.helloworld.LoginActivity$1",loadPackageParam.classLoader);
            XposedHelpers.findAndHookMethod(clazz, "onClick", View.class,
                    new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                            View view = (View) param.args[0];
                            XposedBridge.log("View beforeHookedMethod: "+view.getId());
                        }

                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            View view = (View) param.args[0];
                            XposedBridge.log("View afterHookedMethod: "+view.getId());
                        }
                    });

4.  xposed 拦截方法(hook并替换方法(XP主动调用方法))

jadx 反编译 apk 应用,找到 payFailed 或者 payCancel的方法,拦截 变成 执行 paySuccess方法

 找到 对应的 类名 com.qy.zombie.zombie$3 这才是 上面三个方法的 所属的类里面,不然会hook不到

xposed 插件写 拦截方法(替换方法的写法)和 XP主动调用方法 方法

中间出错,用打印日志或调用栈看错误日志

              // 打印方法调用栈的信息
                            StackTraceElement[] wodelogs = new Throwable("wodelog").getStackTrace();
                            // 使用for循环打印 调用栈查看调用关系
                            for(int i = 0;i<wodelogs.length;i++){
                                XposedBridge.log("查看调用栈:"+ wodelogs[i].toString());
                            }

        // 换了 一个 贪吃蛇的项目
        if (loadPackageParam.packageName.equals("com.yunhaoge.tanchishe.egame")) {
            // 找到 需要 执行方法的 类
            Class<?> clazz = XposedHelpers.findClass("com.qy.zombie.zombie$3",loadPackageParam.classLoader);
            // 拦截方法,替换方法 payCancel
            XposedHelpers.findAndHookMethod(clazz, "payCancel", Map.class,
                    new XC_MethodReplacement() {
                        @Override
                        protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {

                            // 替换其他方法,XP主动调用 方法
                            Map<String,String>  map = new HashMap<>();
                            XposedHelpers.callMethod(methodHookParam.thisObject,"paySuccess",map);

                            // 打印方法调用栈的信息
                            StackTraceElement[] wodelogs = new Throwable("wodelog").getStackTrace();
                            // 使用for循环打印 调用栈查看调用关系
                            for(int i = 0;i<wodelogs.length;i++){
                                XposedBridge.log("查看调用栈:"+ wodelogs[i].toString());
                            }

                            return null;
                        }
                    });

            // 拦截方法,替换方法 payFailed 直接调用里面的  zombie.BuySccess(); 其他类的方法
//            Class<?> clazz2 = XposedHelpers.findClass("com.qy.zombie.zombie",loadPackageParam.classLoader);

            XposedHelpers.findAndHookMethod(clazz, "payFailed", Map.class,int.class,
                    new XC_MethodReplacement() {
                        @Override
                        protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {

                            // 替换其他方法,XP主动调用 方法
                            Map<String,String>  map = new HashMap<>();
                            XposedHelpers.callStaticMethod(
                                    XposedHelpers.findClass("com.qy.zombie.zombie",loadPackageParam.classLoader),
                                    "BuySccess");

                            // 打印方法调用栈的信息
                            StackTraceElement[] wodelogs = new Throwable("wodelog").getStackTrace();
                            // 使用for循环打印 调用栈查看调用关系
                            for(int i = 0;i<wodelogs.length;i++){
                                XposedBridge.log("查看调用栈:"+ wodelogs[i].toString());
                            }

                            return null;
                        }
                    });

        }

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.含笑.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值