// Created by 朱德坤 on 2019/1/22. // Copyright © 2019 DKJone. All rights reserved. // // ██████╗ ██╗ ██╗ ██╗ ██████╗ ███╗ ██╗███████╗ // ██╔══██╗██║ ██╔╝ ██║██╔═══██╗████╗ ██║██╔════╝ // ██║ ██║█████╔╝ ██║██║ ██║██╔██╗ ██║█████╗ // ██║ ██║██╔═██╗ ██ ██║██║ ██║██║╚██╗██║██╔══╝ // ██████╔╝██║ ██╗╚█████╔╝╚██████╔╝██║ ╚████║███████╗ // ╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝ // // 更新微信版本删除dkhelper/info.plist 重新运行版本号就会更新 #import #import "DKHelper.h" #import "DKHelperSettingController.h" %hook MMServiceCenter %new + (id)defaultCenter{ return [[%c(MMContext) currentContext] serviceCenter]; } %end %hook MicroMessengerAppDelegate - (void)applicationDidEnterBackground:(UIApplication *)application{ %orig; [[DKHelperConfig shared] enterBackgroundHandler]; } -(void)applicationDidBecomeActive:(UIApplication *)application{ %orig; [DKHelperConfig.shared.bgTaskTimer invalidate]; } %end %hook NewSettingViewController - (void)reloadTableData{ %orig; WCTableViewManager *tableViewMgr = MSHookIvar(self, "m_tableViewMgr"); MMTableView *tableView = [tableViewMgr getTableView]; WCTableViewNormalCellManager *newCell = [%c(WCTableViewNormalCellManager) normalCellForSel:@selector(setting) target:self title:@"微信小助手"]; [((WCTableViewSectionManager*)tableViewMgr.sections[0]) addCell: newCell]; [tableView reloadData]; } %new - (void)setting { UIViewController *vc = [[DKHelperSettingController alloc] init]; [((UIViewController *)self).navigationController PushViewController:vc animated:true]; } %end %hook CMessageMgr - (void)AddEmoticonMsg:(NSString *)msg MsgWrap:(CMessageWrap *)msgWrap { if (DKHelperConfig.gamePlugEnable) { // 是否开启游戏作弊 if ([msgWrap m_uiMessageType] == 47 && ([msgWrap m_uiGameType] == 2|| [msgWrap m_uiGameType] == 1)) { NSString *title = [msgWrap m_uiGameType] == 1 ? @"请选择石头/剪刀/布" : @"请选择点数"; UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"请选择" message:title preferredStyle:UIAlertControllerStyleActionSheet]; NSArray *arr = @[@"剪刀",@"石头",@"布",@"1",@"2",@"3",@"4",@"5",@"6"]; for (int i = [msgWrap m_uiGameType] == 1 ? 0 : 3; i<([msgWrap m_uiGameType] == 1 ? 3 : 9); i++) { UIAlertAction* action1 = [UIAlertAction actionWithTitle:arr[i] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { [msgWrap setM_nsEmoticonMD5:[objc_getClass("GameController") getMD5ByGameContent:i+1]]; [msgWrap setM_uiGameContent:i+1]; %orig(msg, msgWrap); }]; [alert addAction:action1]; } UIAlertAction* action2 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }]; [alert addAction:action2]; [[[UIApplication sharedApplication] keyWindow].rootViewController presentViewController:alert animated:true completion:nil]; return; } } %orig(msg, msgWrap); } - (void)onNewSyncNotAddDBMessage:(CMessageWrap *)arg1 { NSString *msgContent = arg1.m_nsContent; if (![msgContent hasPrefix:@""]){ %orig;return; } if (DKHelperConfig.preventRevoke) { NSString *(^parseParam)(NSString *, NSString *,NSString *) = ^NSString *(NSString *content, NSString *paramBegin,NSString *paramEnd) { NSUInteger startIndex = [content rangeOfString:paramBegin].location + paramBegin.length; NSUInteger endIndex = [content rangeOfString:paramEnd].location; NSRange range = NSMakeRange(startIndex, endIndex - startIndex); return [content substringWithRange:range]; }; NSString *session = parseParam(msgContent, @"", @""); NSString *newmsgid = parseParam(msgContent, @"", @""); NSString *fromUsrName = parseParam(msgContent, @"" options:NSLiteralSearch]; NSRange range3 = NSMakeRange(range1.location + range1.length, range2.location - range1.location - range1.length); content = [content substringWithRange:range3]; __block BOOL result = false; [[DKHelperConfig.redEnvelopTextFiter componentsSeparatedByString:@","] enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([content containsString:obj]){ result = true; } }]; return result; }; /** 是否自动抢红包 */ BOOL (^shouldReceiveRedEnvelop)() = ^BOOL() { if (!DKHelperConfig.autoRedEnvelop) { return NO; } if (isGroupInBlackList()) { return NO; } if (isContaintKeyWords()) { return NO; } return isGroupReceiver() || (isGroupSender() && isReceiveSelfRedEnvelop()) || (!isGroupReceiver() && DKHelperConfig.personalRedEnvelopEnable); }; NSDictionary *(^parseNativeUrl)(NSString *nativeUrl) = ^(NSString *nativeUrl) { nativeUrl = [nativeUrl substringFromIndex:[@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?" length]]; return [%c(WCBizUtil) dictionaryWithDecodedComponets:nativeUrl separator:@"&"]; }; /** 获取服务端验证参数 */ void (^queryRedEnvelopesReqeust)(NSDictionary *nativeUrlDict) = ^(NSDictionary *nativeUrlDict) { NSMutableDictionary *params = [@{} mutableCopy]; params[@"agreeDuty"] = @"0"; params[@"channelId"] = [nativeUrlDict stringForKey:@"channelid"]; params[@"inWay"] = @"0"; params[@"msgType"] = [nativeUrlDict stringForKey:@"msgtype"]; params[@"nativeUrl"] = [[wrap m_oWCPayInfoItem] m_c2cNativeUrl]; params[@"sendId"] = [nativeUrlDict stringForKey:@"sendid"]; WCRedEnvelopesLogicMgr *logicMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("WCRedEnvelopesLogicMgr") class]]; [logicMgr ReceiverQueryRedEnvelopesRequest:params]; }; /** 储存参数 */ void (^enqueueParam)(NSDictionary *nativeUrlDict) = ^(NSDictionary *nativeUrlDict) { WeChatRedEnvelopParam *mgrParams = [[WeChatRedEnvelopParam alloc] init]; mgrParams.msgType = [nativeUrlDict stringForKey:@"msgtype"]; mgrParams.sendId = [nativeUrlDict stringForKey:@"sendid"]; mgrParams.channelId = [nativeUrlDict stringForKey:@"channelid"]; mgrParams.nickName = [selfContact getContactDisplayName]; mgrParams.headImg = [selfContact m_nsHeadImgUrl]; mgrParams.nativeUrl = [[wrap m_oWCPayInfoItem] m_c2cNativeUrl]; mgrParams.sessionUserName = isGroupSender() ? wrap.m_nsToUsr : wrap.m_nsFromUsr; mgrParams.sign = [nativeUrlDict stringForKey:@"sign"]; mgrParams.isGroupSender = isGroupSender(); [[WBRedEnvelopParamQueue sharedQueue] enqueue:mgrParams]; }; if (shouldReceiveRedEnvelop()) { NSString *nativeUrl = [[wrap m_oWCPayInfoItem] m_c2cNativeUrl]; NSDictionary *nativeUrlDict = parseNativeUrl(nativeUrl); queryRedEnvelopesReqeust(nativeUrlDict); enqueueParam(nativeUrlDict); } } break; } default: break; } } %end %hook WCDeviceStepObject -(NSInteger)m7StepCount { NSInteger stepCount = %orig; NSInteger newStepCount = DKHelperConfig.changedSteps; return DKHelperConfig.changeSteps ? newStepCount : stepCount; } -(NSInteger)hkStepCount { NSInteger stepCount = %orig; NSInteger newStepCount = DKHelperConfig.changedSteps; return DKHelperConfig.changeSteps ? newStepCount : stepCount; } %end %hook UploadDeviceStepReq -(NSInteger)m7StepCount { NSInteger stepCount = %orig; NSInteger newStepCount = DKHelperConfig.changedSteps; return DKHelperConfig.changeSteps ? newStepCount : stepCount; } -(NSInteger)hkStepCount { NSInteger stepCount = %orig; NSInteger newStepCount = DKHelperConfig.changedSteps; return DKHelperConfig.changeSteps ? newStepCount : stepCount; } %end %hook WCRedEnvelopesLogicMgr - (void)OnWCToHongbaoCommonResponse:(HongBaoRes *)arg1 Request:(HongBaoReq *)arg2 { %orig; // 非参数查询请求 if (arg1.cgiCmdid != 3) { return; } NSString *(^parseRequestSign)() = ^NSString *() { NSString *requestString = [[NSString alloc] initWithData:arg2.reqText.buffer encoding:NSUTF8StringEncoding]; NSDictionary *requestDictionary = [%c(WCBizUtil) dictionaryWithDecodedComponets:requestString separator:@"&"]; NSString *nativeUrl = [[requestDictionary stringForKey:@"nativeUrl"] stringByRemovingPercentEncoding]; NSDictionary *nativeUrlDict = [%c(WCBizUtil) dictionaryWithDecodedComponets:nativeUrl separator:@"&"]; return [nativeUrlDict stringForKey:@"sign"]; }; NSDictionary *responseDict = [[[NSString alloc] initWithData:arg1.retText.buffer encoding:NSUTF8StringEncoding] JSONDictionary]; WeChatRedEnvelopParam *mgrParams = [[WBRedEnvelopParamQueue sharedQueue] dequeue]; BOOL (^shouldReceiveRedEnvelop)() = ^BOOL() { // 手动抢红包 if (!mgrParams) { return NO; } // 自己已经抢过 if ([responseDict[@"receiveStatus"] integerValue] == 2) { return NO; } // 红包被抢完 if ([responseDict[@"hbStatus"] integerValue] == 4) { return NO; } // 没有这个字段会被判定为使用外挂 if (!responseDict[@"timingIdentifier"]) { return NO; } if (mgrParams.isGroupSender) { // 自己发红包的时候没有 sign 字段 return DKHelperConfig.autoRedEnvelop; } else { return [parseRequestSign() isEqualToString:mgrParams.sign] && DKHelperConfig.autoRedEnvelop; } }; if (shouldReceiveRedEnvelop()) { mgrParams.timingIdentifier = responseDict[@"timingIdentifier"]; unsigned int delaySeconds = [self calculateDelaySeconds]; WBReceiveRedEnvelopOperation *operation = [[WBReceiveRedEnvelopOperation alloc] initWithRedEnvelopParam:mgrParams delay:delaySeconds]; if (DKHelperConfig.redEnvelopMultipleCatch) { [[WBRedEnvelopTaskManager sharedManager] addSerialTask:operation]; } else { [[WBRedEnvelopTaskManager sharedManager] addNormalTask:operation]; } } } %new - (unsigned int)calculateDelaySeconds { NSInteger configDelaySeconds = DKHelperConfig.redEnvelopDelay ; if (DKHelperConfig.redEnvelopDelay) { unsigned int serialDelaySeconds; if ([WBRedEnvelopTaskManager sharedManager].serialQueueIsEmpty) { serialDelaySeconds = configDelaySeconds; } else { serialDelaySeconds = 15; } return serialDelaySeconds; } else { return (unsigned int)configDelaySeconds; } } %end // Enable CallKit %hook VoipCXMgr + (BOOL)isCallkitAvailable{ return DKHelperConfig.callKitEnable; } + (BOOL)isDeviceCallkitAvailable{ return DKHelperConfig.callKitEnable; } %end %hook UIViewController - (void)viewWillAppear:(BOOL)animated{ %orig; NSLog(@"\n***********************************************\n\t%@ appear\n***********************************************\n",NSStringFromClass([(NSObject*)self class])); } %end %hook MMTipsViewController %new - (NSString *)text{ return [self valueForKeyPath:@"_tipsTextView.text"]; } %end %hook WCTimelineMgr - (void)modifyDataItem:(WCDataItem *)arg1 notify:(BOOL)arg2{ if (!DKHelperConfig.likeCommentEnable){ %orig;return; } if (arg1.likeFlag){ arg1.commentUsers = [DKHelper commentWith:arg1]; arg1.commentCount = (int)arg1.commentUsers.count; arg1.likeUsers = DKHelper.commentUsers; arg1.likeCount = (int)DKHelper.commentUsers.count; } %orig(arg1,arg2); } %end %hook WCOperateFloatView %new -(UIButton *)m_shareBtn{ static char m_shareBtnKey; UIButton * btn = objc_getAssociatedObject(self, &m_shareBtnKey); if (!btn) { btn = [UIButton buttonWithType:UIButtonTypeCustom]; [btn setTitle:@" 转发" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(forwordTimeLine:) forControlEvents:UIControlEventTouchUpInside]; [btn setTitleColor:self.m_likeBtn.currentTitleColor forState:0]; btn.titleLabel.font = self.m_likeBtn.titleLabel.font; [self.m_likeBtn.superview addSubview:btn]; NSString *base64Str = @"iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABf0lEQVQ4T62UvyuFYRTHP9/JJimjMpgYTBIDd5XEIIlB9x+Q5U5+xEIZLDabUoQsNtS9G5MyXImk3EHK/3B09Ly31/X+cG9Onek5z+c5z/l+n0f8c+ivPDMrAAVJG1l7mgWWgc0saCvAKnCWBm0F2A+cpEGbBkqSmfWlQXOBZjbgYgCDwIIDXZQ0aCrQzOaAZWAIuAEugaqk00jlJOgvYChaA6aAFeBY0nuaVRqhP4CxxQ9gVZJ3lhs/oAnt1ySN51JiBWa2FMYzW+/QzNwK3cCkpM+/As1sAjgAZiRVIsWKwHZ4Wo9NwFz5W2Ba0oXvi4Cu4L2kUrBEOzAMjIXsAjw7YrbpBZ6BeUlHURNu0h7gFXC/vQRlveM34AF4AipAG1AOxu4Me0qS9uM3cqB7bRS4A3y4556SvOt6hN8mAnrtoaTdxvE40H+QEcBP2pFUS5phBASu3eiS1pPqIuCWpKssMWLAPUl+k8T4fuiSfFaZEYBFSYtZhbmfQ95Bjetfmweww0YOfToAAAAASUVORK5CYII="; NSData *imageData = [[NSData alloc] initWithBase64EncodedString:base64Str options:NSDataBase64DecodingIgnoreUnknownCharacters]; UIImage *image = [UIImage imageWithData:imageData ]; [btn setImage:image forState:0]; [btn setTintColor:self.m_likeBtn.tintColor]; objc_setAssociatedObject(self, &m_shareBtnKey, btn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return btn; } %new -(UIImageView *)m_lineView2{ static char m_lineView2Key; UIImageView * imageView = objc_getAssociatedObject(self, &m_lineView2Key); if (!imageView) { imageView = [[UIImageView alloc] initWithImage:MSHookIvar(self, "m_lineView").image]; [self.m_likeBtn.superview addSubview: imageView]; objc_setAssociatedObject(self, &m_lineView2Key, imageView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return imageView; } - (void)showWithItemData:(id)arg1 tipPoint:(struct CGPoint)arg2{ %orig(arg1,arg2); if (DKHelperConfig.timeLineForwardEnable){ self.frame = CGRectOffset(CGRectInset(self.frame, self.frame.size.width / -4, 0),self.frame.size.width / -4,0); self.m_shareBtn.frame = CGRectOffset(self.m_likeBtn.frame, self.m_likeBtn.frame.size.width * 2, 0); self.m_lineView2.frame = CGRectOffset(MSHookIvar(self, "m_lineView").frame, [self buttonWidth:self.m_likeBtn], 0); } } %new - (void)forwordTimeLine:(id)arg1{ WCForwardViewController *forwardVC = [[objc_getClass("WCForwardViewController") alloc] initWithDataItem:self.m_item]; [self.navigationController pushViewController:forwardVC animated:true]; } %end @interface BaseMsgContentViewController:UIViewController - (id)getMsgTableView; - (id)getParentTableView; @end %hook BaseMsgContentViewController - (void)viewDidLoad{ %orig; } - (void)viewWillAppear:(BOOL)animated{ %orig; UIView * annimView = [self.view viewWithTag:66666]; if (!DKHelperConfig.dkChatBgEnable){ [annimView removeFromSuperview]; [annimView stopHWDMP4]; return; } if (annimView == nil){ annimView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.width *16/9)]; annimView.tag = 66666; annimView.backgroundColor = UIColor.clearColor; [self.view insertSubview:annimView belowSubview:[self getMsgTableView]]; } annimView.center = self.view.center; NSString *animaName = DKLaunchHelper.animaNames[DKHelperConfig.dkChatBGIndex.intValue][@"name"]; NSString* path = [NSString stringWithFormat:@"%@/%@Vap.mp4",vapPath,animaName]; [annimView playHWDMP4:path repeatCount:-1 delegate:nil]; } %end %hook MicroMessengerAppDelegate %property (nonatomic, retain) UIWindow *launchWindow; %new -(void)showLaunchVideo{ DKLaunchViewController * launchVC = [[DKLaunchViewController alloc] init]; UIWindow *launchWindow = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; launchWindow.windowLevel = UIWindowLevelAlert + 1; self.launchWindow = launchWindow; launchWindow.rootViewController = launchVC; [self.launchWindow makeKeyAndVisible]; [self.launchWindow makeKeyWindow]; } %end %hook MMMainSceneDelegate static bool isShowLaunchVideo = false; - (void)sceneWillEnterForeground:(id)arg1{ if (!DKHelperConfig.dkLaunchEnable || ![DKHelper vapFileExit] || isShowLaunchVideo ){return %orig;} [[%c(MicroMessengerAppDelegate) GlobalInstance] showLaunchVideo]; isShowLaunchVideo = true; %orig; } %end %hook WCPayLogicMgr - (void)insideCallBackGetTransferPrepayResponse:(id)arg1 OnRequest:(id)arg2{ %log; if (!DKHelper.shared.checkFriendsEnd){ DKHelper.shared.currentCheckResult = arg1; dispatch_semaphore_signal(DKHelper.shared.friendCheckSem); } %orig; } %end //TODO: - 加速摇一摇 %hook CMMotionManager - (void)startAccelerometerUpdatesToQueue:(id)queue withHandler:(id)handler{ %log; %orig(queue,[DKHelper startAccelerometerUpdatesToQueue:queue withHandler:handler]); } %end;