iOS微信自动抢红包插件(支持后台和锁屏下抢红包)
前言:本文主要讲述使用hook方式实现红包插件,涉及到tweak相关知识,如果你不想了解具体实现细节可直接到我的Github地址参考安装(包含越狱和非越狱两种方法)
转眼间2017即将过去,又到了领红包拿到手软的时候。年会上少不了几百上千的红包,真是稍不留神就错过几个亿额... 你是否还是一直死死盯着屏幕,等待着随时来临的红包雨?有没有想过放下手机随便玩耍自动领红包?
本文所讲述的红包插件不同于市面上存在的一些红包助手,原理是检测到红包消息到达后,直接模拟用户点击红包去领取。这种方式相对来说更加安全,更不易被微信系统检测出存在作弊行为。而且支持微信于后台运行以及iPhone锁屏状态下自动抢红包,真正做到无忧无虑领红包。
抢红包效果预览:
功能特性
- 支持微信在后台和锁屏状态下自动抢红包
- 支持自定义延迟抢红包
- 完全模拟用户点击红包,可有效防止微信发现作弊封号
- 兼容最新版本微信,跟随微信更新及时更新迭代
支持修改微信运动步数
实现方式
- hook红包消息,检测有新的红包到达后,用代码模拟用户点击领取红包
- hook红包消息,当有新的红包时,调用微信的红包组件领取红包
本文主要讲述方式1的实现方法,相对方式2稍微复杂一点,但是被微信检测出的风险更小一点。
首先来看看源文件目录
这个Tweak.xm就是我们今天的重头戏啦
项目完整代码,已托管到Github,如果欢迎Star
源码分析
首先要拦截红包消息,红包消息的m_uiMessageType为49,检测到红包消息后先做一个标记
- (void)MainThreadNotifyToExt:(NSDictionary *)ext{ %orig; if([LLRedEnvelopesMgr shared].isOpenRedEnvelopesHelper){ CMessageWrap *msgWrap = ext[@"3"]; if (msgWrap && msgWrap.m_uiMessageType == 49){ //红包消息 [LLRedEnvelopesMgr shared].haveNewRedEnvelopes = YES; } } }
当有消息到达后,微信会自动调用列表页面的reloadSession方法,我们在这个方法里判断是否是红包消息造成的reloadSession调用。如果是,直接回调打开红包的block
%hook NewMainFrameViewController - (void)viewDidLoad{ %orig; [LLRedEnvelopesMgr shared].openRedEnvelopesBlock = ^{ if([LLRedEnvelopesMgr shared].isOpenRedEnvelopesHelper && [LLRedEnvelopesMgr shared].haveNewRedEnvelopes){ [LLRedEnvelopesMgr shared].haveNewRedEnvelopes = NO; [LLRedEnvelopesMgr shared].isHongBaoPush = YES; [[LLRedEnvelopesMgr shared] openRedEnvelopes:self]; } }; } - (void)reloadSessions{ %orig; if([LLRedEnvelopesMgr shared].isOpenRedEnvelopesHelper && [LLRedEnvelopesMgr shared].openRedEnvelopesBlock){ [LLRedEnvelopesMgr shared].openRedEnvelopesBlock(); } } %end
在block内部模拟用户点击到聊天界面,这里先做了一个检测,判断当前导航控制器是否已经push了聊天的控制器,如果有直接拿来用。
- (void)openRedEnvelopes:(NewMainFrameViewController *)mainVC{ NSArray *controllers = mainVC.navigationController.viewControllers; UIViewController *msgContentVC = nil; for (UIViewController *aController in controllers) { if ([aController isMemberOfClass:NSClassFromString(@"BaseMsgContentViewController")]) { msgContentVC = aController; break; } } if (msgContentVC) { [mainVC.navigationController PushViewController:msgContentVC animated:YES]; } else { [mainVC tableView:[mainVC valueForKey:@"m_tableView"] didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]; } }
hook导航控制器的PushViewController方法, 先找到红包Cell上面的WCPayC2CMessageCellView后直接调用tapAppNodeView方法触发红包点击事件(tapAppNodeView方法就是用户点击红包的处理方法)
[baseMsgVC tapAppNodeView:payC2CView];
最后再hook红包WCRedEnvelopesReceiveHomeView(就是用户点击红包弹出的View)的初始化方法,调用OnOpenRedEnvelopes方法领取红包
[view OnOpenRedEnvelopes];
大功告成,坐等红包雨,打开微信锁上屏幕即可抢红包,岂不是爽歪歪