diff --git a/README.md b/README.md index 60586ca..98cf7b4 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ ## 使用: 1.源码学习 - ~下载本项目,修改项目BundleId及签名信息,选择真机设备运行即可~源码整理中尽快提供完整代码 + ~下载本项目,下载砸壳后的微信(7.0以上)[我给你准备了个](https://pan.baidu.com/s/1SHZHfu94Z_jhCkaaFDx8pA),将下载的微信放到'/dkhelper/dkhelper/TargetApp/'目录下该目录下有一个空白文件’put ipa or app here‘,和它放在同一文件夹下即可,修改项目BundleId及签名信息,选择真机设备运行即可~源码整理中尽快提供完整代码 2.开发者: 下载以下ipa后重签名应用:[未签名版](https://pan.baidu.com/s/1-zEUQRGn3H4bZVqHpyffzQ) diff --git a/dkhelper/dkhelper.xcodeproj/project.xcworkspace/xcuserdata/zhudekun.xcuserdatad/UserInterfaceState.xcuserstate b/dkhelper/dkhelper.xcodeproj/project.xcworkspace/xcuserdata/zhudekun.xcuserdatad/UserInterfaceState.xcuserstate index a00ebec..dcffb53 100644 Binary files a/dkhelper/dkhelper.xcodeproj/project.xcworkspace/xcuserdata/zhudekun.xcuserdatad/UserInterfaceState.xcuserstate and b/dkhelper/dkhelper.xcodeproj/project.xcworkspace/xcuserdata/zhudekun.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm b/dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm index 7554ac0..f2a1aec 100644 --- a/dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm +++ b/dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm @@ -25,11 +25,21 @@ #define _LOGOS_RETURN_RETAINED #endif -@class WCTableViewNormalCellManager; @class UIViewController; @class NewSettingViewController; -static void (*_logos_orig$_ungrouped$NewSettingViewController$reloadTableData)(_LOGOS_SELF_TYPE_NORMAL NewSettingViewController* _LOGOS_SELF_CONST, SEL); static void _logos_method$_ungrouped$NewSettingViewController$reloadTableData(_LOGOS_SELF_TYPE_NORMAL NewSettingViewController* _LOGOS_SELF_CONST, SEL); static void _logos_method$_ungrouped$NewSettingViewController$setting(_LOGOS_SELF_TYPE_NORMAL NewSettingViewController* _LOGOS_SELF_CONST, SEL); static void (*_logos_orig$_ungrouped$UIViewController$viewWillAppear$)(_LOGOS_SELF_TYPE_NORMAL UIViewController* _LOGOS_SELF_CONST, SEL, BOOL); static void _logos_method$_ungrouped$UIViewController$viewWillAppear$(_LOGOS_SELF_TYPE_NORMAL UIViewController* _LOGOS_SELF_CONST, SEL, BOOL); -static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$WCTableViewNormalCellManager(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("WCTableViewNormalCellManager"); } return _klass; } +@class MMServiceCenter; @class CContactMgr; @class WCBizUtil; @class UIViewController; @class NewSettingViewController; @class WCRedEnvelopesLogicMgr; @class MMNewSessionMgr; @class CMessageWrap; @class WCDeviceStepObject; @class WCTableViewNormalCellManager; @class CMessageMgr; @class SettingUtil; @class MicroMessengerAppDelegate; +static void (*_logos_orig$_ungrouped$MicroMessengerAppDelegate$applicationDidEnterBackground$)(_LOGOS_SELF_TYPE_NORMAL MicroMessengerAppDelegate* _LOGOS_SELF_CONST, SEL, UIApplication *); static void _logos_method$_ungrouped$MicroMessengerAppDelegate$applicationDidEnterBackground$(_LOGOS_SELF_TYPE_NORMAL MicroMessengerAppDelegate* _LOGOS_SELF_CONST, SEL, UIApplication *); static void (*_logos_orig$_ungrouped$NewSettingViewController$reloadTableData)(_LOGOS_SELF_TYPE_NORMAL NewSettingViewController* _LOGOS_SELF_CONST, SEL); static void _logos_method$_ungrouped$NewSettingViewController$reloadTableData(_LOGOS_SELF_TYPE_NORMAL NewSettingViewController* _LOGOS_SELF_CONST, SEL); static void _logos_method$_ungrouped$NewSettingViewController$setting(_LOGOS_SELF_TYPE_NORMAL NewSettingViewController* _LOGOS_SELF_CONST, SEL); static void (*_logos_orig$_ungrouped$CMessageMgr$AddEmoticonMsg$MsgWrap$)(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST, SEL, NSString *, CMessageWrap *); static void _logos_method$_ungrouped$CMessageMgr$AddEmoticonMsg$MsgWrap$(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST, SEL, NSString *, CMessageWrap *); static void (*_logos_orig$_ungrouped$CMessageMgr$onRevokeMsg$)(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST, SEL, CMessageWrap *); static void _logos_method$_ungrouped$CMessageMgr$onRevokeMsg$(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST, SEL, CMessageWrap *); static void _logos_method$_ungrouped$CMessageMgr$sendMsg$toContactUsrName$(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST, SEL, NSString *, NSString *); static void (*_logos_orig$_ungrouped$CMessageMgr$AsyncOnAddMsg$MsgWrap$)(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST, SEL, NSString *, CMessageWrap *); static void _logos_method$_ungrouped$CMessageMgr$AsyncOnAddMsg$MsgWrap$(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST, SEL, NSString *, CMessageWrap *); static NSInteger (*_logos_orig$_ungrouped$WCDeviceStepObject$m7StepCount)(_LOGOS_SELF_TYPE_NORMAL WCDeviceStepObject* _LOGOS_SELF_CONST, SEL); static NSInteger _logos_method$_ungrouped$WCDeviceStepObject$m7StepCount(_LOGOS_SELF_TYPE_NORMAL WCDeviceStepObject* _LOGOS_SELF_CONST, SEL); static NSInteger (*_logos_orig$_ungrouped$WCDeviceStepObject$hkStepCount)(_LOGOS_SELF_TYPE_NORMAL WCDeviceStepObject* _LOGOS_SELF_CONST, SEL); static NSInteger _logos_method$_ungrouped$WCDeviceStepObject$hkStepCount(_LOGOS_SELF_TYPE_NORMAL WCDeviceStepObject* _LOGOS_SELF_CONST, SEL); static void (*_logos_orig$_ungrouped$WCRedEnvelopesLogicMgr$OnWCToHongbaoCommonResponse$Request$)(_LOGOS_SELF_TYPE_NORMAL WCRedEnvelopesLogicMgr* _LOGOS_SELF_CONST, SEL, HongBaoRes *, HongBaoReq *); static void _logos_method$_ungrouped$WCRedEnvelopesLogicMgr$OnWCToHongbaoCommonResponse$Request$(_LOGOS_SELF_TYPE_NORMAL WCRedEnvelopesLogicMgr* _LOGOS_SELF_CONST, SEL, HongBaoRes *, HongBaoReq *); static unsigned int _logos_method$_ungrouped$WCRedEnvelopesLogicMgr$calculateDelaySeconds(_LOGOS_SELF_TYPE_NORMAL WCRedEnvelopesLogicMgr* _LOGOS_SELF_CONST, SEL); static void (*_logos_orig$_ungrouped$UIViewController$viewWillAppear$)(_LOGOS_SELF_TYPE_NORMAL UIViewController* _LOGOS_SELF_CONST, SEL, BOOL); static void _logos_method$_ungrouped$UIViewController$viewWillAppear$(_LOGOS_SELF_TYPE_NORMAL UIViewController* _LOGOS_SELF_CONST, SEL, BOOL); +static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$CMessageMgr(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("CMessageMgr"); } return _klass; }static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$WCTableViewNormalCellManager(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("WCTableViewNormalCellManager"); } return _klass; }static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$SettingUtil(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("SettingUtil"); } return _klass; }static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$WCBizUtil(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("WCBizUtil"); } return _klass; }static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$MMServiceCenter(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("MMServiceCenter"); } return _klass; }static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$CContactMgr(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("CContactMgr"); } return _klass; }static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$CMessageWrap(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("CMessageWrap"); } return _klass; }static __inline__ __attribute__((always_inline)) __attribute__((unused)) Class _logos_static_class_lookup$MMNewSessionMgr(void) { static Class _klass; if(!_klass) { _klass = objc_getClass("MMNewSessionMgr"); } return _klass; } #line 6 "/mycode/github/DKWechatHelper/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm" + +static void _logos_method$_ungrouped$MicroMessengerAppDelegate$applicationDidEnterBackground$(_LOGOS_SELF_TYPE_NORMAL MicroMessengerAppDelegate* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd, UIApplication * application){ + _logos_orig$_ungrouped$MicroMessengerAppDelegate$applicationDidEnterBackground$(self, _cmd, application); + [[DKHelperConfig shared] enterBackgroundHandler]; +} + + + + + static void _logos_method$_ungrouped$NewSettingViewController$reloadTableData(_LOGOS_SELF_TYPE_NORMAL NewSettingViewController* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd){ _logos_orig$_ungrouped$NewSettingViewController$reloadTableData(self, _cmd); WCTableViewManager *tableViewMgr = MSHookIvar(self, "m_tableViewMgr"); @@ -48,6 +58,315 @@ static void _logos_method$_ungrouped$NewSettingViewController$setting(_LOGOS_SEL +static void _logos_method$_ungrouped$CMessageMgr$AddEmoticonMsg$MsgWrap$(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd, NSString * msg, 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]; + _logos_orig$_ungrouped$CMessageMgr$AddEmoticonMsg$MsgWrap$(self, _cmd, 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; + } + } + + _logos_orig$_ungrouped$CMessageMgr$AddEmoticonMsg$MsgWrap$(self, _cmd, msg, msgWrap); +} + +static void _logos_method$_ungrouped$CMessageMgr$onRevokeMsg$(_LOGOS_SELF_TYPE_NORMAL CMessageMgr* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd, CMessageWrap * arg1) { + + if (DKHelperConfig.preventRevoke) { + NSString *msgContent = arg1.m_nsContent; + + 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()); + }; + + NSDictionary *(^parseNativeUrl)(NSString *nativeUrl) = ^(NSString *nativeUrl) { + nativeUrl = [nativeUrl substringFromIndex:[@"wxpay://c2cbizmessagehandler/hongbao/receivehongbao?" length]]; + return [_logos_static_class_lookup$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; + } + +} + + + + + +static NSInteger _logos_method$_ungrouped$WCDeviceStepObject$m7StepCount(_LOGOS_SELF_TYPE_NORMAL WCDeviceStepObject* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd) { + NSInteger stepCount = _logos_orig$_ungrouped$WCDeviceStepObject$m7StepCount(self, _cmd); + NSInteger newStepCount = DKHelperConfig.changedSteps; + + return DKHelperConfig.changeSteps ? newStepCount : stepCount; +} + +static NSInteger _logos_method$_ungrouped$WCDeviceStepObject$hkStepCount(_LOGOS_SELF_TYPE_NORMAL WCDeviceStepObject* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd) { + NSInteger stepCount = _logos_orig$_ungrouped$WCDeviceStepObject$hkStepCount(self, _cmd); + NSInteger newStepCount = DKHelperConfig.changedSteps; + + return DKHelperConfig.changeSteps ? newStepCount : stepCount; +} + + + + + + +static void _logos_method$_ungrouped$WCRedEnvelopesLogicMgr$OnWCToHongbaoCommonResponse$Request$(_LOGOS_SELF_TYPE_NORMAL WCRedEnvelopesLogicMgr* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd, HongBaoRes * arg1, HongBaoReq * arg2) { + + _logos_orig$_ungrouped$WCRedEnvelopesLogicMgr$OnWCToHongbaoCommonResponse$Request$(self, _cmd, arg1, arg2); + + + if (arg1.cgiCmdid != 3) { return; } + + NSString *(^parseRequestSign)() = ^NSString *() { + NSString *requestString = [[NSString alloc] initWithData:arg2.reqText.buffer encoding:NSUTF8StringEncoding]; + NSDictionary *requestDictionary = [_logos_static_class_lookup$WCBizUtil() dictionaryWithDecodedComponets:requestString separator:@"&"]; + NSString *nativeUrl = [[requestDictionary stringForKey:@"nativeUrl"] stringByRemovingPercentEncoding]; + NSDictionary *nativeUrlDict = [_logos_static_class_lookup$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) { + 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]; + } + } +} + + +static unsigned int _logos_method$_ungrouped$WCRedEnvelopesLogicMgr$calculateDelaySeconds(_LOGOS_SELF_TYPE_NORMAL WCRedEnvelopesLogicMgr* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd) { + 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; + } +} + + + static void _logos_method$_ungrouped$UIViewController$viewWillAppear$(_LOGOS_SELF_TYPE_NORMAL UIViewController* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd, BOOL animated){ _logos_orig$_ungrouped$UIViewController$viewWillAppear$(self, _cmd, animated); @@ -57,5 +376,5 @@ static void _logos_method$_ungrouped$UIViewController$viewWillAppear$(_LOGOS_SEL static __attribute__((constructor)) void _logosLocalInit() { -{Class _logos_class$_ungrouped$NewSettingViewController = objc_getClass("NewSettingViewController"); MSHookMessageEx(_logos_class$_ungrouped$NewSettingViewController, @selector(reloadTableData), (IMP)&_logos_method$_ungrouped$NewSettingViewController$reloadTableData, (IMP*)&_logos_orig$_ungrouped$NewSettingViewController$reloadTableData);{ char _typeEncoding[1024]; unsigned int i = 0; _typeEncoding[i] = 'v'; i += 1; _typeEncoding[i] = '@'; i += 1; _typeEncoding[i] = ':'; i += 1; _typeEncoding[i] = '\0'; class_addMethod(_logos_class$_ungrouped$NewSettingViewController, @selector(setting), (IMP)&_logos_method$_ungrouped$NewSettingViewController$setting, _typeEncoding); }Class _logos_class$_ungrouped$UIViewController = objc_getClass("UIViewController"); MSHookMessageEx(_logos_class$_ungrouped$UIViewController, @selector(viewWillAppear:), (IMP)&_logos_method$_ungrouped$UIViewController$viewWillAppear$, (IMP*)&_logos_orig$_ungrouped$UIViewController$viewWillAppear$);} } -#line 33 "/mycode/github/DKWechatHelper/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm" +{Class _logos_class$_ungrouped$MicroMessengerAppDelegate = objc_getClass("MicroMessengerAppDelegate"); MSHookMessageEx(_logos_class$_ungrouped$MicroMessengerAppDelegate, @selector(applicationDidEnterBackground:), (IMP)&_logos_method$_ungrouped$MicroMessengerAppDelegate$applicationDidEnterBackground$, (IMP*)&_logos_orig$_ungrouped$MicroMessengerAppDelegate$applicationDidEnterBackground$);Class _logos_class$_ungrouped$NewSettingViewController = objc_getClass("NewSettingViewController"); MSHookMessageEx(_logos_class$_ungrouped$NewSettingViewController, @selector(reloadTableData), (IMP)&_logos_method$_ungrouped$NewSettingViewController$reloadTableData, (IMP*)&_logos_orig$_ungrouped$NewSettingViewController$reloadTableData);{ char _typeEncoding[1024]; unsigned int i = 0; _typeEncoding[i] = 'v'; i += 1; _typeEncoding[i] = '@'; i += 1; _typeEncoding[i] = ':'; i += 1; _typeEncoding[i] = '\0'; class_addMethod(_logos_class$_ungrouped$NewSettingViewController, @selector(setting), (IMP)&_logos_method$_ungrouped$NewSettingViewController$setting, _typeEncoding); }Class _logos_class$_ungrouped$CMessageMgr = objc_getClass("CMessageMgr"); MSHookMessageEx(_logos_class$_ungrouped$CMessageMgr, @selector(AddEmoticonMsg:MsgWrap:), (IMP)&_logos_method$_ungrouped$CMessageMgr$AddEmoticonMsg$MsgWrap$, (IMP*)&_logos_orig$_ungrouped$CMessageMgr$AddEmoticonMsg$MsgWrap$);MSHookMessageEx(_logos_class$_ungrouped$CMessageMgr, @selector(onRevokeMsg:), (IMP)&_logos_method$_ungrouped$CMessageMgr$onRevokeMsg$, (IMP*)&_logos_orig$_ungrouped$CMessageMgr$onRevokeMsg$);{ char _typeEncoding[1024]; unsigned int i = 0; _typeEncoding[i] = 'v'; i += 1; _typeEncoding[i] = '@'; i += 1; _typeEncoding[i] = ':'; i += 1; memcpy(_typeEncoding + i, @encode(NSString *), strlen(@encode(NSString *))); i += strlen(@encode(NSString *)); memcpy(_typeEncoding + i, @encode(NSString *), strlen(@encode(NSString *))); i += strlen(@encode(NSString *)); _typeEncoding[i] = '\0'; class_addMethod(_logos_class$_ungrouped$CMessageMgr, @selector(sendMsg:toContactUsrName:), (IMP)&_logos_method$_ungrouped$CMessageMgr$sendMsg$toContactUsrName$, _typeEncoding); }MSHookMessageEx(_logos_class$_ungrouped$CMessageMgr, @selector(AsyncOnAddMsg:MsgWrap:), (IMP)&_logos_method$_ungrouped$CMessageMgr$AsyncOnAddMsg$MsgWrap$, (IMP*)&_logos_orig$_ungrouped$CMessageMgr$AsyncOnAddMsg$MsgWrap$);Class _logos_class$_ungrouped$WCDeviceStepObject = objc_getClass("WCDeviceStepObject"); MSHookMessageEx(_logos_class$_ungrouped$WCDeviceStepObject, @selector(m7StepCount), (IMP)&_logos_method$_ungrouped$WCDeviceStepObject$m7StepCount, (IMP*)&_logos_orig$_ungrouped$WCDeviceStepObject$m7StepCount);MSHookMessageEx(_logos_class$_ungrouped$WCDeviceStepObject, @selector(hkStepCount), (IMP)&_logos_method$_ungrouped$WCDeviceStepObject$hkStepCount, (IMP*)&_logos_orig$_ungrouped$WCDeviceStepObject$hkStepCount);Class _logos_class$_ungrouped$WCRedEnvelopesLogicMgr = objc_getClass("WCRedEnvelopesLogicMgr"); MSHookMessageEx(_logos_class$_ungrouped$WCRedEnvelopesLogicMgr, @selector(OnWCToHongbaoCommonResponse:Request:), (IMP)&_logos_method$_ungrouped$WCRedEnvelopesLogicMgr$OnWCToHongbaoCommonResponse$Request$, (IMP*)&_logos_orig$_ungrouped$WCRedEnvelopesLogicMgr$OnWCToHongbaoCommonResponse$Request$);{ char _typeEncoding[1024]; unsigned int i = 0; _typeEncoding[i] = 'I'; i += 1; _typeEncoding[i] = '@'; i += 1; _typeEncoding[i] = ':'; i += 1; _typeEncoding[i] = '\0'; class_addMethod(_logos_class$_ungrouped$WCRedEnvelopesLogicMgr, @selector(calculateDelaySeconds), (IMP)&_logos_method$_ungrouped$WCRedEnvelopesLogicMgr$calculateDelaySeconds, _typeEncoding); }Class _logos_class$_ungrouped$UIViewController = objc_getClass("UIViewController"); MSHookMessageEx(_logos_class$_ungrouped$UIViewController, @selector(viewWillAppear:), (IMP)&_logos_method$_ungrouped$UIViewController$viewWillAppear$, (IMP*)&_logos_orig$_ungrouped$UIViewController$viewWillAppear$);} } +#line 352 "/mycode/github/DKWechatHelper/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm" diff --git a/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm b/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm index 5f62d85..6659a74 100644 --- a/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm +++ b/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm @@ -3,6 +3,16 @@ #import "DKHelperSettingController.h" +%hook MicroMessengerAppDelegate + +- (void)applicationDidEnterBackground:(UIApplication *)application{ + %orig; + [[DKHelperConfig shared] enterBackgroundHandler]; +} + +%end + + %hook NewSettingViewController - (void)reloadTableData{ %orig; @@ -21,6 +31,315 @@ %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)onRevokeMsg:(CMessageWrap *)arg1 { + + if (DKHelperConfig.preventRevoke) { + NSString *msgContent = arg1.m_nsContent; + + 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()); + }; + + 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 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 %hook UIViewController - (void)viewWillAppear:(BOOL)animated{ diff --git a/dkhelper/dkhelperDylib/MyUtils/DKHelper.m b/dkhelper/dkhelperDylib/MyUtils/DKHelper.m index 1ef3621..2870394 100644 --- a/dkhelper/dkhelperDylib/MyUtils/DKHelper.m +++ b/dkhelper/dkhelperDylib/MyUtils/DKHelper.m @@ -108,3 +108,186 @@ @end + +//MARK: - WeChatRedEnvelop From:https://github.com/buginux/WeChatRedEnvelop + +@implementation WeChatRedEnvelopParam + +- (NSDictionary *)toParams { + return @{ + @"msgType": self.msgType, + @"sendId": self.sendId, + @"channelId": self.channelId, + @"nickName": self.nickName, + @"headImg": self.headImg, + @"nativeUrl": self.nativeUrl, + @"sessionUserName": self.sessionUserName, + @"timingIdentifier": self.timingIdentifier + }; +} +@end + +@interface WBRedEnvelopParamQueue () +@property (strong, nonatomic) NSMutableArray *queue; +@end + +@implementation WBRedEnvelopParamQueue ++ (instancetype)sharedQueue { + static WBRedEnvelopParamQueue *queue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + queue = [[WBRedEnvelopParamQueue alloc] init]; + }); + return queue; +} + +- (instancetype)init { + if (self = [super init]) { + _queue = [[NSMutableArray alloc] init]; + } + return self; +} + +- (void)enqueue:(WeChatRedEnvelopParam *)param { + [self.queue addObject:param]; +} + +- (WeChatRedEnvelopParam *)dequeue { + if (self.queue.count == 0 && !self.queue.firstObject) { + return nil; + } + + WeChatRedEnvelopParam *first = self.queue.firstObject; + + [self.queue removeObjectAtIndex:0]; + + return first; +} + +- (WeChatRedEnvelopParam *)peek { + if (self.queue.count == 0) { + return nil; + } + + return self.queue.firstObject; +} + +- (BOOL)isEmpty { + return self.queue.count == 0; +} + +@end + +@interface WBReceiveRedEnvelopOperation () + +@property (assign, nonatomic, getter=isExecuting) BOOL executing; +@property (assign, nonatomic, getter=isFinished) BOOL finished; + +@property (strong, nonatomic) WeChatRedEnvelopParam *redEnvelopParam; +@property (assign, nonatomic) unsigned int delaySeconds; + +@end + +@implementation WBReceiveRedEnvelopOperation + +@synthesize executing = _executing; +@synthesize finished = _finished; + +- (instancetype)initWithRedEnvelopParam:(WeChatRedEnvelopParam *)param delay:(unsigned int)delaySeconds { + if (self = [super init]) { + _redEnvelopParam = param; + _delaySeconds = delaySeconds; + } + return self; +} + +- (void)start { + if (self.isCancelled) { + self.finished = YES; + self.executing = NO; + return; + } + + [self main]; + + self.executing = YES; + self.finished = NO; +} + +- (void)main { + + [NSThread sleepForTimeInterval:self.delaySeconds/1000.0]; + WCRedEnvelopesLogicMgr *logicMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("WCRedEnvelopesLogicMgr") class]]; + [logicMgr OpenRedEnvelopesRequest:[self.redEnvelopParam toParams]]; + + self.finished = YES; + self.executing = NO; +} + +- (void)cancel { + self.finished = YES; + self.executing = NO; +} + +- (void)setFinished:(BOOL)finished { + [self willChangeValueForKey:@"isFinished"]; + _finished = finished; + [self didChangeValueForKey:@"isFinished"]; +} + +- (void)setExecuting:(BOOL)executing { + [self willChangeValueForKey:@"isExecuting"]; + _executing = executing; + [self didChangeValueForKey:@"isExecuting"]; +} + +- (BOOL)isAsynchronous { + return YES; +} + +@end + + + +@interface WBRedEnvelopTaskManager () + +@property (strong, nonatomic) NSOperationQueue *normalTaskQueue; +@property (strong, nonatomic) NSOperationQueue *serialTaskQueue; + +@end + +@implementation WBRedEnvelopTaskManager + ++ (instancetype)sharedManager { + static WBRedEnvelopTaskManager *taskManager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + taskManager = [WBRedEnvelopTaskManager new]; + }); + return taskManager; +} + +- (instancetype)init { + if (self = [super init]) { + _serialTaskQueue = [[NSOperationQueue alloc] init]; + _serialTaskQueue.maxConcurrentOperationCount = 1; + + _normalTaskQueue = [[NSOperationQueue alloc] init]; + _normalTaskQueue.maxConcurrentOperationCount = 5; + } + return self; +} + +- (void)addNormalTask:(WBReceiveRedEnvelopOperation *)task { + [self.normalTaskQueue addOperation:task]; +} + +- (void)addSerialTask:(WBReceiveRedEnvelopOperation *)task { + [self.serialTaskQueue addOperation:task]; +} + +- (BOOL)serialQueueIsEmpty { + return [self.serialTaskQueue operations].count == 0; +} + +@end