好吧,update调用的是**updateWithOnConflict()**方法,把参数打印出来看看?
运行结果发现每接受到一条信息都会触发这个方法,连公众号信息也会调用。 (PS:Hook的时候参数的个数和顺序要对应,我一开始漏了一个string,log一直没打印,还以为 垃圾魅族的问题,没把我恶心死)
可以,那么分别来看看自己发信息撤回和别人发信息撤回 的两种情况:
不难发现,第一个参数应该是一个代表信息类型的东西,普通信息是rconversation,而撤回信息类型是message,然后是第二个参数,类型是ContentValue,这个类用于存取键值对的数据,每个键值对表示一列的列名和该列的数据,撤回类型的信息除了上面的content外还有后面一块:
我们先要明确防止撤回的是别人发的信息而不是自己的,所以先要过滤掉自己的,对比两种情况得出这样的结论:
-> 判断第一个参数是否为message -> 获取第二个参数中的type判断是否等于10000(自己撤回是10002)
修改下程序,只处理别人发的信息的情况,打Log验证下,
看Log却意外发现了一个问题:
是的,多了个你撤回了一条信息,出现这条信息的原因是微信整了个比较贴心的功能:
用户撤回信息的原因可能是编辑内容错误,在五分钟以内,用户点击可以通过点击重新编辑, 获得撤回的文本信息,然后进行重新编辑,五分钟过后就会变成你撤回了一条消息。
所以判断条件还要加上这个过滤条件,所以代码就变成:
继续看Log:
行吧,是个聪明人都知道msgId这个字段里面有东西。
图2
2.胡乱分析第二波
图3
先从第一波跳出来,想想怎么我们到底要干嘛?信息处理简单流程是这样的:
收到信息会插入到数据库里,然后撤回就是移除数据库里对应的这条信息!
那么我们可以:
- 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 撤回的信息
最终效果如下,可以,很赞:
3.胡乱分析第三波
图4
在我以为一切大功告成,膨胀得沾沾自喜的时候,测试小哥发现了意外的发现了一个Bug, 发语音,图片,视频,虽然没撤回,但是打开失败,估计就是文件被删除了。
而Android里删除文件调用的是File类的delete方法,跟一波方法,直接搜File.delete看下是否真的有调用:
好吧,直接Hook掉File类的delete方法,看看微信删除对应类型文件的路径,观察一波这些路径的规律,然后如果delete方法被调用了,过滤一波,不删除文件,直接返回结果true,欺骗微信文件删除成功,以此瞒天过海~ 代码如下:
依次发送语音,图片,视频,然后撤回,对应的删除记录:
观察下路径规则,不难发现对应的文件夹是 voice2,image2,video,so过滤一波路径,如果路径包含这三个 直接过滤设置返回值为True,另外公众号,外链,都是属于文本信息,只是微信做了特别的解析,比如上面那个 百度贴吧的,所以和普通信息一样处理就好。
然后发现只有语音能够正常打开,图片和视频都无法正常打开,跟了下路径,
用ES浏览器来到这个路径下:
这就很奇怪了,明明图片存在,但是就是不能正确加载,而且每次点开都会执行一次删除的操作, 就是说数据库里还保存着这个记录,撤销信息无非 删数据库记录+删文件,删文件肯定是没问题的, 那么问题肯定就出在删数据库记录那里了。跟踪一下SQLiteDatabase里的delete()方法,把参数和返回值打印下:
依次做:发送语音,发送图片,发送视频然后撤回的日志跟踪。
结合delete方法一起看:
结合上面的日志和delete方法的代码,可以得这样的结论:
- 1.音频相关放在voiceinfo表里,图片相关放在ImgInfo2表里,而视频相关则放在videoinfo2表里。
- 2.还有个WxFileIndex2表,从删除语句可以知道就是根据msgId去删除对应的文件记录,但是返回值却有1,6,2,0?
跟下返回值的代码:executeUpdateDelete()方法,在SQLiteStatement类中
改变的行的数目?一般来说删除一条数据,正确执行完,受影响的行数会是1。 而只有语音能正常播放,难道是这个原因?hook下这个方法,如果第一个参数是这四个表, 直接把返回值设置成1试试~
发下信息然后撤回下试试~
行吧,视频和图片都能打开了,到此总算完美解决的,真的是一波三折。 接着改下UI页面,补上上次下厨房Hook Xposed检测的开光和防撤回开关。 最后的界面如下:
小结
这就是我不喜欢折腾Xposed的原因,太多未知,总要去猜测,去验证自己的猜测,不断安装重启, 当你以为可以了,然后又出新的问题,如果不是 设计小姐姐的原因,真不想去碰这个东西。
附:因为代码比较长,而且改动了下厨房,还有王者荣耀相关的代码,所以就不贴代码了,
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!!!!
![](https://img-blog.csdnimg.cn/img_convert/39c33e42295bed25ac526cdde905f855.jpeg)
结尾
最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)
泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter
接下来是资料清单:(敲黑板!!!)
1.数据结构和算法
2.设计模式
3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可免费领取!
*(怎么能少了一份全面的面试题总结呢~)
[外链图片转存中…(img-94AmrLDn-1711294991361)]
不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
[外链图片转存中…(img-SW4EjVFz-1711294991361)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可免费领取!