吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14311|回复: 14
收起左侧

[Android 原创] Xposed常用方法使用详解(配合微信6.6.7源码)

  [复制链接]
hjw45611 发表于 2019-1-11 15:29
本帖最后由 hjw45611 于 2019-1-11 15:38 编辑

经过上次的使用xposed拦截发表朋友圈的例子后,好多坛友表示有些方法不太理解,这里我就讲解一下Xposed中用的最多的几个方法,方便大家理解
严重声明
本文的意图只有一个就是通过分析app学习更多的逆向技术,如果有人利用本文知识和技术进行非法操作进行牟利,带来的任何法律责任都将由操作者本人承担,和本文作者无任何关系,最终还是希望大家能够秉着学习的心态阅读此文。

以下教程适用于已知如何使用Xposed简单打印数据,但不了解如何深入拦截的坛友
如果连Xposed是如何安装使用都不知道的就不用往下看了,可以直接看论坛内的基础帖子。

findAndHookMethod

查找并拦截方法的执行,只需要找到类名,方法名,函数名,参数类型就可以使用
该方法使用最多,但大多局限于改参数与改结果,在真正Hook大型应用中需要追根溯源,结合其他方法使用


该方法有两种传值,我通过以下案例来说明
要拦截的方法在微信源码:
屏幕快照 2019-01-11 10.37.44.png
-方法1:
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.qqmail.ui.MailAddrsViewControl$5",//完整类名
                                    lpparam.classLoader ,
                                    "onKey",//方法名
                                    View.class,int.class,KeyEvent.class,//参数class
                                    new XC_MethodHook() {
 
                                        @Override
                                        protected void beforeHookedMethod(MethodHookParam param) {
                                            param.args[1]=67;
                                            KeyEvent key= new KeyEvent(0,0);
                                            param.args[2]=key;
                                        }
                                        @Override
                                        protected void afterHookedMethod(MethodHookParam param) {
                                            param.setResult(true);
                                        }
                                    });


-方法2:

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
Class<?> cControl = null;                            try {
                                cControl = mlpparam.classLoader.loadClass("com.tencent.mm.plugin.qqmail.ui.MailAddrsViewControl$5");
                                XposedHelpers.findAndHookMethod(cControl ,
                                        "onKey", View.class,int.class,KeyEvent.class,
                                        new XC_MethodHook() {
 
                                            @Override
                                            protected void beforeHookedMethod(MethodHookParam param) {
                                                param.args[1]=67;
                                                KeyEvent key= new KeyEvent(0,0);
                                                param.args[2]=key;
                                            }
                                            @Override
                                            protected void afterHookedMethod(MethodHookParam param) {
                                                param.setResult(true);
                                                 
                                            }
                                        });
                            } catch (ClassNotFoundException e) {
                                e.printStackTrace();
                            }


其实两种方式大致相同,差异只有,第一种传入的完整类名与lpparam.classLoader第二种传入Class< ?> ,其实第一种通过传入类名与lpparam.classLoader就是用来构建Class< ?>


如果我想执行源码中的if语句,就可以在方法未执行的beforeHookedMethod中修改了方法参数int与KeyEvent

如果我想让方法返回值为true,不继续传递keyEvent,就可以在方法执行后的afterHookedMethod中修改方法结果setResult(true);


findClass

查找类,因为HookMethod时,参数可能是应用内自定义的类,所以需要这个方法来找到,在未找到时抛出异常
参数(完整类名String,classLoader 应用的类加载器)
[Java] 纯文本查看 复制代码
1
2
final Class<?> cf = XposedHelpers.findClass("com.tencent.mm.plugin.luckymoney.b.f",
                mlpparam.classLoader);

find出来后就可以作为findAndHookMethod中方法的参数来进行拦截了,拦截到后可以使用findField来查看类中的变量值。

findClassIfExists

未找到时则返回null,不会有异常

findField

查找类中的变量

