处女座强迫症最讨厌别人发消息后撤回了,尤其是发的图片还没看清就被撤了,或者还没来得及看的消息就已经被撤回了。最近逆向工程很火,所以我也简单的逆向了一把微信 for Mac。

为什么不对 iOS 动刀

iOS 上的微信 APP 不一定始终在前台运行着,如果别人在撤回消息时微信在后台甚至手机锁屏、断网,这时很可能没有调用撤回消息的方法,甚至当微信重新返回到前台时,从服务器根本不会接到原来消息的数据,而是只收到了一条『撤回』指令。基于以上猜测,我决定对微信 for Mac 下手,毕竟电脑上的微信只要开着就一直接收消息,Mac 版微信不会跑到后台。

脑洞和胆子都要大

之前看的一些逆向的教程里,感觉前期工作都是装软件配环境,噼里啪啦命令一顿敲,整的挺玄乎,其实都是用人家现成儿的工具做些事情,美其名曰『站在巨人的肩膀上』,这里不再赘述。在我看来第一个真正意义上有难度的事情就是一个字儿:『猜』!

想要凭 dump 出的头文件里面的一堆函数名类名来猜出想要动手脚的地方,的确是个技术活儿。不仅考验脑洞,有时候还得运气好。把应用程序中的微信拖到 Hopper 中,搜下 “revoke”。这不,我一下子就猜出在哪个方法里面处理撤回消息逻辑的了:

我凭借直觉,认为 -[MessageService onRevokeMsg:] 就是我们要找的方法。事实也证明我是对的,一次成功!先看看这个方法的伪代码:

伪代码里面包含着好多层复杂的 if 判断逻辑,想必是这里复杂的业务逻辑让微信的同事无比抓狂,不要怕,我们不想让后面的事情发生,直接来个return 就万事大吉!按快捷键 『option+A』 或者选择 Hopper 菜单栏的 『Modify -> Assemble Instruction…』来修改第一行汇编语句:

可能觉得这里直接 return 掉是不是胆子也太大了,其实我还是看了函数里这坨代码的。那么多的 if 判断伴随着的是各种出错场景下的数据上报,真正核心业务逻辑也就是下面这坨:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

r12 = [[MessageData alloc] initWithMsgType:0x2710];

rax = [r12 isSendFromSelf];

rsi = @selector(toUsrName);

if (LOBYTE(rax) != 0x0) {

rbx = [[r13 toUsrName] retain];

[r12 setFromUsrName:rbx];

[rbx release];

rbx = [[r13 fromUsrName] retain];

[r12 setToUsrName:rbx];

}

else {

rbx = [[r13 toUsrName] retain];

[r12 setFromUsrName:rbx];

[rbx release];

rbx = [[r13 fromUsrName] retain];

[r12 setToUsrName:rbx];

}

[rbx release];

[r12 setMsgStatus:0x4];

[r12 setMsgContent:var_58];

[r12 setMsgCreateTime:LODWORD([r13 msgCreateTime])];

[r15 AddLocalMsg:var_50 msgData:r12];

rbx = [[NSArray arrayWithObject:r13] retain];

[r15 DelMsg:var_50 msgList:rbx isDelAll:0x0];

r15 = *objc_release;

[rbx release];

[r12 release];

这段代码先是判断下撤回消息的人是不是自己,然后分情况更新 UI,最后生成并更新数据。既然没有啥重要操作,那就放心地忽略吧哈哈。

现在需要将修改后的汇编重新生成新的可执行文件。选择 Hopper 菜单里的 『File -> Produce New Executable…』 后点 Yes:

最后将生成的可执行文件替换到 /Applications/WeChat.app/Contents/MacOS/WeChat

唯一让我不解的是无需对新的 WeChat 可执行文件进行代码签名微信依然可以正常运行。我是第一次玩逆向,还请前辈大神们指教。做了一系列撤回消息的尝试后,手机上面显示撤回,但 Mac 版微信的消息依然还在。一次猜中,成功!

后记

其实逆向工程是门很有趣的学问,而任何学问都是入门简单深入难。本例看似容易,其实如果面对更加复杂的环境下,光靠我那点儿可怜的汇编知识肯定是不够的。如果是对 iOS 上的 APP 进行逆向,实则准备工作要麻烦得多。真正掌握了底层的原理和基础知识才是硬道理!

老子终于也当了回标题党!啊哈!

