比如抓取微信自动回复消息的功能点。
一.首先打开DDMS,使用按钮。
在微信中回复一个消息
点击Stop Method Profiling。
二.查看生成的报表,观察到如下两个方法
其中1应该是发送消息的接口方法。2应该是UI层显示的方法。
三.首先分析第一个方法:
1.,可以看到,参数值是String,返回值是Boolean(Z表示boolean),这里测试hook一下该函数。
2.测试结果:
可以看到成功hook到了,说明发送消息是调用的该方法。
3.然后如果需要调用该方法,首先需要获得该方法的实例,并去调用,然后还需要获取到具体消息指向的发送者。
那么这里需要对源码进行分析。
找到Pg方法
调用了apl方法,这里传入了str,继续往下分析可以看到调用了这个方法:
可以看到这个ex方法应该是具体的发送消息的方法:
其中调用了
setContent方法即为具体的设置方法,
可以看到该类cx就是消息的包装类:
这里通过id参数入手,field_talkerId,hook使用到该id的方法,打印堆栈信息:
com.tencent.mm.g.c.cx.hm
Class clz = XposedHelpers.findClass("com.tencent.mm.g.c.cx", lpparam.classLoader);
XposedHelpers.findAndHookMethod(clz, "hm", int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
LogUtil.d("打印调用堆栈开始...");
LogUtil.logStackTraces();
LogUtil.d("打印调用堆栈结束...");
}
});
测试输出结果:
进入该方法:
这里hook测试了一下,我发现原来field_talker才是真正的微信id, field_talkerId并没有用到。
所以整个hook的关键点方法都已经找到了:
1. com.tencent.mm.ui.chatting.p.Pg(String str) 方法,参数就是消息内容,可以发送消息,但是无法设置接受者id
2. com.tencent.mm.modelmulti.h(String str, String str2, int i, int i2, Object obj) 构造方法,第一个参数是接收者的微信id,第二个参数是内容。
自动回复的思路:
首先获得发送者的id,并保存下来,然后调用hook上面第一个方法发送消息,hook第二个方法修改微信id,实现收到消息立刻自动回复。
四:难点:调用发送接口进行发送:
1.回到之前分析的具体发送的方法,结合消息体用到的地方,可以观察到:
这里最终是调用了这个a方法,拼接参数进行发送的。a方法内部:
可以看到两个参数,第一个就是消息体封装类。
最后按步骤调用
测试结果,大功告成:
转载:https://blog.csdn.net/qq_22770457/article/details/101072143