参数是(变量所在的Class,变量名String),再通过get方法就可以得到变量,get方法的参数就是变量所在的Class的实例Object
直接引用上一个帖子中的例子
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
try {
    final Class<?> SnsUploadUIClass = cl.loadClass("com.tencent.mm.plugin.sns.ui.SnsUploadUI");
        XposedHelpers.findAndHookMethod(SnsUploadUIClass, "onCreate", Bundle.class,
            new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                    Object oSnsUploadUI = param.thisObject;
                    XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.sns.ui.SnsUploadUI$5$1",
                        mlpparam.classLoader, "pO", String.class,new XC_MethodHook() {
                            @Override
                            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                super.beforeHookedMethod(param);
                                //获取SnsUploadUIClass中的nRk变量
                                Object nRk=XposedHelpers.findField(SnsUploadUIClass, "nRk").get(oSnsUploadUI);
                                     
                                //方法1
                                //强转为EditText 
                                EditText editText = (EditText) nRk;
                                //得到发表朋友圈的文本
                                String text=editText.getText().toString();
  
                                //方法2
                                //执行getText().toString()得到发表朋友圈的文本
                                String text=  XposedHelpers.callMethod(nRk,"getText").toString();
                                  
                                //todo上传数据
                            }
                    });
                }
            });
} catch (Exception e) {
    e.printStackTrace();
}


最外层的findAndHookMethod拦截到SnsUploadUI这个Activity类的实例对象,里层的findAndHookMethod拦截的是点击事件,点击时通过findField取出SnsUploadUI中的变量nRk

callMethod

执行某个类里的方法,如果有个方法是查询数据库的,你可以得到类的实例后再使用这个方法来执行自己写的语句

参数是(方法所在类的实例Object,执行方法名String,参数)

在上面的例子中我们可以看到
[Java] 纯文本查看 复制代码
1
String text=  XposedHelpers.callMethod(nRk,"getText").toString();

通过执行nRk实例的getText方法字符对象,再通过.toString()转化为字符串


callStaticMethod
执行静态方法,源码中有一个方法,我们可以直接调用它
屏幕快照 2019-01-11 14.57.20.png

[Java] 纯文本查看 复制代码
1
2
3
4
5
Class<?> classMultiProcessSharedPreferences=
               XposedHelpers.findClass("com.tencent.mm.sdk.platformtools.MultiProcessSharedPreferences",mlpparam.classLoader);
       SharedPreferences preferences=
               (SharedPreferences) XposedHelpers.callStaticMethod(classMultiProcessSharedPreferences,"getSharedPreferences",mwxContext,"notify_key_pref_no_account",4);
       String username=preferences.getString("login_weixin_username","");

可以直接得到notify_key_pref_no_account.xml中存储的notify_key_pref_no_account字段的值。

好了,大致用的最多的可能就是这几个方法了,当然还有其他方法在实际中会用到,最好的方法是阅读Xpose 的文档,并在实际使用中多多使用

免费评分

参与人数 5威望 +1 吾爱币 +12 热心值 +4 收起 理由
默默伤心 + 1 用心讨论,共获提升!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
黑猫探长 + 1 + 1 热心回复!
xgmtys + 1 谢谢@Thanks!
KevinHacker + 1 + 1 我居然看完了

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| hjw45611 发表于 2019-1-14 10:18
1163194557 发表于 2019-1-14 09:09
很多软件对Xposed都有检测了  不安全

你是指的Xposed不安全,还是xposed容易被检测到不安全??
Xposed不安全的话,最好只用有源码的Xposed模块,我只用我写的模块
xposed容易被检测到的话,这就像反编译与反反编译一样,反编译技术发展起来了,信息才会更加安全,没有安不安全,只有技术到不到位而已。
头像被屏蔽
Wise_58 发表于 2019-1-11 16:12
剪辑狮X 发表于 2019-1-11 16:40
Mr.轻熟男 发表于 2019-1-11 17:34
不明觉厉~
dhsq88 发表于 2019-1-11 19:08
学习学习
565266718 发表于 2019-1-11 21:35
支持了。。。。
ChinaF 发表于 2019-1-11 22:28
支持一下
daixh 发表于 2019-1-12 09:54
不明觉厉~
Jason9425 发表于 2019-1-13 11:41
学习学习
1163194557 发表于 2019-1-14 09:09
很多软件对Xposed都有检测了  不安全
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-15 09:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表