吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5479|回复: 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] 纯文本查看 复制代码
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] 纯文本查看 复制代码
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] 纯文本查看 复制代码
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] 纯文本查看 复制代码
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] 纯文本查看 复制代码
String text=  XposedHelpers.callMethod(nRk,"getText").toString();

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


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

[Java] 纯文本查看 复制代码
 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 的文档,并在实际使用中多多使用

免费评分

参与人数 4威望 +1 吾爱币 +11 热心值 +4 收起 理由
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容易被检测到的话,这就像反编译与反反编译一样,反编译技术发展起来了,信息才会更加安全,没有安不安全,只有技术到不到位而已。
much789 发表于 2019-1-14 20:37
头像被屏蔽
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, 2019-4-19 18:31

Powered by Discuz!

© 2001-2017 Comsenz Inc.

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