前言:本文主要讲述使用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];
大功告成,坐等红包雨,打开微信锁上屏幕即可抢红包,岂不是爽歪歪??
项目完整代码,已托管到Github。如果喜欢,欢迎Star
预告
最近几天会出一个钉钉远程打卡助手的文章,支持Wi-Fi和定位两种模式哦,欢迎关注
想提前了解的可以自行参考钉钉打卡Github项目,欢迎Star