吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

领取今日签到奖励
查看: 3660|回复: 86

[iOS 原创] iOS逆向-微信一键阅读所有消息

  [复制链接]
发表于 2018-12-5 18:14 | 显示全部楼层
本帖最后由 平而不凡 于 2018-12-5 19:14 编辑

iOS逆向-微信一键阅读所有消息

前言

每次打开微信,总有一些公众号推送烦人的且无营养消息,而微信又没提供全部已阅的功能,本章详细讲述一键阅读所有消息.

  • 安装一个砸壳的微信,或者自己去App Store下载一个再砸壳.
  • 恢复微信符号表 iOS符号表恢复
  • 给微信添加调试权限.
  • 分析.
  • Tweak.xm
  • 总结.

0x1:

IMG_1743.PNG

0x2:

Reveal分析:11.png

  • 小红点是个封装的图片控件         MMBadgeView
  • 红点中的数字是个封装了UILabel控件         MMUILabel

XCode加载微信进程:

22.png

从MMBadgeView控件入手:

33.png

这里选择直接从MMBadgeView入手,po  [MMBadgeView _shortMethodDescription] 命令,打印出MMBadgeView的所有属性和方法,发现三个方法格外显眼.

Symbolic BreakPoint下断:

44.jpg

放开断点后,小号发送条信息给这个微信,看看断点是否被断下.
55.png

微信在收到消息之后经过非常多的页面UI处理,然后再设置小红点的数量。这个时候往上回溯发现除了系统的渲染函数,第一个被调用的微信函数是[MMTableView layoutSubviews],这个函数是微信首页这个表格加载子视图的函数,我们所看到的首页上的任何东西都是这个函数加载出来的,那么在这之前发生了什么?如何收到的消息?怎么计算的未读消息数量?

继续下一步分析:

  • 现在程序停留在了UITableView这个控件的一系列渲染和布局函数上面,如果继续盯着这块分析,最后会发现在做无用功.

  • 理论上是,当微信收到消息后,经过一系列处理,最后通知微信的首页,刷新这个表格(UITableView),给对应栏目(Cell)上的小红点+1.

  • 至于为什么有那么多UI渲染函数是因为微信收到消息后,如果是一个没有在首页列表的朋友发过来的呢?微信会发出通知声音,然后加入一个新的栏目(Cell)并置顶.
  • 跳出这个UITableView控件的渲染层,转到这个UITableView的父级,也就是首页的控制器NewMainFrameViewController,在前面Reveal分析中已经得到了这个控制器.

分析 NewMainFrameViewController:

66.jpg

  • po [NewMainFrameViewController _shortMethodDescription] 打印输出控制器.

  • 在列举的方法中寻找 Undead ,这个关键字如何来的?在前面UITableView的视图渲染中就有这么个函数[MainFrameitemView updateUnreadCountView],简洁明了一看就知道是修改未读数量.

  • 记录所有和这个关键字有关的方法:

    1. - (void) cleanAllUnreadSession;
    2. -(void)setNewMainFrameTableViewContentOffsetToTheFirstUnreadSessionAndOpen:(BOOL)arg1;
    3. - (unsigned int) getTotalUnreadCount;
    4. - (void) onNextUnreadChat;
    5. - (void) notifyTaskBarOnWillFocusOnFirstUnreadSession;
    6. - (void) updateUnReadCount;
    7. - (void) openMessageContentView:(id)arg1 startSendMessage:(BOOL)arg2 msgWrapToAdd:(id)arg3 animated:(BOOL)arg4 jumpToFirstUnreadNode:(BOOL)arg5 indexPath:(id)arg6 reuse:(BOOL)arg7 extraInfo:(id)arg8;
    8. - (void) openMessageContentView:(id)arg1 startSendMessage:(BOOL)arg2 msgWrapToAdd:(id)arg3 animated:(BOOL)arg4 jumpToFirstUnreadNode:(BOOL)arg5 indexPath:(id)arg6;
  • 从字面意思- (void) cleanAllUnreadSession;方法是取消所有未读会话,貌似是我们要的,实际上这是个坑,执行了这个方法,微信首页所有的消息都没了,包括栏目(Cell),再次打开微信,首页就是个白板.

  • 最后定位到- (void) updateUnReadCount; Symbolic BreakPoint下断
    77.jpg

微信收到消息后断在- (void) updateUnReadCount;,注意:如果这个时候已经在当前会话的聊天房间,并不会触发这个函数.

  • 这个时候出现了一个新的类在堆栈调用过程中 MMNewSessionMgr
  • 当微信收到消息,如果这个消息栏目(Cell)在首页列表中,小红点的数量会递增.
  • 点击某个有小红点的栏目进去后,小红点会消失,说明当前栏目是已读的.
  • 未读消息为0,表示当前栏目已读,小红点消失.
  • 逻辑推测:收到消息,未读数量递增. 进入房间未读数置0,隐藏小红点.说明都会改变消息未读数
  • 查看进入房间的堆栈调用:
    88.jpg

