xposed android6,Xposed常用方法使用详解(配合微信6.6.7源码)

本文主要讲解Xposed中常用的几个方法,包括findAndHookMethod、findClass、findClassIfExists、findField、callMethod、callStaticMethod等。介绍了各方法的功能、参数及使用示例,帮助已知Xposed简单打印数据但不了解深入拦截的坛友学习逆向技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本帖最后由 hjw45611 于 2019-1-11 15:38 编辑

经过上次的使用xposed拦截发表朋友圈的例子后,好多坛友表示有些方法不太理解,这里我就讲解一下Xposed中用的最多的几个方法,方便大家理解

严重声明

本文的意图只有一个就是通过分析app学习更多的逆向技术,如果有人利用本文知识和技术进行非法操作进行牟利,带来的任何法律责任都将由操作者本人承担,和本文作者无任何关系,最终还是希望大家能够秉着学习的心态阅读此文。

以下教程适用于已知如何使用Xposed简单打印数据,但不了解如何深入拦截的坛友

如果连Xposed是如何安装使用都不知道的就不用往下看了,可以直接看论坛内的基础帖子。

findAndHookMethod

查找并拦截方法的执行,只需要找到类名,方法名,函数名,参数类型就可以使用

该方法使用最多,但大多局限于改参数与改结果,在真正Hook大型应用中需要追根溯源,结合其他方法使用

该方法有两种传值,我通过以下案例来说明

要拦截的方法在微信源码:

55fd2b2273b5a8b4531f72773c469d6e.gif

屏幕快照 2019-01-11 10.37.44.png (191.25 KB, 下载次数: 1)

2019-1-11 15:37 上传

-方法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

执行静态方法,源码中有一个方法,我们可以直接调用它

55fd2b2273b5a8b4531f72773c469d6e.gif

屏幕快照 2019-01-11 14.57.20.png (43.5 KB, 下载次数: 2)

2019-1-11 15:38 上传

[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 的文档,并在实际使用中多多使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值