2.胡乱分析第二波
先从第一波跳出来,想想怎么我们到底要干嘛?信息处理简单流程是这样的:
收到信息会插入到数据库里,然后撤回就是移除数据库里对应的这条信息!
那么我们可以:
- 1.找个东西把所有接收到的信息存起来;
- 2.当触发了撤回操作,然后通过一个标识找到我们存起来的信息;
- 3.把这条信息当做一个新的信息插入到数据库里;
- 4.更改撤回的提示
强调一点,搬运,一开始我还想着去处理找个信息,然后拿点什么,加点什么。 后面发现改动的成本非常大,而且不知道会引发什么样的问题,所以拿到信息直接 传就好,不要加特技进去!
然后是找个标识,猜测是第一波分析出来的msgId,等等还需要我们验证下! 继续跟方法,另一个账号发送一条信息,然后全局搜insert,定位到了一个数据库插入的方法!
不会直接跟这个bt.f类,因为参数一样,而且执行插入操作肯定是不止调用一个方法的,跟下该方法的父方法,
继续跟
可以,参数不一样,说明信息是从这里构造的,然后也调用了好几个方法,打开源码查看这个类:com.tencent.mm.storage.be还有这个b方法,从左侧的类结构可以看到,b方法有好几个,但是第一个参数都是一样的(bd bdVa) 进去这个bd类看看 com.tencent.mm.storage.bd
好复杂的类,加上混淆,看死个人,上面讲了,搬运,而不是对信息做处理,我们要做的只是找到这个信息里和msgId一样的标记而已。全局搜msgId:
恩,就是这个field_msgId了,我们通过Xposed拿到这个变量的值,然后做下对比,验证下我们的猜想! 然后写出这样的程序:
怀着忐忑的心情重启手机,发信息,撤回信息,看下日志
接下来我们整个Map来存键值对,然后试试在触发撤回操作的时候,根据msgId取出 对应的信息然后调用插入数据的方法,所以上面的代码改一下,我们要拿到调用b方法的那个对象。 然后就有了这样的代码:
运行下看看效果~
正常的微信里撤回:
Hook了的微信:
可以,尽管提示XX撤回了一条消息,但是信息并没有真的被撤回,所以说Hook成功了~ 接着我们进行一些细节的优化,还有改下撤回的信息。把能打印的都打印出来吧,把Content内容修改下:
打印下:
呃,我的微信好像有点不对劲,变成头像发信息了?:
感觉是type类型的问题,改改,改成撤回信息那个type?
嗯,信息是看到了,但是不应该是这样的啊,后面排查了一下是updateWithOnConflict方法返回值是0, 才这样,把返回值设置为1,就可以了(param.result = 1)
嗯,正常是正常了,不过这顺序有点不对劲啊,撤回的提示信息比我们插入的信息快了一些,那就加点吧。
运行看看:
想着大概差不多的时候,今早老同学发的一个链接,然后撤回,撤回信息提示变成这样了:
后来想想还是拼接成这样的提示信息就算了,不要再在提示信息里显示具体内容:
小猪拦截到 XXX 撤回的信息
最终效果如下,可以,很赞: