微信防撤回的实现

转: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 怎么样?


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值