微信防撤回的实现

来源:互联网 发布:致远oa软件下载 编辑:程序博客网 时间:2024/04/30 02:25

转:http://www.jianshu.com/p/dcdae5eb0829

首先声明,这绝不是接锅,只是因为防撤回的原作者(fkzhang)不更新了,而我又非常需要防撤回,某些开车群总是喜欢开后撤回,于是...

在我决定做防撤回之前,我仔细研究了 fkzhang 开源的源码,只可惜他那份源码已经年久失修,我特地下载了他最后支持的微信 6.3.13 版本,发现与现在所使用的 6.5.3 版本之间,代码上的差距不是一星半点,这直接让我断了在他的源码上进行维护的念头。


既然不再想维护,那必然是要自己起一套了,按之前折腾 mac 版微信的经验,我决定先找到revoke字样所对应的代码,很幸运的,搜索结果并不多,大概 10 多个类会涉及到 revoke,而经过分析,大部分的类都是在写 log,真正执行 revoke 操作的是 com.tencent.mm.model.bo,截取关键代码如下:


看起来是不是觉得很乱并且看不出逻辑?没关系,我们在这里需要做的只是取出数据而已,一开始的逻辑很明确的告诉了我们,如果str变量的值是revokemsg,那么就会走下面真实的撤回的代码。

另一方面,通过抓取微信/data/data/com.tencent.mm内的数据库,经分析可知,微信的撤回的原理是修改数据库,将原本的信息改为『撤回了一条消息』。所以我们要做的,是在发生撤回的时候,先保持原先那条数据不被删除,并插入一条『撤回被阻止』的信息。

好了,那么继续分析代码,首先要知道str变量的值是怎么来的,往上翻一下可以看到以下代码:


很明显我们应当跟踪bf.q这个方法,看一下这个方法里做了什么:


好了,里头逻辑做了些啥不需要管了,只需要管它的返回值,结合上面的代码,我们很容易能知道,在这个返回的map内包含以下数据:

.sysmsg.$type = revokemsg.sysmsg.revokemsg.session = 发送消息的人.sysmsg.revokemsg.replacemsg = 原始消息要替换的文本(也就是『XX撤回了一条消息』).sysmsg.revokemsg.newmsgid = 消息ID

那么,只需要将.sysmsg.$type.sysmsg.revokemsg.replacemsg的内容改掉就行了,把这个过程变成以下步骤:

1. 修改 .sysmsg.$type 为 null,以使其不触发 update 数据库的流程2. 将 .sysmsg.revokemsg.replacemsg 的内容改为『撤回被阻止』3. 将被改写过的数据写入数据库

下面的代码完成了这一系列步骤:


当然这里还有一个数据库操作的问题,我们必须有办法得到微信内的数据库,然后才能进行操作,此时需要在微信内找到数据库相关的类,还需要知道库的结构,当然库结构是非常容易得到的。具体如何查找的不再赘述,直接看代码:


这样就可以得到一个数据库对象,凡是遇到数据库操作,都可以从这个对象里进行方法的调用。

到此为止,微信的防撤回就基本上完成了,再补上一些基础代码,挂到 Xposed 框架就可以成功运行。


新的防撤回已完成并且已开源,请大家移步至我的 Github,欢迎关注这个项目,我将持续更新。觉得有用的话,给个 Star 怎么样?


原创粉丝点击