背景
我们每个人都会有无数微信用户/微信群,每个群又几百上千个用户,当某些用户/群内消息是我们关注的内容时,手动翻阅查看是不是太慢了,如何快速得到通知?
预期过程
记得某些逆向微信已实现了自动抢红包的功能,那么这个功能也预期能实现。
消息拦截 -> 关键词分析 -> iOS本地推送
LookIn + Class分析
打开一个聊天界面,用LookIn查看界面层级
自顶向下依次是:
- BaseMsgContentViewController (VC)
- MMTableView (tabview)
- ChatTableViewCell (气泡cell)
- 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
,收到消息时,打印:
打印结果messageWrap是类型CMessageWrap,继续打印内容,果然正确,证明了消息展示Model为CMessageWrap。
hook CMessageMgr
但仅hook viewModel,显然是不可以的,因为它只能监控当前聊天界面,而不是所有聊天。经观察,消息是从[CMessageMgr MainThreadNotifyToExt:]通知出来的,hook这个类。
使用MonkeyDev内置的MDConfig.plist配置hook:
TraceObject配置为2,USER_CLASS_LIST -> CMessageMgr方法 -> TraceFlag配置为2。更多设置参考:https://github.com/omxcodec/OCMethodTrace
找其它人向你发送一条消息,打印如下:
[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><![CDATA[]]></publisher-id>
</tmp_node>
</msgsource>
"} ]
说明接收消息是-AsyncOnAddMsg:MsgWrap:
方法,但打印信息无法直接看到聊天内容,下一步要符号断点查看
进入断点后,打印两个参数,即:po $x2; po $x3
打印消息内容:po [$x3 m_nsContent]
简单弹窗实现
上面已经能分析到消息内容了,现实现以下功能,任意人/群收到消息后,弹一个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
测试接收消息,其它用户向你发送收到
,正确接收到消息内容
信息筛选功能
通过微信文件助手接收一个txt文档,按行读取关键词后,写到NSUserDefault。然后在CMessageMgr hook方法接收消息后,子线程containsString:过滤关键词即可。
本地推送
更多
其实最好还是写一个ViewController,当筛选到信息后,添加到数据源列表,通过tableView展示在ViewController中。当用户点击本地推送弹窗,也跳转到这个页面,cell我甚至想用ChatTableViewCell😂。
点击cell,最好能实现跳转回原聊天的那个cell位置,那就完美了。细节不再展示。
免责声名:仅用于学习交流,如侵犯到您的隐私,请联系我删除