微信服务器会留撤回的消息吗,让你的微信不再被人撤回消息相关推荐

  1. 一刷到底 微信 服务器设置,炸屏!给我一面国旗!@微信官方,服务器被刷崩了……...

    彻底刷屏了!!! 今天上午 课长的朋友圈 瞬间被"请给我一面国旗@微信官方"刷屏 超级多的头像也瞬间变成了清一色 全都在发, 真的是炸了啊! 很多小伙伴还一脸蒙圈, 到底国旗在哪里 ...

  2. n96 微信 服务器繁忙,网友称塞班手机已无法登陆QQ/微信

    从当年街机N73,到T9 机皇N95,再到全键盘机皇E73,最后到触屏旗舰N97.机皇这个称号一直是N系列的代表.塞班系统也一直陪伴着我们80, 90 后.虽然当时屏幕最早只有1. 5 到2. 4 英 ...

  3. 怎么就能打开微信服务器恢复朋友圈信息,今天才知道,原来微信打开这个功能,就能删除几年前的朋友圈内容...

    然后搜索你自己的微信昵称,搜索出来后点击你的头像 接着点击这里的发布时间 在这里我们就可以选择查看某年某月发的朋友圈了,选择好年份和月份后,我们点击这里的确定 这样就能直接定位到我们想查看和删除的朋友 ...

  4. 微信公众号java开发:验证消息的确来自微信服务器

    微信公众号开发,微信服务需要认证服务,官方文档如下: 引入jar包如下: <dependency><groupId>com.github.binarywang</grou ...

  5. 通过Apache反向代理实现微信服务器80端口访问

    由于微信公众平台需要的80端口已经被apache占用,所以需要基于apache配置反向代理. 代理服务器就相当于一个中介,有正向代理与反向代理两种.在正向代理中,客户端通过代理服务器访问目标服务器,代 ...

  6. 微信撤回消息服务器还有存底么,真得有“后悔药”吗? 微信消息撤回解析

    微信消息撤回怎么玩? 微信已经成为我们生活中越来越离不开的一款手机应用.为了给用户带来更好的使用体验,微信也是不断通过升级来对功能进行改进和升级. 近日,iOS版微信升级到了5.3.1版本,在该版本中 ...

  7. 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

    本文作者潘唐磊,腾讯WXG(微信事业群)开发工程师,毕业于中山大学.内容有修订. 1.内容概述 本文总结了企业微信的IM消息系统架构设计,阐述了企业业务给IM架构设计带来的技术难点和挑战,以及技术方案 ...

  8. 暗恋的女孩子撤回了啥?3步查看微信撤回消息

    微信在2014年推出的一个小小的新功能:撤回消息,使用此功能者提神醒脑.神清气爽,但被施用者却可能会抓耳挠腮.咬牙切齿的想知道你到底撤回了啥,这就是所谓的Curiosity kills the cat ...

  9. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  10. Java微信公众平台开发(二)--微信服务器post消息体的接收

    转自: http://www.cuiyongzhi.com/post/39.html 在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发 ...

最新文章

  1. 为你痴,为你狂,小车载我梦飞翔
  2. Android服务之AIDL
  3. 数据库的内连接和外连接区别?
  4. iOS quartzCore学习之UIBezierPath 详解
  5. [Swift]LeetCode859. 亲密字符串 | Buddy Strings
  6. Android用户界面 UI组件--TextView及其子类(二) Button,selector选择器,sharp属性
  7. 专注企业市场 或是网盘危机的有效出路
  8. Some thoughts on dfs
  9. python post 上传文件_python接口自动化7-post文件上传
  10. 勤哲excel 2007服务器 模板分类为空,勤哲Excel服务器20088.7完整企业版
  11. 数据科学中的五种认知偏差,你都了解吗?
  12. PXE网络装机和kickstart无人值守
  13. 动态拨号云服务器安装Ubuntu系统使用说明
  14. 玩游戏计算机配置,电脑玩游戏主要看什么配置 玩大型游戏电脑配置推荐
  15. 微信语音功能模块的测试点
  16. C++11介绍之vector::push_back和vector::emplace_back区别
  17. jaeger,zipkin,datadog,skywalking等分布式追踪工具
  18. 看了不会后悔的——SQL 面试题库
  19. selenium 爬虫项目实例 爬取社保五险
  20. 毕业设计记录 day(4)

热门文章

  1. YOYOW-WeCenter特别版免费开源发布,一小时建立你的问答社区
  2. 一个移动开发老码农的书单
  3. Docker容器时间与宿主机时间不一致
  4. DOORS和Reqtify — 需求管理和需求追溯工具
  5. leetcode_Remove Duplicates from Sorted Array
  6. 多关键词采集搜索引擎URL网址域名
  7. Can‘t connect to any repository: 的解决办法, 在Push代码,提交代码到代码仓库的时候,提示不能连接到该代码仓库
  8. 《敏捷教练-如何打造优秀的敏捷团队》读书笔记
  9. PLM产品生命周期管理,包含哪些阶段?
  10. Python入门学习笔记(五)——文件、文件系统