[从基础学逆向] 10. 筛选微信新消息

502 阅读3分钟

背景

我们每个人都会有无数微信用户/微信群,每个群又几百上千个用户,当某些用户/群内消息是我们关注的内容时,手动翻阅查看是不是太慢了,如何快速得到通知?

预期过程

记得某些逆向微信已实现了自动抢红包的功能,那么这个功能也预期能实现。

消息拦截 -> 关键词分析 -> iOS本地推送

LookIn + Class分析

打开一个聊天界面,用LookIn查看界面层级

image.png

自顶向下依次是:

  1. BaseMsgContentViewController (VC)
  2. MMTableView (tabview)
  3. ChatTableViewCell (气泡cell)
  4. TextMessageCellView (文本聊天)

查看TextMessageCellView.h,发现有TextMessageViewModel相关引用,这个应该是数据VM,有这样的继承关系:

TextMessageViewModel -> CommonMessageViewModel -> BaseMessageViewModel

这个类中有个属性CMessageWrap,猜测是数据Model

@property(retain, nonatomic) CMessageWrap *messageWrap; // @synthesize messageWrap=_messageWrap;

验证CMessageWrap

给TextMessageViewModel加hook,然后断点:- (id)initWithMessageWrap:(id)arg1 contact:(id)arg2 chatContact:(id)arg3,收到消息时,打印:

image.png

打印结果messageWrap是类型CMessageWrap,继续打印内容,果然正确,证明了消息展示Model为CMessageWrap。

image.png
hook CMessageMgr

但仅hook viewModel,显然是不可以的,因为它只能监控当前聊天界面,而不是所有聊天。经观察,消息是从[CMessageMgr MainThreadNotifyToExt:]通知出来的,hook这个类。

使用MonkeyDev内置的MDConfig.plist配置hook:

TraceObject配置为2,USER_CLASS_LIST -> CMessageMgr方法 -> TraceFlag配置为2。更多设置参考:https://github.com/omxcodec/OCMethodTrace

image.png

找其它人向你发送一条消息,打印如下:

[MethodTrace] -[<CMessageMgr: 0x11a972590> AsyncOnAddMsg:12345678@chatroom MsgWrap:{m_uiMesLocalID=7, m_ui64MesSvrID=8151075885182429881, m_nsFromUsr=1234567@chatroom, m_nsToUsr=wxi*n22~29, m_uiStatus=3, type=3, createTime=1686274598 msgSource="<msgsource><sequence_id>779717041</sequence_id>
	<bizflag>0</bizflag>
	<sec_msg_node>
		<uuid>6b6272530cb6e2169177032ec08cac98_</uuid>
	</sec_msg_node>
	<imgmsg_pd cdnmidimgurl_size="78770" />
	<silence>1</silence>
	<membercount>283</membercount>
	<NotAutoDownloadRange>20:00-22:00;00:00-01:00</NotAutoDownloadRange>
	<signature>v1_MXdKF2zN</signature>
	<tmp_node>
		<publisher-id>&lt;![CDATA[]]&gt;</publisher-id>
	</tmp_node>
</msgsource>
"}  ]

说明接收消息是-AsyncOnAddMsg:MsgWrap:方法,但打印信息无法直接看到聊天内容,下一步要符号断点查看

image.png

进入断点后,打印两个参数,即:po $x2; po $x3

image.png

打印消息内容:po [$x3 m_nsContent]

image.png

简单弹窗实现

上面已经能分析到消息内容了,现实现以下功能,任意人/群收到消息后,弹一个Alert。

%hook CMessageMgr

- (unsigned int)GetAllMesCount:(id)arg1 {
    %log;
    return %orig(arg1);
}

- (void)AsyncOnAddMsg:(id)arg1 MsgWrap:(id)arg2 { // 主message
    %log;
    BOOL isNew = [arg2 valueForKey:@"m_bNew"];
    int messageType = [[arg2 valueForKey:@"m_uiMessageType"] intValue];
    NSString *content = [arg2 valueForKey:@"m_nsContent"];
    if (isNew && messageType == 1) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:content delegate:self cancelButtonTitle:@"确定" otherButtonTitles: nil];
        [alertView show];
    }
    %orig(arg1, arg2);
}

%end

测试接收消息,其它用户向你发送收到,正确接收到消息内容

image.png

信息筛选功能

通过微信文件助手接收一个txt文档,按行读取关键词后,写到NSUserDefault。然后在CMessageMgr hook方法接收消息后,子线程containsString:过滤关键词即可。

本地推送

参考:blog.csdn.net/weixin_5163…

更多

其实最好还是写一个ViewController,当筛选到信息后,添加到数据源列表,通过tableView展示在ViewController中。当用户点击本地推送弹窗,也跳转到这个页面,cell我甚至想用ChatTableViewCell😂。

点击cell,最好能实现跳转回原聊天的那个cell位置,那就完美了。细节不再展示。

免责声名:仅用于学习交流,如侵犯到您的隐私,请联系我删除