进入单间,表示消息已读,调用了MMNewSessionMgr类的三个函数。分别给三个函数下断,查看参数的值.

  • MMNewSessionMgr类 - 函数:
    99.png
  • $arg3表示第一个参数 $agr4表示第二个  po printObject
    通过三个函数调用,然后调用微信首页控制器的- (void) updateUnReadCount方法,会清除小红点。
  • [MMNewSessionMgr OnUnReadCountChange:]的参数是 一串字符串
  • [MMNewSessionMgr ChangeSessionUnReadCount:to:]的两个参数分别是 上一个函数的参数 和 一个 0|假 .
  • 返回到首页,刚刚进去过的栏目小红点消失,其余的还是存在。
  • 再进入一个别的有未读消息的房间,[MMNewSessionMgr OnUnReadCountChange:]又会不同,说明这个参数很可能是一个ID,代表首页的每一个栏目(Cell).
  • 羊毛出在羊身上,打印一波MMNewSessionMgr类:
    aa.jpg

  • 尝试调用一下那些不需要参数就有返回值的函数:
    bb.png

                    - 至此能拿到的东西已经很多
                    - 整理一下逻辑就能完成一键阅读

Tweak.xm

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

%hook MMServiceCenter
%end

%hook MMNewSessionMgr
%end

%hook MMSessionInfo
%end

%hook NewMainFrameViewController

- (void) viewDIDAppear:(BOOL)arg1{
        %log;
        %orig;
        //微信首页左上角添加一个功能按钮
        UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:@selector(cleanAllUnreadSession)];
        [((UIViewController *)self).navigationItem setLeftBarButtonItem:barBtn];
}

%new
- (void)cleanAllUnreadSession{
        //获取 MMNewSessionMgr 实例
        MMNewSessionMgr *sessionObj = [[%c(MMServiceCenter) defaultCenter] getService:[%c(MMNewSessionMgr) class]];
        //获取所有的 sessionID
        NSArray *SessionListArray = [sessionObj GetUserNamesOnSessionList];
        for (NSString *str in SessionListArray) {
                // 循环修改每个会话 改成已读                
                [sessionObj ChangeSessionUnReadCount:str to:0];           
         }
}
%end

总结

实际上分析过程中会用到 Hopper Disassembler 静态分析.

实际上部分公众号推送的消息还是有价值的.

我没有任何针对微信的意思,如果你一定要问我支持不支持微信,我当然支持,可以很明确的告诉你,我不支持我还天天用微信。🤣




就这个了.gif
最后附上效果图。

免费评分

参与人数 18吾爱币 +19 热心值 +15 收起 理由
nododo1027 + 1 + 1 稳得一批
Cailgun + 1 + 1 我很赞同!
卢达旺旺Kodar + 1 用心讨论,共获提升!
温馨提示 + 1 + 1 用心讨论,共获提升!
gavinkings + 1 + 1 我很赞同!
番茄炒蛋QAQ + 1 + 1 谢谢@Thanks!
山郭 + 1 + 1 我很赞同!
chanchan + 1 + 1 我很赞同!
初晓微凉 + 1 + 1 热心回复!
a2634008 + 1 + 1 热心回复!
鱼儿游 + 1 + 1 我很赞同!
I5U5P + 1 我很赞同!
Zarados + 1 12月枪毙名单,来人,喂公子子弹
yuum + 1 + 1 我很赞同!
Anonymous、 + 2 + 1 我很赞同!
lbwb2 + 1 + 1 谢谢@Thanks!
h080294 + 1 + 1 热心回复!
炫金呀 + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-7 16:22 | 显示全部楼层
平而不凡 发表于 2018-12-6 10:12
难 逻辑上我是调用微信自己已经存在的接口 其次就是整个微信体系庞大,后来者接手前面的代码,一般不会去 ...

这种锅要是接了,肯定雪崩然后引发一系列问题,很可能未来几周甚至几个月都在处理这锅的多米诺效应
话说cleanAllUnreadSession这个方法名坑很大呀,楼主要是没提,我真以为这就是需要的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

 楼主| 发表于 2018-12-6 10:12 | 显示全部楼层
bb7869380 发表于 2018-12-5 21:49
都是砸壳修改,与那种不越狱添加秒抢红包性质一样, 更新估计就会检测到

难 逻辑上我是调用微信自己已经存在的接口 其次就是整个微信体系庞大,后来者接手前面的代码,一般不会去改动之前的 不然怎会有历史遗留问题 这个锅没人想去接

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 18:28 | 显示全部楼层

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 18:30 | 显示全部楼层
膜拜了。。。。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 18:45 | 显示全部楼层
膜拜大牛!~

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 18:59 | 显示全部楼层
好复复杂

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 19:28 | 显示全部楼层
谢谢分享,好细节

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 19:52 | 显示全部楼层
谢谢分享,好细节

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 20:18 | 显示全部楼层
膜拜大牛&#128046;

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 20:27 | 显示全部楼层
好好学习天天上线

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2018-12-5 20:32 | 显示全部楼层
好厉害,mark

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则


免责声明:
吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Service@52PoJie.Cn

快速回复 收藏帖子 返回列表 搜索

RSS订阅|手机版|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2018-12-10 23:32

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表