前言:本文主要講述使用hook方式實現紅包插件,涉及到tweak相關知識,如果你不想瞭解具體實現細節可直接到我的 "Github" 地址參考安裝(包含越獄和非越獄兩種方法) 轉眼間2017即將過去,又到了領紅包拿到手軟的時候。年會上少不了幾百上千的紅包,真是稍不留神就錯過幾 ...
前言:本文主要講述使用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];
大功告成,坐等紅包雨,打開微信鎖上屏幕即可搶紅包,豈不是爽歪歪