qq消息撤回

开发工具

工具名称 工具类型 说明
AndroidStuduo 编辑工具 开发工具
jadx java工具 将apk解成java项目
xposed 插件工具 插件
qq 版本8.8.80

开始

先通过jadx把apk反编译出来源码,通过build出来,在android studio打开,方便分析。

  • 要撤回自己的消息,肯定需要监听消息发送。

消息操作的函数基本都在这里ChatActivityFacade,可以通过 hook 此类的全部的函数,再通过手机发送一条消息,看会调用哪些函数。

最后确定,自己的发送消息都会调用到这个函数:

在这里插入图片描述

那我们只要hook住这里,拿到撤回消息需要的数据就行 message消息体。

//监听消息 = 自己
public void messageMonitoring() throws Exception {
    Class<?> ChatActivityFacade = mHookClassLoader.loadClass("com.tencent.mobileqq.activity.ChatActivityFacade");
    Class<?> QQAppInterface = mHookClassLoader.loadClass("com.tencent.mobileqq.app.QQAppInterface");
    Class<?> MessageRecord = mHookClassLoader.loadClass("com.tencent.mobileqq.data.MessageRecord");
    Class<?> ChatActivityFacade$SendMsgParams = mHookClassLoader.loadClass("com.tencent.mobileqq.activity.ChatActivityFacade$SendMsgParams");
    XposedHelpers.findAndHookMethod(ChatActivityFacade, "a",
            QQAppInterface, boolean.class, MessageRecord, ChatActivityFacade$SendMsgParams,
            new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    XLog.d("监听消息 = 自己");
                    
                    //延迟4秒撤回
                    new Handler().postDelayed(()-> messageRetraction(param.args[2]), 4_000);
                }
            });
}
  • 撤回消息

在QQMessageFacade这个类里面

在这里插入图片描述

我们只要伪造这个 f 方法即可

当然不可能事事如意,刚开始试的时候不行,再往后面跟踪

在这里插入图片描述

发现需要把dialog设置为true才能成功。

扫描二维码关注公众号,回复: 14987127 查看本文章

需要添加这个:ReflectionUtil.invokeMethod(MessageCache, “b”, boolean.class, true);

//消息撤回 = 事件
public void messageRetraction(Object ChatMessage) {
    XLog.d("消息撤回 执行");
    try {
        Class<?> MessageRecordClazz = mHookClassLoader.loadClass("com.tencent.mobileqq.data.MessageRecord");
        String selfuin = ReflectionUtil.getFieldValue(ChatMessage, "selfuin");
        Object sApplication = ReflectionUtil.invokeStaticMethod(mHookClassLoader.loadClass("com.tencent.common.app.BaseApplicationImpl"),
                "getApplication");
        Object qqAppInterface = ReflectionUtil.invokeMethod(sApplication, "getAppRuntime", String.class, selfuin);
        Object MessageCache = ReflectionUtil.invokeMethod(qqAppInterface, "getMsgCache");
        ReflectionUtil.invokeMethod(MessageCache, "b", boolean.class, true);
        Object QQMessageFacade = ReflectionUtil.invokeMethod(qqAppInterface, "getMessageFacade");
        ReflectionUtil.invokeMethod(QQMessageFacade, "f", MessageRecordClazz, ChatMessage);
        XLog.d("消息撤回 执行 完毕");
    } catch (Exception e) {
        XLog.d(e);
    }
}

猜你喜欢

转载自blog.csdn.net/l331258747/article/details/128716881