开发工具
工具名称 | 工具类型 | 说明 |
---|---|---|
AndroidStuduo | 编辑工具 | 开发工具 |
jadx | java工具 | 将apk解成java项目 |
xposed | 插件工具 | 插件 |
版本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才能成功。
需要添加这个: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);
}
}