From 30db0bfdf3d0f0dc425000d21ed8432605295060 Mon Sep 17 00:00:00 2001 From: DKJone <1136165636@qq.com> Date: Wed, 23 Jan 2019 13:29:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新部分代码 --- README.md | 1 + dkhelper/dkhelper.xcodeproj/project.pbxproj | 66 +++- .../UserInterfaceState.xcuserstate | Bin 43217 -> 49364 bytes dkhelper/dkhelper/Info.plist | 2 +- .../dkhelperDylib/DKGroupFilterController.h | 28 ++ .../dkhelperDylib/DKGroupFilterController.m | 119 +++++++ .../dkhelperDylib/DKHelperSettingController.h | 16 + .../dkhelperDylib/DKHelperSettingController.m | 262 ++++++++++++++ dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm | 63 +++- dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm | 74 ++-- dkhelper/dkhelperDylib/MyUtils/DKHelper.h | 94 +++++ dkhelper/dkhelperDylib/MyUtils/DKHelper.m | 110 ++++++ .../dkhelperDylib/MyUtils/DKHelperConfig.h | 60 ++++ .../dkhelperDylib/MyUtils/DKHelperConfig.m | 199 +++++++++++ dkhelper/dkhelperDylib/dkhelperDylib.h | 10 - dkhelper/dkhelperDylib/dkhelperDylib.m | 180 ++++++---- .../wechatHeaders/MMUICommonUtil.h | 24 ++ dkhelper/dkhelperDylib/wechatHeaders/UiUtil.h | 60 ++++ .../wechatHeaders/WCUIAlertView.h | 47 +++ .../wechatHeaders/WechatHeaders.h | 324 ++++++++++++++++++ 20 files changed, 1612 insertions(+), 127 deletions(-) create mode 100644 dkhelper/dkhelperDylib/DKGroupFilterController.h create mode 100644 dkhelper/dkhelperDylib/DKGroupFilterController.m create mode 100644 dkhelper/dkhelperDylib/DKHelperSettingController.h create mode 100644 dkhelper/dkhelperDylib/DKHelperSettingController.m create mode 100644 dkhelper/dkhelperDylib/MyUtils/DKHelper.h create mode 100644 dkhelper/dkhelperDylib/MyUtils/DKHelper.m create mode 100644 dkhelper/dkhelperDylib/MyUtils/DKHelperConfig.h create mode 100644 dkhelper/dkhelperDylib/MyUtils/DKHelperConfig.m create mode 100644 dkhelper/dkhelperDylib/wechatHeaders/MMUICommonUtil.h create mode 100644 dkhelper/dkhelperDylib/wechatHeaders/UiUtil.h create mode 100644 dkhelper/dkhelperDylib/wechatHeaders/WCUIAlertView.h create mode 100644 dkhelper/dkhelperDylib/wechatHeaders/WechatHeaders.h diff --git a/README.md b/README.md index b9bcfe6..60586ca 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ 3.微信步数修改 4.小游戏作弊(剪刀石头布和掷骰子) 5.自动抢红包高级配置 +安装后在微信设置中点击“微信小助手” 更多请查看下图: ![IMG_0223](./IMG_0223.jpg) diff --git a/dkhelper/dkhelper.xcodeproj/project.pbxproj b/dkhelper/dkhelper.xcodeproj/project.pbxproj index 623a472..8e0ff56 100644 --- a/dkhelper/dkhelper.xcodeproj/project.pbxproj +++ b/dkhelper/dkhelper.xcodeproj/project.pbxproj @@ -37,6 +37,18 @@ 114CCC7B21F817D500A4646E /* fishhook.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC7A21F817D500A4646E /* fishhook.h */; }; 114CCC7D21F817D500A4646E /* dkhelperDylib.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC7C21F817D500A4646E /* dkhelperDylib.h */; }; 114CCC7F21F817D500A4646E /* dkhelperDylib.m in Sources */ = {isa = PBXBuildFile; fileRef = 114CCC7E21F817D500A4646E /* dkhelperDylib.m */; }; + 114CCC8B21F830C800A4646E /* MMUICommonUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC8A21F830C800A4646E /* MMUICommonUtil.h */; }; + 114CCC8F21F830D200A4646E /* WCUIAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC8C21F830D200A4646E /* WCUIAlertView.h */; }; + 114CCC9021F830D200A4646E /* WechatHeaders.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC8D21F830D200A4646E /* WechatHeaders.h */; }; + 114CCC9121F830D200A4646E /* UiUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC8E21F830D200A4646E /* UiUtil.h */; }; + 114CCC9421F831C200A4646E /* DKHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC9221F831C200A4646E /* DKHelper.h */; }; + 114CCC9521F831C200A4646E /* DKHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 114CCC9321F831C200A4646E /* DKHelper.m */; }; + 114CCC9821F831D400A4646E /* DKHelperConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC9621F831D400A4646E /* DKHelperConfig.h */; }; + 114CCC9921F831D400A4646E /* DKHelperConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 114CCC9721F831D400A4646E /* DKHelperConfig.m */; }; + 114CCC9C21F831EB00A4646E /* DKHelperSettingController.m in Sources */ = {isa = PBXBuildFile; fileRef = 114CCC9A21F831EA00A4646E /* DKHelperSettingController.m */; }; + 114CCC9D21F831EB00A4646E /* DKHelperSettingController.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC9B21F831EA00A4646E /* DKHelperSettingController.h */; }; + 114CCCA021F8323E00A4646E /* DKGroupFilterController.h in Headers */ = {isa = PBXBuildFile; fileRef = 114CCC9E21F8323D00A4646E /* DKGroupFilterController.h */; }; + 114CCCA121F8323E00A4646E /* DKGroupFilterController.m in Sources */ = {isa = PBXBuildFile; fileRef = 114CCC9F21F8323D00A4646E /* DKGroupFilterController.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -73,7 +85,7 @@ 114CCC3D21F817D500A4646E /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 114CCC3F21F817D500A4646E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 114CCC4121F817D500A4646E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 114CCC4521F817D500A4646E /* dkhelperDylib.xm */ = {isa = PBXFileReference; lastKnownFileType = text; name = dkhelperDylib.xm; path = Logos/dkhelperDylib.xm; sourceTree = ""; }; + 114CCC4521F817D500A4646E /* dkhelperDylib.xm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp.preprocessed; name = dkhelperDylib.xm; path = Logos/dkhelperDylib.xm; sourceTree = ""; }; 114CCC4621F817D500A4646E /* dkhelperDylib.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = dkhelperDylib.mm; path = Logos/dkhelperDylib.mm; sourceTree = ""; }; 114CCC4921F817D500A4646E /* MDConfigManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MDConfigManager.h; path = Config/MDConfigManager.h; sourceTree = ""; }; 114CCC4B21F817D500A4646E /* MDConfigManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MDConfigManager.m; path = Config/MDConfigManager.m; sourceTree = ""; }; @@ -101,6 +113,18 @@ 114CCC7A21F817D500A4646E /* fishhook.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fishhook.h; path = fishhook/fishhook.h; sourceTree = ""; }; 114CCC7C21F817D500A4646E /* dkhelperDylib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dkhelperDylib.h; sourceTree = ""; }; 114CCC7E21F817D500A4646E /* dkhelperDylib.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = dkhelperDylib.m; sourceTree = ""; }; + 114CCC8A21F830C800A4646E /* MMUICommonUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMUICommonUtil.h; sourceTree = ""; }; + 114CCC8C21F830D200A4646E /* WCUIAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WCUIAlertView.h; sourceTree = ""; }; + 114CCC8D21F830D200A4646E /* WechatHeaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WechatHeaders.h; sourceTree = ""; }; + 114CCC8E21F830D200A4646E /* UiUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UiUtil.h; sourceTree = ""; }; + 114CCC9221F831C200A4646E /* DKHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DKHelper.h; sourceTree = ""; }; + 114CCC9321F831C200A4646E /* DKHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DKHelper.m; sourceTree = ""; }; + 114CCC9621F831D400A4646E /* DKHelperConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DKHelperConfig.h; sourceTree = ""; }; + 114CCC9721F831D400A4646E /* DKHelperConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DKHelperConfig.m; sourceTree = ""; }; + 114CCC9A21F831EA00A4646E /* DKHelperSettingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DKHelperSettingController.m; sourceTree = ""; }; + 114CCC9B21F831EA00A4646E /* DKHelperSettingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DKHelperSettingController.h; sourceTree = ""; }; + 114CCC9E21F8323D00A4646E /* DKGroupFilterController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DKGroupFilterController.h; sourceTree = ""; }; + 114CCC9F21F8323D00A4646E /* DKGroupFilterController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DKGroupFilterController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -192,8 +216,14 @@ 114CCC4321F817D500A4646E /* dkhelperDylib */ = { isa = PBXGroup; children = ( + 114CCC8921F8307500A4646E /* wechatHeaders */, + 114CCC8821F8306500A4646E /* MyUtils */, 114CCC7C21F817D500A4646E /* dkhelperDylib.h */, 114CCC7E21F817D500A4646E /* dkhelperDylib.m */, + 114CCC9B21F831EA00A4646E /* DKHelperSettingController.h */, + 114CCC9A21F831EA00A4646E /* DKHelperSettingController.m */, + 114CCC9E21F8323D00A4646E /* DKGroupFilterController.h */, + 114CCC9F21F8323D00A4646E /* DKGroupFilterController.m */, 114CCC4421F817D500A4646E /* Logos */, 114CCC4821F817D500A4646E /* Config */, 114CCC5521F817D500A4646E /* Trace */, @@ -280,6 +310,28 @@ name = fishhook; sourceTree = ""; }; + 114CCC8821F8306500A4646E /* MyUtils */ = { + isa = PBXGroup; + children = ( + 114CCC9621F831D400A4646E /* DKHelperConfig.h */, + 114CCC9721F831D400A4646E /* DKHelperConfig.m */, + 114CCC9221F831C200A4646E /* DKHelper.h */, + 114CCC9321F831C200A4646E /* DKHelper.m */, + ); + path = MyUtils; + sourceTree = ""; + }; + 114CCC8921F8307500A4646E /* wechatHeaders */ = { + isa = PBXGroup; + children = ( + 114CCC8E21F830D200A4646E /* UiUtil.h */, + 114CCC8C21F830D200A4646E /* WCUIAlertView.h */, + 114CCC8D21F830D200A4646E /* WechatHeaders.h */, + 114CCC8A21F830C800A4646E /* MMUICommonUtil.h */, + ); + path = wechatHeaders; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -290,10 +342,18 @@ 114CCC7D21F817D500A4646E /* dkhelperDylib.h in Headers */, 114CCC4E21F817D500A4646E /* MDCycriptManager.h in Headers */, 114CCC5221F817D500A4646E /* MDMethodTrace.h in Headers */, + 114CCC9821F831D400A4646E /* DKHelperConfig.h in Headers */, + 114CCC8B21F830C800A4646E /* MMUICommonUtil.h in Headers */, + 114CCCA021F8323E00A4646E /* DKGroupFilterController.h in Headers */, + 114CCC9421F831C200A4646E /* DKHelper.h in Headers */, + 114CCC9021F830D200A4646E /* WechatHeaders.h in Headers */, + 114CCC9D21F831EB00A4646E /* DKHelperSettingController.h in Headers */, + 114CCC8F21F830D200A4646E /* WCUIAlertView.h in Headers */, 114CCC7B21F817D500A4646E /* fishhook.h in Headers */, 114CCC6F21F817D500A4646E /* LLDBTools.h in Headers */, 114CCC4A21F817D500A4646E /* MDConfigManager.h in Headers */, 114CCC6921F817D500A4646E /* OCSelectorTrampolines.h in Headers */, + 114CCC9121F830D200A4646E /* UiUtil.h in Headers */, 114CCC6521F817D500A4646E /* OCMethodTrace.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -457,15 +517,19 @@ 114CCC5721F817D500A4646E /* a1a2-selectortramps-arm.s in Sources */, 114CCC5D21F817D500A4646E /* a1a2-selectortramps-x86_64.s in Sources */, 114CCC6721F817D500A4646E /* OCMethodTrace.m in Sources */, + 114CCC9921F831D400A4646E /* DKHelperConfig.m in Sources */, 114CCC4C21F817D500A4646E /* MDConfigManager.m in Sources */, + 114CCC9C21F831EB00A4646E /* DKHelperSettingController.m in Sources */, 114CCC7921F817D500A4646E /* fishhook.c in Sources */, 114CCC7621F817D500A4646E /* AntiAntiDebug.m in Sources */, 114CCC6B21F817D500A4646E /* OCSelectorTrampolines.mm in Sources */, 114CCC5B21F817D500A4646E /* a1a2-selectortramps-i386.s in Sources */, 114CCC6121F817D500A4646E /* a2a3-selectortramps-i386.s in Sources */, 114CCC5F21F817D500A4646E /* a2a3-selectortramps-arm.s in Sources */, + 114CCCA121F8323E00A4646E /* DKGroupFilterController.m in Sources */, 114CCC7F21F817D500A4646E /* dkhelperDylib.m in Sources */, 114CCC4721F817D500A4646E /* dkhelperDylib.mm in Sources */, + 114CCC9521F831C200A4646E /* DKHelper.m in Sources */, 114CCC7121F817D500A4646E /* LLDBTools.mm in Sources */, 114CCC6321F817D500A4646E /* a2a3-selectortramps-x86_64.s in Sources */, 114CCC5421F817D500A4646E /* MDMethodTrace.m in Sources */, 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 84baae7137bec1e88bf8d6318f81803a9fe06513..a00ebecd383bf7e5d78cb0d65d452cb5854da0fb 100644 GIT binary patch delta 19335 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 delta 15214 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 diff --git a/dkhelper/dkhelper/Info.plist b/dkhelper/dkhelper/Info.plist index e6e5b0b..dbeff3e 100644 --- a/dkhelper/dkhelper/Info.plist +++ b/dkhelper/dkhelper/Info.plist @@ -144,7 +144,7 @@ CFBundleIdentifier - com.sinoroad.dkhelper + com.tencent.xin CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/dkhelper/dkhelperDylib/DKGroupFilterController.h b/dkhelper/dkhelperDylib/DKGroupFilterController.h new file mode 100644 index 0000000..e1c205b --- /dev/null +++ b/dkhelper/dkhelperDylib/DKGroupFilterController.h @@ -0,0 +1,28 @@ +// +// DKGroupFilterController.h +// testHookDylib +// +// Created by 朱德坤 on 2019/1/22. +// Copyright © 2019 DKJone. All rights reserved. +// + +#import +#import "DKHelper.h" + +NS_ASSUME_NONNULL_BEGIN + + +@protocol MultiSelectGroupsViewControllerDelegate +- (void)onMultiSelectGroupReturn:(NSArray *)arg1; + +@optional +- (void)onMultiSelectGroupCancel; +@end + +@interface DKGroupFilterController : UIViewController +- (instancetype)initWithBlackList:(NSArray *)blackList; +@property (nonatomic, assign) id delegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/dkhelper/dkhelperDylib/DKGroupFilterController.m b/dkhelper/dkhelperDylib/DKGroupFilterController.m new file mode 100644 index 0000000..941db40 --- /dev/null +++ b/dkhelper/dkhelperDylib/DKGroupFilterController.m @@ -0,0 +1,119 @@ +// +// DKGroupFilterController.m +// testHookDylib +// +// Created by 朱德坤 on 2019/1/22. +// Copyright © 2019 DKJone. All rights reserved. +// + +#import "DKGroupFilterController.h" +#import +#import "MMUICommonUtil.h" + +@interface DKGroupFilterController (){ + MMUIViewController *helper; +} +@property (strong, nonatomic) ContactSelectView *selectView; +@property (strong, nonatomic) NSArray *blackList; +@end + +@implementation DKGroupFilterController + +- (instancetype)initWithBlackList:(NSArray *)blackList { + if (self = [super initWithNibName:nil bundle:nil]) { + _blackList = blackList; + helper = [[objc_getClass("MMUIViewController") alloc] init]; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [DKHelper backgroundColor]; + [self initTitleArea]; + [self initSelectView]; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + MMServiceCenter *serviceCenter = [objc_getClass("MMServiceCenter") defaultCenter]; + CContactMgr *contactMgr = [serviceCenter getService:objc_getClass("CContactMgr")]; + + for (NSString *contactName in self.blackList) { + CContact *contact = [contactMgr getContactByName:contactName]; + [self.selectView addSelect:contact]; + } +} + +- (void)initTitleArea { + self.navigationItem.leftBarButtonItem = [objc_getClass("MMUICommonUtil") getBarButtonWithTitle:@"取消" target:self action:@selector(onCancel:) style:0]; + + self.navigationItem.rightBarButtonItem = [self rightBarButtonWithSelectCount:self.blackList.count]; + + self.title = @"黑名单"; + + [self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:18.0]}]; +} + +- (UIBarButtonItem *)rightBarButtonWithSelectCount:(unsigned long)selectCount { + + UIBarButtonItem *barButtonItem; + if (selectCount == 0) { + barButtonItem = [objc_getClass("MMUICommonUtil") getBarButtonWithTitle:@"确定" target:self action:@selector(onDone:) style:2]; + } else { + NSString *title = [NSString stringWithFormat:@"确定(%lu)", selectCount]; + barButtonItem = [objc_getClass("MMUICommonUtil") getBarButtonWithTitle:title target:self action:@selector(onDone:) style:4]; + } + return barButtonItem; +} + +- (void)onCancel:(UIBarButtonItem *)item { + if ([self.delegate respondsToSelector:@selector(onMultiSelectGroupCancel)]) { + [self.delegate onMultiSelectGroupCancel]; + } +} + +- (void)onDone:(UIBarButtonItem *)item { + if ([self.delegate respondsToSelector:@selector(onMultiSelectGroupReturn:)]) { + NSArray *blacklist = [[self.selectView.m_dicMultiSelect allKeys] copy]; + [self.delegate onMultiSelectGroupReturn:blacklist]; + } + +} + +- (void)initSelectView { + self.selectView = [[objc_getClass("ContactSelectView") alloc] initWithFrame:[DKHelper viewFrame] delegate:self]; + + self.selectView.m_uiGroupScene = 5; + self.selectView.m_bMultiSelect = YES; + [self.selectView initData:5]; + self.selectView.m_bShowHistoryGroup = false; + self.selectView.m_bShowRadarCreateRoom = false; + + [self.selectView initView]; + + [self.view addSubview:self.selectView]; +} + +#pragma mark - ContactSelectViewDelegate +- (void)onSelectContact:(CContact *)arg1 { + self.navigationItem.rightBarButtonItem = [self rightBarButtonWithSelectCount:[self getTotalSelectCount]]; +} + +- (unsigned long)getTotalSelectCount { + return (unsigned long)[self.selectView.m_dicMultiSelect count]; + +} + +- (UIViewController *)getViewController{ + return self; +} + +// 没法设置父类,设置消息转发已调用相关类方法 +- (MMUIViewController *) forwardingTargetForSelector:(SEL)aSelector { + if ([helper respondsToSelector:aSelector]) { + return helper; + } + return nil; +} +@end diff --git a/dkhelper/dkhelperDylib/DKHelperSettingController.h b/dkhelper/dkhelperDylib/DKHelperSettingController.h new file mode 100644 index 0000000..38d56b0 --- /dev/null +++ b/dkhelper/dkhelperDylib/DKHelperSettingController.h @@ -0,0 +1,16 @@ +// +// DKHelperSettingController.h +// testHookDylib +// +// Created by 朱德坤 on 2019/1/10. +// Copyright © 2019 DKJone. All rights reserved. +// + +#import +NS_ASSUME_NONNULL_BEGIN + +@interface DKHelperSettingController : UIViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/dkhelper/dkhelperDylib/DKHelperSettingController.m b/dkhelper/dkhelperDylib/DKHelperSettingController.m new file mode 100644 index 0000000..ff6dc9f --- /dev/null +++ b/dkhelper/dkhelperDylib/DKHelperSettingController.m @@ -0,0 +1,262 @@ +// +// DKHelperSettingController.m +// testHookDylib +// +// Created by 朱德坤 on 2019/1/10. +// Copyright © 2019 DKJone. All rights reserved. +// + +#import "DKHelperSettingController.h" +#import +#import "DKHelper.h" +#import "DKGroupFilterController.h" +@interface DKHelperSettingController (){ + WCTableViewManager * manager; +} + +@end + +@implementation DKHelperSettingController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = @"小助手设置"; + CGRect tableFrame = [DKHelper viewFrame]; + manager = [DKHelper tableManageWithViewFrame]; + [manager addTableViewToSuperView:self.view]; + manager.tableView.frame = tableFrame; + self.view.backgroundColor = [DKHelper backgroundColor]; + [self reloadTableData]; + self.navigationItem.leftBarButtonItem = [DKHelper leftNavigationItem]; + +} +- (void)viewDidAppear:(BOOL)animated{ + [super viewDidAppear:animated]; + + if(DKHelperConfig.hasShowTips){return;} + [DKHelper showAlertWithTitle:@"重要提示" message:@"本软件完全免费,插件功能仅供学习,由本软件产生的任何利益纠纷须有使用者自行承担。在收到微信团队\"非法客户端提示后\"继续使用可能有封号风险,需使用者自行承担。如遇到提醒,请卸载本软件,更换官方微信客户端" btnTitle:@"我明白了" handler:^(UIButton *sender) { + DKHelperConfig.hasShowTips = true; + } btnTitle:@"有风险我不使用了" handler:^(UIButton *sender) { + exit(0); + }]; + +} + +- (void)reloadTableData{ + [manager clearAllSection]; + + //MARK: 抢红包模块 + WCTableViewSectionManager *redEnvelopSection = [DKHelper sectionManage]; + redEnvelopSection.headerTitle = @"自动抢红包设置"; + [manager addSection:redEnvelopSection]; + + WCTableViewCellManager *autoEnvelopCell = [DKHelper switchCellWithSel:@selector(autoEnvelopSwitchChange:) target:self title:@"自动抢红包" switchOn:[DKHelperConfig autoRedEnvelop]]; + [redEnvelopSection addCell:autoEnvelopCell]; + + + //MARK: 装逼模块 + WCTableViewSectionManager *toBeNO1Section = [DKHelper sectionManage]; + toBeNO1Section.headerTitle = @"装逼必备"; + [manager addSection:toBeNO1Section]; + //消息防撤回 + WCTableViewCellManager *revokeInterceptCell = [DKHelper switchCellWithSel:@selector(revokeIntercept:) target:self title:@"消息防撤回" switchOn:[DKHelperConfig preventRevoke]]; + [toBeNO1Section addCell:revokeInterceptCell]; + //步数修改 + WCTableViewCellManager *changeStepsCell = [DKHelper switchCellWithSel:@selector(changedSteps:) target:self title:@"修改微信步数" switchOn:[DKHelperConfig changeSteps]]; + [toBeNO1Section addCell:changeStepsCell]; + + if ([DKHelperConfig changeSteps]){ + NSString * steps = [NSString stringWithFormat:@"%ld",[DKHelperConfig changedSteps]]; + WCTableViewCellManager *changedStepsCell = [DKHelper cellWithSel:@selector(showChangedStepInput) target:self title:@"\t步数:" rightValue: steps accessoryType:1]; + [toBeNO1Section addCell:changedStepsCell]; + } + + //小游戏作弊 + WCTableViewCellManager *gamePlugCell = [DKHelper switchCellWithSel:@selector(gamePlugEnable:) target:self title:@"小游戏作弊" switchOn:[DKHelperConfig gamePlugEnable]]; + [toBeNO1Section addCell:gamePlugCell]; + + + + //MARK: 支持作者 + WCTableViewSectionManager *supportAuthorSection = [DKHelper sectionManage]; + supportAuthorSection.headerTitle = @"支持作者"; + [manager addSection:supportAuthorSection]; + WCTableViewNormalCellManager * payMeCell = [DKHelper cellWithSel:@selector(payForMe) target:self title:@"请作者喝杯咖啡"]; + [supportAuthorSection addCell:payMeCell]; + + WCTableViewNormalCellManager *myBlogCell = [DKHelper cellWithSel:@selector(openBlog) target:self title:@"我的博客"]; + [supportAuthorSection addCell:myBlogCell]; + + WCTableViewNormalCellManager *myGitHubCell = [DKHelper cellWithSel:@selector(openGitHub) target:self title:@"本项目GitHub" rightValue:@"请给个⭐️" accessoryType:1]; + [supportAuthorSection addCell:myGitHubCell]; + + + + //MARK: 高级功能 + WCTableViewSectionManager *advancedSection = [DKHelper sectionManage]; + advancedSection.headerTitle = @"高级功能"; + [manager addSection:advancedSection]; + //后台抢红包 + WCTableViewCellManager *redEnvelopBackGroundCell = [DKHelper switchCellWithSel:@selector(autoEnveloBackGround:) target:self title:@"锁屏及后台抢红包" switchOn:[DKHelperConfig redEnvelopBackGround]]; + [advancedSection addCell:redEnvelopBackGroundCell]; + //延迟抢红包 + NSString *delay = @"不延迟"; + if ([DKHelperConfig redEnvelopDelay] > 0){ + delay = [NSString stringWithFormat:@"%ld毫秒",[DKHelperConfig redEnvelopDelay]]; + } + WCTableViewCellManager *redEnvelopDelayCell = [DKHelper cellWithSel:@selector(redEnvelopDelay) target:self title:@"延迟抢红包" rightValue:delay accessoryType:1]; + [advancedSection addCell:redEnvelopDelayCell]; + //关键词过滤 + NSString *textFilter = [DKHelperConfig redEnvelopTextFiter].length ? [DKHelperConfig redEnvelopTextFiter] : @"不过滤" ; + WCTableViewCellManager *redEnvelopTextFilterCell = [DKHelper cellWithSel:@selector(redEnvelopTextFilter) target:self title:@"关键词过滤" rightValue:textFilter accessoryType:1]; + [advancedSection addCell:redEnvelopTextFilterCell]; + //群聊过滤 + NSString * groupFilter = [DKHelperConfig redEnvelopGroupFiter].count ? [NSString stringWithFormat:@"已过滤%ld个群",[DKHelperConfig redEnvelopGroupFiter].count] : @"不过滤"; + WCTableViewCellManager *redEnvelopGroupFilterCell = [DKHelper cellWithSel:@selector(redEnvelopGroupFiter) target:self title:@"群聊过滤" rightValue:groupFilter accessoryType:1]; + [advancedSection addCell:redEnvelopGroupFilterCell]; + //抢自己的红包 + WCTableViewCellManager *redEnvelopCatchMeCell = [DKHelper switchCellWithSel:@selector(redEnvelopCatchMe:) target:self title:@"抢自己的红包" switchOn:[DKHelperConfig redEnvelopCatchMe]]; + [advancedSection addCell:redEnvelopCatchMeCell]; + //防止同时抢多个红包 + WCTableViewCellManager *redEnvelopMultipleCatchCell = [DKHelper switchCellWithSel:@selector(redEnvelopMultipleCatch:) target:self title:@"防止同时抢多个红包" switchOn:[DKHelperConfig redEnvelopMultipleCatch]]; + [advancedSection addCell:redEnvelopMultipleCatchCell]; + + [manager.tableView reloadData]; +} + + + +- (void)autoEnvelopSwitchChange:(UISwitch *)sender{ + DKHelperConfig.autoRedEnvelop = sender.isOn; +} + +- (void)revokeIntercept:(UISwitch *)sender{ + DKHelperConfig.preventRevoke = sender.isOn; +} + +- (void)changedSteps:(UISwitch *)sender{ + DKHelperConfig.changeSteps = sender.isOn; + [self reloadTableData]; +} + +- (void)showChangedStepInput{ + NSString * str = [NSString stringWithFormat:@"%ld",DKHelperConfig.changedSteps]; + WCUIAlertView * alert = [[objc_getClass("WCUIAlertView") alloc] initWithTitle:@"输入步数" message:@"最好不要超过60000否则可能被封号"]; + [alert addBtnTitle:@"确定" target:self sel:@selector(changeStepOK:)]; + [alert showTextFieldWithMaxLen:5]; + UITextField * filed = alert.getTextField; + filed.text = str; + [alert show]; +} +-(void)changeStepOK:(MMTextFieldAlertController *)sender{ + NSString * str = sender.getTextField.text; + DKHelperConfig.changedSteps = str.integerValue ; + [self reloadTableData]; +} + +-(void)gamePlugEnable:(UISwitch *)sender{ + DKHelperConfig.gamePlugEnable = sender.isOn; + if (sender.isOn){ + [DKHelper showAlertWithTitle:@"" message:@"小游戏作弊暂只支持掷骰子和剪刀石头布" btnTitle:@"知道了" handler:^(UIButton *sender) { }]; + } +} + +- (void)payForMe{ + ScanQRCodeLogicController *logic = [[objc_getClass("ScanQRCodeLogicController") alloc] initWithViewController:self CodeType:31 needCameraScan:NO]; + NewQRCodeScanner *sc = [[objc_getClass("NewQRCodeScanner") alloc] initWithDelegate:logic CodeType:31]; + [sc notifyResult:@"wxp://f2f1L6sAArNEGn95uW57A7WPP1iO7r2vl2oU" type:@"QR_CODE" version:5 rawData:[@"wxp://f2f1L6sAArNEGn95uW57A7WPP1iO7r2vl2oU" dataUsingEncoding:4]]; +} + +- (void)openBlog{ + NSURL *blogUrl = [NSURL URLWithString:@"https://dkjone.github.io"]; + MMWebViewController *webViewController = [[objc_getClass("MMWebViewController") alloc] initWithURL:blogUrl presentModal:NO extraInfo:nil]; + [self.navigationController PushViewController:webViewController animated:YES]; +} + +- (void)openGitHub{ + NSURL *blogUrl = [NSURL URLWithString:@"https://github.com/DKWechatHelper/DKWechatHelper"]; + MMWebViewController *webViewController = [[objc_getClass("MMWebViewController") alloc] initWithURL:blogUrl presentModal:NO extraInfo:nil]; + [self.navigationController PushViewController:webViewController animated:YES]; + +} + +-(void)autoEnveloBackGround:(UISwitch *)sender{ + if (!sender.isOn){ + DKHelperConfig.redEnvelopBackGround = false; + return; + } + __block UISwitch * s = sender; + [DKHelper showAlertWithTitle:@"重要提示" message:@"开启后台抢红包会使微信一直保持后台运行,消耗电池电量。您是否继续开启?" btnTitle:@"开启" handler:^(UIButton *sender) { + DKHelperConfig.redEnvelopBackGround = true; + } btnTitle:@"取消" handler:^(UIButton *sender) { + s.on = false; + }]; +} + +- (void)redEnvelopDelay{ + NSString * str = [NSString stringWithFormat:@"%ld",DKHelperConfig.redEnvelopDelay]; + WCUIAlertView * alert = [[objc_getClass("WCUIAlertView") alloc] initWithTitle:@"输入延迟时间(1秒=1000毫秒)" message:@""]; + [alert addBtnTitle:@"确定" target:self sel:@selector(changeDelayOK:)]; + [alert showTextFieldWithMaxLen:6]; + UITextField * filed = alert.getTextField; + filed.placeholder = str; + if (DKHelperConfig.redEnvelopDelay) { + filed.text = str; + } + [alert show]; +} +-(void)changeDelayOK:(MMTextFieldAlertController *)sender{ + NSString * str = sender.getTextField.text; + DKHelperConfig.redEnvelopDelay = str.integerValue ; + [self reloadTableData]; +} + +- (void)redEnvelopTextFilter{ + NSString *str = [DKHelperConfig redEnvelopTextFiter].length ? [DKHelperConfig redEnvelopTextFiter] : @"不过滤" ; + WCUIAlertView * alert = [[objc_getClass("WCUIAlertView") alloc] initWithTitle:@"输入关键词以英文逗号分隔(例:抢一罚五,罚款)" message:@""]; + [alert addBtnTitle:@"确定" target:self sel:@selector(changeTextFilterOK:)]; + [alert addBtnTitle:@"取消" target:self sel:nil]; + [alert showTextFieldWithMaxLen:200]; + UITextField * filed = alert.getTextField; + filed.placeholder = str; + if([DKHelperConfig redEnvelopTextFiter].length ){ + filed.text = str; + } + [alert show]; +} +-(void)changeTextFilterOK:(MMTextFieldAlertController *)sender{ + NSString * str = sender.getTextField.text; + DKHelperConfig.redEnvelopTextFiter = str ; + [self reloadTableData]; +} + +-(void)redEnvelopGroupFiter{ + DKGroupFilterController *contactsViewController = [[DKGroupFilterController alloc] initWithBlackList:DKHelperConfig.redEnvelopGroupFiter]; + contactsViewController.delegate = self; + + MMUINavigationController *navigationController = [[objc_getClass("MMUINavigationController") alloc] initWithRootViewController:contactsViewController]; + + [self presentViewController:navigationController animated:YES completion:nil]; +} + +-(void)redEnvelopCatchMe:(UISwitch *)sender{ + DKHelperConfig.redEnvelopCatchMe = sender.isOn; +} + +-(void)redEnvelopMultipleCatch:(UISwitch *)sender{ + DKHelperConfig.redEnvelopMultipleCatch = sender.isOn; +} + + + +#pragma mark - MultiSelectGroupsViewControllerDelegate +- (void)onMultiSelectGroupCancel { + [self dismissViewControllerAnimated:YES completion:nil]; +} +- (void)onMultiSelectGroupReturn:(NSArray *)arg1 { + DKHelperConfig.redEnvelopGroupFiter = arg1; + [self reloadTableData]; + [self dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm b/dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm index 011bb55..7554ac0 100644 --- a/dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm +++ b/dkhelper/dkhelperDylib/Logos/dkhelperDylib.mm @@ -1,6 +1,61 @@ +#line 1 "/mycode/github/DKWechatHelper/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm" +#import +#import "DKHelper.h" +#import "DKHelperSettingController.h" -// *** DO NOT EDIT THIS FILE! *** -// This file is generated by Logos processing using dkhelperDylib.xm during each build. -// Logos by Dustin Howett -// See http://iphonedevwiki.net/index.php/Logos + +#include +#if defined(__clang__) +#if __has_feature(objc_arc) +#define _LOGOS_SELF_TYPE_NORMAL __unsafe_unretained +#define _LOGOS_SELF_TYPE_INIT __attribute__((ns_consumed)) +#define _LOGOS_SELF_CONST const +#define _LOGOS_RETURN_RETAINED __attribute__((ns_returns_retained)) +#else +#define _LOGOS_SELF_TYPE_NORMAL +#define _LOGOS_SELF_TYPE_INIT +#define _LOGOS_SELF_CONST +#define _LOGOS_RETURN_RETAINED +#endif +#else +#define _LOGOS_SELF_TYPE_NORMAL +#define _LOGOS_SELF_TYPE_INIT +#define _LOGOS_SELF_CONST +#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; } +#line 6 "/mycode/github/DKWechatHelper/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm" + +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"); + MMTableView *tableView = [tableViewMgr getTableView]; + WCTableViewNormalCellManager *newCell = [_logos_static_class_lookup$WCTableViewNormalCellManager() normalCellForSel:@selector(setting) target:self title:@"微信小助手"]; + [((WCTableViewSectionManager*)tableViewMgr.sections[0]) addCell: newCell]; + [tableView reloadData]; +} + + +static void _logos_method$_ungrouped$NewSettingViewController$setting(_LOGOS_SELF_TYPE_NORMAL NewSettingViewController* _LOGOS_SELF_CONST __unused self, SEL __unused _cmd) { + UIViewController *vc = [[DKHelperSettingController alloc] init]; + [((UIViewController *)self).navigationController PushViewController:vc animated:true]; +} + + + + + +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); + NSLog(@"\n***********************************************\n\t%@ appear\n***********************************************\n",NSStringFromClass([(NSObject*)self class])); +} + + + +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" diff --git a/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm b/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm index c3a19f2..5f62d85 100644 --- a/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm +++ b/dkhelper/dkhelperDylib/Logos/dkhelperDylib.xm @@ -1,60 +1,32 @@ -// See http://iphonedevwiki.net/index.php/Logos - #import +#import "DKHelper.h" +#import "DKHelperSettingController.h" -@interface CustomViewController -@property (nonatomic, copy) NSString* newProperty; - -+ (void)classMethod; - -- (NSString*)getMyName; - -- (void)newMethod:(NSString*) output; - -@end - -%hook CustomViewController - -+ (void)classMethod -{ - %log; - - %orig; +%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)newMethod:(NSString*) output{ - NSLog(@"This is a new method : %@", output); -} - -%new -- (id)newProperty { - return objc_getAssociatedObject(self, @selector(newProperty)); -} - -%new -- (void)setNewProperty:(id)value { - objc_setAssociatedObject(self, @selector(newProperty), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (NSString*)getMyName -{ - %log; - - NSString* password = MSHookIvar(self,"_password"); - - NSLog(@"password:%@", password); - - [%c(CustomViewController) classMethod]; - - [self newMethod:@"output"]; - - self.newProperty = @"newProperty"; - - NSLog(@"newProperty : %@", self.newProperty); - - return %orig(); +- (void)setting { + UIViewController *vc = [[DKHelperSettingController alloc] init]; + [((UIViewController *)self).navigationController PushViewController:vc animated:true]; } %end + + +%hook UIViewController +- (void)viewWillAppear:(BOOL)animated{ + %orig; + NSLog(@"\n***********************************************\n\t%@ appear\n***********************************************\n",NSStringFromClass([(NSObject*)self class])); +} + +%end + diff --git a/dkhelper/dkhelperDylib/MyUtils/DKHelper.h b/dkhelper/dkhelperDylib/MyUtils/DKHelper.h new file mode 100644 index 0000000..c7c5e8b --- /dev/null +++ b/dkhelper/dkhelperDylib/MyUtils/DKHelper.h @@ -0,0 +1,94 @@ +// +// DKHelper.h +// testHookDylib +// +// Created by 朱德坤 on 2019/1/21. +// Copyright © 2019 DKJone. All rights reserved. +// + +#import + +//MARK: - wechat quick imports +#import "UiUtil.h" +#import "WechatHeaders.h" +#import +#import "WCUIAlertView.h" +#import "DKHelperConfig.h" +#import + +//MARK: - quick objc finds +#define FUiUtil objc_getClass("UiUtil") +#define FMMUICommonUtil objc_getClass("MMUICommonUtil") +#define FWCTableViewCellManager objc_getClass("WCTableViewNormalCellManager") + + +typedef void(^BtnBlock)(UIButton *sender); + +NS_ASSUME_NONNULL_BEGIN + +@interface DKHelper : NSObject + ++ (UIBarButtonItem *)leftNavigationItem; + ++ (UINavigationController *)navigationContrioller; + ++ (UIColor *)backgroundColor; + ++ (CGRect)viewFrame; + ++ (WCTableViewManager *)tableManageWithViewFrame; + ++ (WCTableViewSectionManager *) sectionManage; + ++ (WCTableViewNormalCellManager *)cellWithSel:(SEL)sel target:(id)target title:(NSString *)title; ++ (WCTableViewNormalCellManager *)cellWithSel:(SEL)sel target:(id)target title:(NSString *)title rightValue:(NSString *)rightValue accessoryType:(long long) acctype; ++ (WCTableViewNormalCellManager *)switchCellWithSel:(SEL)sel target:(id)target title:(NSString *)title switchOn:(BOOL)switchOn; ++ (WCUIAlertView *)showAlertWithTitle:(NSString *)title message:(NSString *)msg btnTitle:(NSString *)btnTitle handler:(BtnBlock)handler; ++ (WCUIAlertView *)showAlertWithTitle:(NSString *)title message:(NSString *)msg btnTitle:(NSString *)btn1 handler:(BtnBlock)handler1 btnTitle:(NSString *)btn2 handler:(BtnBlock)handler2; + +@end + +@interface WeChatRedEnvelopParam : NSObject +- (NSDictionary *)toParams; +@property (strong, nonatomic) NSString *msgType; +@property (strong, nonatomic) NSString *sendId; +@property (strong, nonatomic) NSString *channelId; +@property (strong, nonatomic) NSString *nickName; +@property (strong, nonatomic) NSString *headImg; +@property (strong, nonatomic) NSString *nativeUrl; +@property (strong, nonatomic) NSString *sessionUserName; +@property (strong, nonatomic) NSString *sign; +@property (strong, nonatomic) NSString *timingIdentifier; + +@property (assign, nonatomic) BOOL isGroupSender; + +@end + + +@interface WBRedEnvelopParamQueue : NSObject ++ (instancetype)sharedQueue; +- (void)enqueue:(WeChatRedEnvelopParam *)param; +- (WeChatRedEnvelopParam *)dequeue; +- (WeChatRedEnvelopParam *)peek; +- (BOOL)isEmpty; + +@end + +@class WeChatRedEnvelopParam; +@interface WBReceiveRedEnvelopOperation : NSOperation + +- (instancetype)initWithRedEnvelopParam:(WeChatRedEnvelopParam *)param delay:(unsigned int)delaySeconds; + +@end + +@interface WBRedEnvelopTaskManager : NSObject + ++ (instancetype)sharedManager; + +- (void)addNormalTask:(WBReceiveRedEnvelopOperation *)task; +- (void)addSerialTask:(WBReceiveRedEnvelopOperation *)task; + +- (BOOL)serialQueueIsEmpty; + +@end +NS_ASSUME_NONNULL_END diff --git a/dkhelper/dkhelperDylib/MyUtils/DKHelper.m b/dkhelper/dkhelperDylib/MyUtils/DKHelper.m new file mode 100644 index 0000000..1ef3621 --- /dev/null +++ b/dkhelper/dkhelperDylib/MyUtils/DKHelper.m @@ -0,0 +1,110 @@ +// +// DKHelper.m +// testHookDylib +// +// Created by 朱德坤 on 2019/1/21. +// Copyright © 2019 DKJone. All rights reserved. +// + +#import "DKHelper.h" +@interface DKHelper(){ + BtnBlock act1; + BtnBlock act2; +} +@end + +@implementation DKHelper + ++ (instancetype)shared { + static DKHelper *helper = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + helper = [[DKHelper alloc] init]; + }); + return helper; +} + + ++ (UINavigationController *)navigationContrioller{ + + UITabBarController * tabbarVC = (UITabBarController *)UIApplication.sharedApplication.keyWindow.rootViewController; + NSArray *vcs = tabbarVC.childViewControllers; + + return vcs[tabbarVC.selectedIndex]; +} + ++ (UIBarButtonItem *)leftNavigationItem{ + + UINavigationController * navc = [DKHelper navigationContrioller]; + if (navc.viewControllers.count > 1){ + return ((UIViewController *)navc.viewControllers[1]).navigationItem.leftBarButtonItem; + } + return nil; +} + ++ (UIColor *)backgroundColor{ + return [DKHelper tableManageWithViewFrame].tableView.backgroundColor; +} + ++ (CGRect)viewFrame{ + CGFloat width = [FUiUtil screenWidthCurOri]; + CGFloat y = [FUiUtil navigationBarHeightCurOri] + [FUiUtil normalStatusBarHeight]; + CGFloat height = [FUiUtil visibleHeight:[DKHelper navigationContrioller].viewControllers.firstObject] - y; + return CGRectMake(0, y, width, height); + +} + + ++ (WCTableViewManager *)tableManageWithViewFrame{ + CGRect tableFrame = [DKHelper viewFrame]; + WCTableViewManager* manager = [[objc_getClass("WCTableViewManager") alloc] initWithFrame:tableFrame style:1]; + manager.tableView.frame = tableFrame; + return manager; +} + ++ (WCTableViewSectionManager *) sectionManage{ + return [objc_getClass("WCTableViewSectionManager") defaultSection]; +} + ++ (WCTableViewNormalCellManager *)cellWithSel:(SEL)sel target:(id)target title:(NSString *)title{ + return [objc_getClass("WCTableViewNormalCellManager") normalCellForSel:sel target:target title:title]; +} ++ (WCTableViewNormalCellManager *)cellWithSel:(SEL)sel target:(id)target title:(NSString *)title rightValue:(NSString *)rightValue accessoryType:(long long) acctype{ + + return [objc_getClass("WCTableViewNormalCellManager") normalCellForSel:sel target:target title:title rightValue:rightValue accessoryType:acctype]; +} + ++ (WCTableViewNormalCellManager *)switchCellWithSel:(SEL)sel target:(id)target title:(NSString *)title switchOn:(BOOL)switchOn{ + + return [objc_getClass("WCTableViewNormalCellManager") switchCellForSel:sel target:target title:title on:switchOn]; +} + ++ (WCUIAlertView *)showAlertWithTitle:(NSString *)title message:(NSString *)msg btnTitle:(NSString *)btnTitle handler:(BtnBlock)handler{ + WCUIAlertView * alert = [objc_getClass("WCUIAlertView") showAlertWithTitle:title message:msg btnTitle:btnTitle target:DKHelper.shared sel:@selector(action1:)]; + DKHelper.shared->act1 = handler; + return alert; +} + ++ (WCUIAlertView *)showAlertWithTitle:(NSString *)title message:(NSString *)msg btnTitle:(NSString *)btn1 handler:(BtnBlock)handler1 btnTitle:(NSString *)btn2 handler:(BtnBlock)handler2{ + WCUIAlertView * alert = [objc_getClass("WCUIAlertView") showAlertWithTitle:title message:msg btnTitle:btn1 target:DKHelper.shared sel:@selector(action1:) btnTitle:btn2 target:DKHelper.shared sel:@selector(action2:)]; + DKHelper.shared->act1 = handler1; + DKHelper.shared->act2 = handler2; + return alert; + +} + + +- (void)action1:(id)sender{ + NSArray *array = [sender valueForKey:@"btnArray"]; + act1(array[0]); +} + +- (void)action2:(id)sender{ + NSArray *array = [sender valueForKey:@"btnArray"]; + act2(array[1]); + +} + +@end + + diff --git a/dkhelper/dkhelperDylib/MyUtils/DKHelperConfig.h b/dkhelper/dkhelperDylib/MyUtils/DKHelperConfig.h new file mode 100644 index 0000000..084bbc2 --- /dev/null +++ b/dkhelper/dkhelperDylib/MyUtils/DKHelperConfig.h @@ -0,0 +1,60 @@ +// +// DKHelperConfig.h +// testHookDylib +// +// Created by 朱德坤 on 2019/1/22. +// Copyright © 2019 DKJone. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface DKHelperConfig : NSObject + +@property (nonatomic, strong) NSTimer *bgTaskTimer; //后台任务定时器 + ++ (instancetype)shared; + +//程序进入后台处理 +- (void)enterBackgroundHandler; + + ++(BOOL)autoRedEnvelop; ++(void)setAutoRedEnvelop:(BOOL)value; + ++(BOOL)preventRevoke; ++(void)setPreventRevoke:(BOOL)value; + ++(BOOL)changeSteps; ++(void)setChangeSteps:(BOOL)value; ++(NSInteger)changedSteps; ++(void)setChangedSteps:(NSInteger)value; + ++(BOOL)gamePlugEnable; ++(void)setGamePlugEnable:(BOOL)value; + ++(BOOL)redEnvelopBackGround; ++(void)setRedEnvelopBackGround:(BOOL)value; + ++(NSInteger)redEnvelopDelay; ++(void)setRedEnvelopDelay:(NSInteger)value; + ++(NSString *)redEnvelopTextFiter; ++(void)setRedEnvelopTextFiter:(NSString*)value; + ++(NSArray *)redEnvelopGroupFiter; ++(void)setRedEnvelopGroupFiter:(NSArray *)value; + ++(BOOL)redEnvelopCatchMe; ++(void)setRedEnvelopCatchMe:(BOOL)value; + ++(BOOL)redEnvelopMultipleCatch; ++(void)setRedEnvelopMultipleCatch:(BOOL)value; + ++(BOOL)hasShowTips; ++(void)setHasShowTips:(BOOL)value; +@end + +NS_ASSUME_NONNULL_END diff --git a/dkhelper/dkhelperDylib/MyUtils/DKHelperConfig.m b/dkhelper/dkhelperDylib/MyUtils/DKHelperConfig.m new file mode 100644 index 0000000..1cc7acc --- /dev/null +++ b/dkhelper/dkhelperDylib/MyUtils/DKHelperConfig.m @@ -0,0 +1,199 @@ +// +// DKHelperConfig.m +// testHookDylib +// +// Created by 朱德坤 on 2019/1/22. +// Copyright © 2019 DKJone. All rights reserved. +// + +#import "DKHelperConfig.h" +#import + +@interface DKHelperConfig() +@property (nonatomic, strong) AVAudioPlayer *blankPlayer; //无声音频播放器 +@property (nonatomic, assign) UIBackgroundTaskIdentifier bgTaskIdentifier; //后台任务标识符 +@end + +@implementation DKHelperConfig ++ (instancetype)shared { + static DKHelperConfig *config = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + config = [[DKHelperConfig alloc] init]; + }); + return config; +} + +NSString* cmdString(SEL sel){ + NSString * str = NSStringFromSelector(sel); + if ([str hasPrefix:@"set"]){ + NSString *fitstChar = [str substringWithRange:NSMakeRange(3, 1)].lowercaseString; + NSString *subStr = [str substringWithRange:NSMakeRange(4, str.length-5)]; + str = [NSString stringWithFormat:@"%@%@",fitstChar,subStr]; + } + + return str; +} + + ++(BOOL)autoRedEnvelop{ + return [NSUserDefaults.standardUserDefaults boolForKey:cmdString(_cmd)]; +} ++(void)setAutoRedEnvelop:(BOOL)value{ + [NSUserDefaults.standardUserDefaults setBool:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + ++(BOOL)preventRevoke{ + return [NSUserDefaults.standardUserDefaults boolForKey:cmdString(_cmd)]; +} ++(void)setPreventRevoke:(BOOL)value{ + [NSUserDefaults.standardUserDefaults setBool:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + + ++(BOOL)changeSteps{ + return [NSUserDefaults.standardUserDefaults boolForKey:cmdString(_cmd)]; +} ++(void)setChangeSteps:(BOOL)value{ + [NSUserDefaults.standardUserDefaults setBool:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + + ++(NSInteger)changedSteps{ + return [NSUserDefaults.standardUserDefaults integerForKey:cmdString(_cmd)]; +} ++(void)setChangedSteps:(NSInteger)value{ + [NSUserDefaults.standardUserDefaults setInteger:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + ++(BOOL)gamePlugEnable{ + return [NSUserDefaults.standardUserDefaults boolForKey:cmdString(_cmd)]; +} ++(void)setGamePlugEnable:(BOOL)value{ + [NSUserDefaults.standardUserDefaults setBool:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + ++(BOOL)redEnvelopBackGround{ + return [NSUserDefaults.standardUserDefaults boolForKey:cmdString(_cmd)]; +} ++(void)setRedEnvelopBackGround:(BOOL)value{ + [NSUserDefaults.standardUserDefaults setBool:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + ++(NSInteger)redEnvelopDelay{ + return [NSUserDefaults.standardUserDefaults integerForKey:cmdString(_cmd)]; +} ++(void)setRedEnvelopDelay:(NSInteger)value{ + [NSUserDefaults.standardUserDefaults setInteger:value forKey:cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + ++(NSString *)redEnvelopTextFiter{ + return [NSUserDefaults.standardUserDefaults stringForKey:cmdString(_cmd)]; +} ++(void)setRedEnvelopTextFiter:(NSString*)value{ + [NSUserDefaults.standardUserDefaults setObject:value forKey:cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + ++(NSArray *)redEnvelopGroupFiter{ + return [NSUserDefaults.standardUserDefaults arrayForKey:cmdString(_cmd)]; +} ++(void)setRedEnvelopGroupFiter:(NSArray *)value{ + [NSUserDefaults.standardUserDefaults setObject:value forKey:cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + ++(BOOL)redEnvelopCatchMe{ + return [NSUserDefaults.standardUserDefaults boolForKey:cmdString(_cmd)]; +} ++(void)setRedEnvelopCatchMe:(BOOL)value{ + [NSUserDefaults.standardUserDefaults setBool:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; +} + ++(BOOL)redEnvelopMultipleCatch{ + return [NSUserDefaults.standardUserDefaults boolForKey:cmdString(_cmd)]; +} ++(void)setRedEnvelopMultipleCatch:(BOOL)value{ + [NSUserDefaults.standardUserDefaults setBool:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; + cmdString(_cmd); +} + + ++(BOOL)hasShowTips{ + return [NSUserDefaults.standardUserDefaults boolForKey:cmdString(_cmd)]; +} ++(void)setHasShowTips:(BOOL)value{ + [NSUserDefaults.standardUserDefaults setBool:value forKey: cmdString(_cmd)]; + [NSUserDefaults.standardUserDefaults synchronize]; + cmdString(_cmd); +} + +- (void)setBgTaskTimer:(NSTimer *)bgTaskTimer{ + _bgTaskTimer = bgTaskTimer; +} + +//程序进入后台处理 +- (void)enterBackgroundHandler{ + if(!DKHelperConfig.redEnvelopBackGround){ return; } + UIApplication *app = [UIApplication sharedApplication]; + self.bgTaskIdentifier = [app beginBackgroundTaskWithExpirationHandler:^{ + [app endBackgroundTask:self.bgTaskIdentifier]; + self.bgTaskIdentifier = UIBackgroundTaskInvalid; + }]; + self.bgTaskTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(requestMoreTime) userInfo:nil repeats:YES]; + [self.bgTaskTimer fire]; +} + +- (void)requestMoreTime{ + if ([UIApplication sharedApplication].backgroundTimeRemaining < 30) { + [self playBlankAudio]; + [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskIdentifier]; + self.bgTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ + [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskIdentifier]; + self.bgTaskIdentifier = UIBackgroundTaskInvalid; + }]; + } +} + +//播放无声音频 +- (void)playBlankAudio{ + [self playAudioForResource:@"blank" ofType:@"caf"]; +} + +//播放收到红包音频 +- (void)playCashReceivedAudio{ + [self playAudioForResource:@"cash_received" ofType:@"caf"]; +} + +//开始播放音频 +- (void)playAudioForResource:(NSString *)resource ofType:(NSString *)ofType{ + NSError *setCategoryErr = nil; + NSError *activationErr = nil; + [[AVAudioSession sharedInstance] + setCategory: AVAudioSessionCategoryPlayback + withOptions: AVAudioSessionCategoryOptionMixWithOthers + error: &setCategoryErr]; + [[AVAudioSession sharedInstance] + setActive: YES + error: &activationErr]; + NSURL *blankSoundURL = [[NSURL alloc]initWithString:[[NSBundle mainBundle] pathForResource:resource ofType:ofType]]; + if(blankSoundURL){ + self.blankPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:blankSoundURL error:nil]; + [self.blankPlayer play]; + } +} + + + +@end + + diff --git a/dkhelper/dkhelperDylib/dkhelperDylib.h b/dkhelper/dkhelperDylib/dkhelperDylib.h index c205878..bd3c2ae 100644 --- a/dkhelper/dkhelperDylib/dkhelperDylib.h +++ b/dkhelper/dkhelperDylib/dkhelperDylib.h @@ -12,14 +12,4 @@ #define INSERT_SUCCESS_WELCOME " 🎉!!!congratulations!!!🎉\n👍----------------insert dylib success----------------👍\n" -@interface CustomViewController -@property (nonatomic, copy) NSString* newProperty; - -+ (void)classMethod; - -- (NSString*)getMyName; - -- (void)newMethod:(NSString*) output; - -@end diff --git a/dkhelper/dkhelperDylib/dkhelperDylib.m b/dkhelper/dkhelperDylib/dkhelperDylib.m index 038f03f..d94d5d8 100644 --- a/dkhelper/dkhelperDylib/dkhelperDylib.m +++ b/dkhelper/dkhelperDylib/dkhelperDylib.m @@ -1,5 +1,3 @@ -// weibo: http://weibo.com/xiaoqing28 -// blog: http://www.alonemonkey.com // // dkhelperDylib.m // dkhelperDylib @@ -14,78 +12,140 @@ #import #import -CHConstructor{ - printf(INSERT_SUCCESS_WELCOME); - - [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { - -#ifndef __OPTIMIZE__ - CYListenServer(6666); - MDCycriptManager* manager = [MDCycriptManager sharedInstance]; - [manager loadCycript:NO]; +//MARK: - 请求数据伪装 - NSError* error; - NSString* result = [manager evaluateCycript:@"UIApp" error:&error]; - NSLog(@"result: %@", result); - if(error.code != 0){ - NSLog(@"error: %@", error.localizedDescription); - } -#endif - - }]; +CHDeclareClass(ASIdentifierManager) + +//广告标识符伪装 +CHMethod0(NSUUID *, ASIdentifierManager, advertisingIdentifier) +{ + NSUUID *advertisingIdentifier; + NSString *key = @"idfa"; + + NSString *idfa = [[NSUserDefaults standardUserDefaults] stringForKey:key]; + + if (idfa && idfa.length) + { + advertisingIdentifier = [[NSUUID alloc] initWithUUIDString:idfa]; + } + else + { + advertisingIdentifier = [NSUUID UUID]; + + [[NSUserDefaults standardUserDefaults] setObject:advertisingIdentifier.UUIDString forKey:key]; + } + + return advertisingIdentifier; } +@class BaseAuthReqInfo, BaseRequest, ManualAuthAesReqData; -CHDeclareClass(CustomViewController) +CHDeclareClass(ManualAuthAesReqData); -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wstrict-prototypes" -//add new method -CHDeclareMethod1(void, CustomViewController, newMethod, NSString*, output){ - NSLog(@"This is a new method : %@", output); +//bundleId 伪装(待完善) +CHMethod1(void, ManualAuthAesReqData, setBundleId, NSString *, bundleId) +{ + NSLog(@"======-获取请求时验证数据-========"); + if ([bundleId isEqualToString:[NSBundle mainBundle].bundleIdentifier]) + { + bundleId = @"com.tencent.xin"; + } + + CHSuper1(ManualAuthAesReqData, setBundleId, bundleId); } -#pragma clang diagnostic pop +//clientSeqId 伪装 +CHMethod1(void, ManualAuthAesReqData, setClientSeqId, NSString *, clientSeqId) +{ + NSString *key = @"clientSeqId"; + NSString *clientSeqId_fist = [[NSUserDefaults standardUserDefaults] stringForKey:key]; + if (!clientSeqId_fist || clientSeqId_fist.length == 0) + { + clientSeqId_fist = [[NSUUID UUID].UUIDString stringByReplacingOccurrencesOfString:@"-" withString:@""]; + [[NSUserDefaults standardUserDefaults] setObject:clientSeqId_fist forKey:key]; + } -CHOptimizedClassMethod0(self, void, CustomViewController, classMethod){ - NSLog(@"hook class method"); - CHSuper0(CustomViewController, classMethod); + NSString *newClientSeqId; + + if ([clientSeqId containsString:@"-"]) + { + NSRange range = [clientSeqId rangeOfString:@"-"]; + NSString *clientSeqId_last = [clientSeqId substringFromIndex:range.location]; + + newClientSeqId = [NSString stringWithFormat:@"%@%@", clientSeqId_fist, clientSeqId_last]; + } + else + { + newClientSeqId = clientSeqId_fist; + } + + CHSuper1(ManualAuthAesReqData, setClientSeqId, newClientSeqId); } -CHOptimizedMethod0(self, NSString*, CustomViewController, getMyName){ - //get origin value - NSString* originName = CHSuper(0, CustomViewController, getMyName); - - NSLog(@"origin name is:%@",originName); - - //get property - NSString* password = CHIvar(self,_password,__strong NSString*); - - NSLog(@"password is %@",password); - - [self newMethod:@"output"]; - - //set new property - self.newProperty = @"newProperty"; - - NSLog(@"newProperty : %@", self.newProperty); - - //change the value - return @"朱德坤"; - +//deviceName 伪装 +CHMethod1(void, ManualAuthAesReqData, setDeviceName, NSString *, deviceName) +{ + //设置为默认名称 + deviceName = @"iPhone"; + + CHSuper1(ManualAuthAesReqData, setDeviceName, deviceName); } -//add new property -CHPropertyRetainNonatomic(CustomViewController, NSString*, newProperty, setNewProperty); +//过日志记录 +@class MMCrashReportExtLogMgr; -CHConstructor{ - CHLoadLateClass(CustomViewController); - CHClassHook0(CustomViewController, getMyName); - CHClassHook0(CustomViewController, classMethod); - - CHHook0(CustomViewController, newProperty); - CHHook1(CustomViewController, setNewProperty); +CHDeclareClass(MMCrashReportExtLogMgr); + +CHMethod2(void, MMCrashReportExtLogMgr, addLogInfo, int *, arg1, withMessage, const char *, arg2) +{ + return; } +//过越狱检测 +@class JailBreakHelper; + +CHDeclareClass(JailBreakHelper); + +CHMethod0(BOOL, JailBreakHelper, HasInstallJailbreakPluginInvalidIAPPurchase) +{ + return NO; +} + +CHMethod1(BOOL, JailBreakHelper, HasInstallJailbreakPlugin, id, arg1) +{ + return NO; +} + +CHMethod0(BOOL, JailBreakHelper, IsJailBreak) +{ + return NO; +} + +//所有被hook的类和函数放在这里的构造函数中 +CHConstructor +{ + @autoreleasepool + { + CHLoadLateClass(ASIdentifierManager); + CHHook0(ASIdentifierManager, advertisingIdentifier); + + CHLoadLateClass(ManualAuthAesReqData); + CHHook1(ManualAuthAesReqData, setBundleId); + CHHook1(ManualAuthAesReqData, setClientSeqId); + CHHook1(ManualAuthAesReqData, setDeviceName); + + CHLoadLateClass(MMCrashReportExtLogMgr); + CHHook2(MMCrashReportExtLogMgr, addLogInfo, withMessage); + + CHLoadLateClass(JailBreakHelper); + CHHook0(JailBreakHelper, HasInstallJailbreakPluginInvalidIAPPurchase); + CHHook1(JailBreakHelper, HasInstallJailbreakPlugin); + CHHook0(JailBreakHelper, IsJailBreak); + + + + + } +} diff --git a/dkhelper/dkhelperDylib/wechatHeaders/MMUICommonUtil.h b/dkhelper/dkhelperDylib/wechatHeaders/MMUICommonUtil.h new file mode 100644 index 0000000..8cf30df --- /dev/null +++ b/dkhelper/dkhelperDylib/wechatHeaders/MMUICommonUtil.h @@ -0,0 +1,24 @@ +// +// Generated by class-dump 3.5 (64 bit) (Debug version compiled Sep 17 2017 16:24:48). +// +// class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2015 by Steve Nygard. +// + +#import +@interface MMUICommonUtil : NSObject +{ +} + ++ (id)getBottomBarButtonWithTitle:(id)arg1 backgroundImageName:(id)arg2 widthMargin:(double)arg3 target:(id)arg4 action:(SEL)arg5; ++ (id)getBottomBarButtonWithTitle:(id)arg1 target:(id)arg2 action:(SEL)arg3 style:(unsigned long long)arg4; ++ (id)getBarButtonWithImage:(id)arg1 withHighlightedImage:(id)arg2 withDisabledImage:(id)arg3 withBackGroundImage:(id)arg4 withBackGroundImageHL:(id)arg5 withBackGroundImageDisable:(id)arg6 target:(id)arg7 action:(SEL)arg8 style:(unsigned long long)arg9 accessibilityStr:(id)arg10; ++ (id)getBarButtonWithImage:(id)arg1 target:(id)arg2 action:(SEL)arg3 style:(unsigned long long)arg4 accessibility:(id)arg5 color:(id)arg6; ++ (id)getBarButtonWithImageName:(id)arg1 target:(id)arg2 action:(SEL)arg3 style:(unsigned long long)arg4 accessibility:(id)arg5 color:(id)arg6; ++ (id)getBarButtonWithImageName:(id)arg1 target:(id)arg2 action:(SEL)arg3 style:(unsigned long long)arg4 accessibility:(id)arg5; ++ (id)getBarButtonWithTitle:(id)arg1 target:(id)arg2 action:(SEL)arg3 style:(unsigned long long)arg4 maxWidth:(double)arg5 color:(id)arg6; ++ (id)getBarButtonWithTitle:(id)arg1 target:(id)arg2 action:(SEL)arg3 style:(unsigned long long)arg4 color:(id)arg5; ++ (id)getBarButtonWithTitle:(id)arg1 target:(id)arg2 action:(SEL)arg3 style:(unsigned long long)arg4; ++ (void)setBottomBarButtonTitleColor:(id)arg1 withStyle:(unsigned long long)arg2; + +@end + diff --git a/dkhelper/dkhelperDylib/wechatHeaders/UiUtil.h b/dkhelper/dkhelperDylib/wechatHeaders/UiUtil.h new file mode 100644 index 0000000..f8aa7c5 --- /dev/null +++ b/dkhelper/dkhelperDylib/wechatHeaders/UiUtil.h @@ -0,0 +1,60 @@ +// +// Generated by class-dump 3.5 (64 bit) (Debug version compiled Sep 17 2017 16:24:48). +// +// class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2015 by Steve Nygard. +// + +#import + +@interface UiUtil : NSObject +{ +} + ++ (void)showCameraAlertForSplitViewIfNeed:(id)arg1 currentWidth:(double)arg2; ++ (_Bool)isiPadSplitViewModeNow; ++ (_Bool)isiPadSplitViewMinimizeModeNow; ++ (void)setStatusBarStyle:(long long)arg1 viewController:(id)arg2; ++ (void)setStatusBarStyle:(long long)arg1; ++ (void)setStatusBarFontBlack; ++ (void)setStatusBarFontWhite; ++ (_Bool)hasRoundCorner; ++ (double)bottomInset; ++ (double)tabBarContentHeight; ++ (double)tabBarHeight; ++ (double)topBarNormalOffset; ++ (_Bool)isTopBarInNormalState; ++ (double)keyboardHeightByNotification:(id)arg1; ++ (void)setTopBarHidden:(_Bool)arg1 withAnimation:(long long)arg2; ++ (void)setTopBarHidden:(_Bool)arg1; ++ (_Bool)isTopBarHidden; ++ (long long)getRotatedOrientation; ++ (void)setStatusBarHidden:(_Bool)arg1 withAnimation:(long long)arg2; ++ (void)setStatusBarHidden:(_Bool)arg1; ++ (_Bool)isStatusBarLandscape; ++ (_Bool)isStatusBarHidden; ++ (void)OnSystemStatusBarFrameChange; ++ (void)OnSystemStatusBarOrientationChange:(long long)arg1; ++ (id)mainWindow; ++ (double)visibleHeight:(id)arg1; ++ (struct CGRect)windowBoundsOri:(long long)arg1; ++ (struct CGRect)screenBoundsOri:(long long)arg1; ++ (struct CGRect)screenBounds; ++ (struct CGSize)screenSizeOri:(long long)arg1; ++ (struct CGSize)screenSize; ++ (double)mainScreenWidth; ++ (double)deviceScreenWidth:(long long)arg1; ++ (double)screenWidth:(long long)arg1; ++ (double)deviceScreenWidth; ++ (double)windowWidth; ++ (double)screenWidthCurOri; ++ (double)screenHeight:(long long)arg1; ++ (double)screenHeightCurOri; ++ (double)navigationBarHeight:(long long)arg1; ++ (double)navigationBarHeightCurOri; ++ (double)navigationBarHeight; ++ (double)statusBarHeight:(long long)arg1; ++ (double)statusBarHeight; ++ (double)normalStatusBarHeight; + +@end + diff --git a/dkhelper/dkhelperDylib/wechatHeaders/WCUIAlertView.h b/dkhelper/dkhelperDylib/wechatHeaders/WCUIAlertView.h new file mode 100644 index 0000000..977a557 --- /dev/null +++ b/dkhelper/dkhelperDylib/wechatHeaders/WCUIAlertView.h @@ -0,0 +1,47 @@ +// +// Generated by class-dump 3.5 (64 bit) (Debug version compiled Sep 17 2017 16:24:48). +// +// class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2015 by Steve Nygard. +// + +#import + +@interface MMTextFieldAlertController : UIAlertController +- (UITextField *)getTextField; +- (void)setTextFieldWithMaxLen:(unsigned int)arg1; + +@end + +@interface WCUIAlertView : NSObject +{ + MMTextFieldAlertController *_alertController; +} + ++ (id)getTopVc; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 handler:(id)arg4 btnTitle:(id)arg5 handler:(id)arg6; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 handler:(id)arg4; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 btnTitle:(id)arg6 target:(id)arg7 sel:(SEL)arg8 btnTitle:(id)arg9 target:(id)arg10 sel:(SEL)arg11 view:(id)arg12; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 view:(id)arg6; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 cancelBtnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 btnTitle:(id)arg6 target:(id)arg7 sel:(SEL)arg8 view:(id)arg9; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 btnTitle:(id)arg6 target:(id)arg7 sel:(SEL)arg8 view:(id)arg9; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 destructiveBtnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 cancelBtnTitle:(id)arg6 target:(id)arg7 sel:(SEL)arg8 view:(id)arg9; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 btnTitle:(id)arg6 target:(id)arg7 sel:(SEL)arg8 rightBtnStyle:(long long)arg9 view:(id)arg10; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 btnTitle:(id)arg6 target:(id)arg7 sel:(SEL)arg8 btnTitle:(id)arg9 target:(id)arg10 sel:(SEL)arg11; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 btnTitle:(id)arg6 target:(id)arg7 sel:(SEL)arg8; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 btnTitle:(id)arg3; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2; ++ (id)showAlertWithTitle:(id)arg1 message:(id)arg2 cancelBtnTitle:(id)arg3 target:(id)arg4 sel:(SEL)arg5 btnTitle:(id)arg6 target:(id)arg7 sel:(SEL)arg8; +- (_Bool)isVisible; +- (void)dismissAnimated:(_Bool)arg1; +- (void)show; +- (void)addBtnTitle:(id)arg1 target:(id)arg2 sel:(SEL)arg3 btnStyle:(long long)arg4; +- (void)addCancelBtnTitle:(id)arg1 target:(id)arg2 sel:(SEL)arg3; +- (void)addBtnTitle:(id)arg1 target:(id)arg2 sel:(SEL)arg3; +- (id)getTextField; +- (void)showTextFieldWithMaxLen:(unsigned int)arg1; +- (id)initWithTitle:(id)arg1 message:(id)arg2; +- (void)dealloc; + +@end + diff --git a/dkhelper/dkhelperDylib/wechatHeaders/WechatHeaders.h b/dkhelper/dkhelperDylib/wechatHeaders/WechatHeaders.h new file mode 100644 index 0000000..57b85dd --- /dev/null +++ b/dkhelper/dkhelperDylib/wechatHeaders/WechatHeaders.h @@ -0,0 +1,324 @@ +// +// WechatHeaders.h +// testHook +// +// Created by 朱德坤 on 2018/12/29. +// Copyright © 2018 DKJone. All rights reserved. +// + +#ifndef WechatHeaders_h +#define WechatHeaders_h + +#import + +@interface MMUIViewController : UIViewController +- (id)findMainTableView; +@end + + + +@interface MMTabBarBaseViewController : MMUIViewController +@end + +#pragma mark - MMTableView + + + +@interface MMTableViewSectionInfo : NSObject ++ (id)sectionInfoDefaut; ++ (id)sectionInfoHeader:(id)arg1; ++ (id)sectionInfoHeader:(id)arg1 Footer:(id)arg2; +- (void)addCell:(id)arg1; +- (void)removeCellAt:(unsigned long long)arg1; +- (unsigned long long)getCellCount; +@end + +@interface MMTableViewCellInfo ++ (id)normalCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 accessoryType:(long long)arg4; ++ (id)switchCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 on:(BOOL)arg4; ++ (id)normalCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 rightValue:(id)arg4 accessoryType:(long long)arg5; ++ (id)editorCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 margin:(double)arg4 tip:(id)arg5 focus:(_Bool)arg6 text:(id)arg7; ++ (id)normalCellForTitle:(id)arg1 rightValue:(id)arg2; ++ (id)urlCellForTitle:(id)arg1 url:(id)arg2; +@property(nonatomic) long long editStyle; // @synthesize editStyle=_editStyle; +@property(retain, nonatomic) id userInfo; +@end + +@interface MMTableView: UITableView +@end + +//MARK: - WCTableViewNormalCellManager + + +@class UIColor, UITableViewCell, WCTableViewCellBaseConfig; + +@interface WCTableViewCellManager : NSObject ++ (id)normalCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3; ++ (id)loadingCell; ++ (id)ActivityIndicatorCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3; ++ (id)detailDisclosureButtonCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3; ++ (id)switchCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 on:(_Bool)arg4; + +@end + + +@interface WCTableViewNormalCellManager : WCTableViewCellManager ++ (WCTableViewNormalCellManager *)normalCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 accessoryType:(long long)arg4; ++ (WCTableViewNormalCellManager *)normalCellForSel:(SEL)arg1 target:(id)arg2 title:(id)arg3 rightValue:(id)arg4 accessoryType:(long long)arg5; +@end + +@class NSMutableArray, NSString, UITableView, UIView; + +@interface WCTableViewSectionManager : NSObject + +@property(nonatomic) double fTopLineLeftInset; // @synthesize fTopLineLeftInset=_fTopLineLeftInset; +@property(nonatomic) double fFooterHeight; // @synthesize fFooterHeight=_fFooterHeight; +@property(nonatomic) double fHeaderHeight; // @synthesize fHeaderHeight=_fHeaderHeight; +@property(copy, nonatomic) NSString *footerTitle; // @synthesize footerTitle=_footerTitle; +@property(copy, nonatomic) NSString *headerTitle; // @synthesize headerTitle=_headerTitle; + ++ (id)defaultSection; ++ (id)sectionInfoDefaut; +- (void)removeCellAt:(unsigned long long)arg1; +- (id)getCellAt:(unsigned long long)arg1; +- (unsigned long long)getCellCount; +- (void)insertCell:(id)arg1 At:(unsigned int)arg2; +- (void)didBeClickedAt:(id)arg1; +- (void)addCell:(id)arg1; +- (id)getFooterView; +- (id)getHeaderView; + +@end + + +//MARK: - WCTableViewManager +@class MMTableView, NSMutableArray, NSString; +@protocol MMTableViewInfoDelegate; + +@interface WCTableViewManager : NSObject + +@property(retain, nonatomic) NSMutableArray *sections; + +@property(nonatomic) __weak id delegate; +@property(retain, nonatomic) MMTableView *tableView; +- (id)cellInfoAtIndexPath:(id)arg1; +- (void)clearCell:(id)arg1; + +- (void)reloadTableView; +- (void)clearAllSection; +- (void)removeCellAt:(id)arg1; +- (void)removeSectionAt:(unsigned long long)arg1; +- (WCTableViewSectionManager *)getSectionAt:(unsigned long long)arg1; +- (unsigned long long)getSectionCount; +- (void)insertSection:(id)arg1 At:(unsigned int)arg2; +- (void)addSection:(WCTableViewSectionManager *)arg1; + +- (id)getTableView; +- (id)initWithFrame:(struct CGRect)arg1 style:(long long)arg2; +- (void)addTableViewToSuperView:(id)arg1; + +@end + +@interface MMTableViewInfo:WCTableViewManager + +@end + + +@interface NewQRCodeScanner +- (void)notifyDelegate:(id)arg1 type:(id)arg2 version:(int)arg3 rawData:(id)arg4; +- (void)notifyResult:(id)arg1 type:(id)arg2 version:(int)arg3 rawData:(id)arg4; +- (id)initWithDelegate:(id)arg1 CodeType:(int)arg2; +@end + +@interface ScanQRCodeLogicController +- (id)initWithViewController:(id)arg1 CodeType:(int)arg2 needCameraScan:(_Bool)arg3; +@end + + +@interface MMWebViewController: NSObject +- (id)initWithURL:(id)arg1 presentModal:(_Bool)arg2 extraInfo:(id)arg3; +@end + +@interface UINavigationController (LogicController) +- (void)PushViewController:(id)arg1 animated:(_Bool)arg2; +@end + + +@interface ContactSelectView : UIView + +@property(nonatomic) unsigned int m_uiGroupScene; // @synthesize m_uiGroupScene; +@property(nonatomic) _Bool m_bMultiSelect; // @synthesize m_bMultiSelect; +@property(nonatomic) _Bool m_bShowHistoryGroup; +@property(nonatomic) _Bool m_bShowRadarCreateRoom; +@property(retain, nonatomic) NSMutableDictionary *m_dicMultiSelect; // @synthesize m_dicMultiSelect; + +- (id)initWithFrame:(struct CGRect)arg1 delegate:(id)arg2; +- (void)initData:(unsigned int)arg1; +- (void)initView; +- (void)addSelect:(id)arg1; +@end + +@interface MMUINavigationController : UINavigationController +@end + + +@interface WCPayInfoItem: NSObject + +@property(retain, nonatomic) NSString *m_c2cNativeUrl; + +@end + + + + +@interface CContact: NSObject +@property (nonatomic, copy) NSString *m_nsOwner; // 拥有者 +@property (nonatomic, copy) NSString *m_nsNickName; // 用户昵称 +@property (nonatomic, copy) NSString *m_nsUsrName; // 微信id +@property (nonatomic, copy) NSString *m_nsMemberName; +@property(retain, nonatomic) NSString *m_nsHeadImgUrl; + +- (id)getContactDisplayName; + +@end + +@interface CContactMgr : NSObject + +- (id)getSelfContact; +- (id)getContactByName:(id)arg1; +- (id)getContactForSearchByName:(id)arg1; +- (_Bool)getContactsFromServer:(id)arg1; +- (_Bool)isInContactList:(id)arg1; +- (_Bool)addLocalContact:(id)arg1 listType:(unsigned int)arg2; + +@end + +@protocol ContactSelectViewDelegate + +- (void)onSelectContact:(CContact *)arg1; + +@end + +@interface MMServiceCenter : NSObject + ++ (instancetype)defaultCenter; +- (id)getService:(Class)service; + +@end + +@interface CMessageWrap : NSObject +@property (retain, nonatomic) WCPayInfoItem *m_oWCPayInfoItem; +@property(nonatomic, assign) NSInteger m_uiGameType; // 1、猜拳; 2、骰子; 0、自定义表情 +@property(nonatomic, assign) unsigned long m_uiGameContent; +@property(nonatomic, strong) NSString *m_nsEmoticonMD5; +@property(nonatomic) long long m_n64MesSvrID; +@property (nonatomic, copy) NSString *m_nsContent; // 内容 +@property (nonatomic, copy) NSString *m_nsToUsr; // 接收的用户(微信id) +@property (nonatomic, copy) NSString *m_nsFromUsr; // 发送的用户(微信id) +@property (nonatomic, copy) NSString *m_nsLastDisplayContent; +@property (nonatomic, assign) unsigned int m_uiCreateTime; // 消息生成时间 +@property (nonatomic, assign) unsigned int m_uiStatus; // 消息状态 +@property (nonatomic, assign) int m_uiMessageType; // 消息类型 +@property (nonatomic, copy) NSString *m_nsRealChatUsr; +@property (nonatomic, copy) NSString *m_nsPushContent; +- (id)initWithMsgType:(long long)arg1; +@end + +@interface CBaseContact : NSObject +@property (nonatomic, copy) NSString *m_nsEncodeUserName; // 微信用户名转码 +@property (nonatomic, assign) int m_uiFriendScene; // 是否是自己的好友(非订阅号、自己) +@property (nonatomic,assign) BOOL m_isPlugin; // 是否为微信插件 +- (BOOL)isChatroom; +@end + +@interface GameController : NSObject ++ (NSString*)getMD5ByGameContent:(NSInteger) content; +@end + +@interface CMessageMgr : NSObject +- (id)GetMsg:(id)arg1 n64SvrID:(long long)arg2; +- (void)onRevokeMsg:(id)msg; +- (void)AddMsg:(id)arg1 MsgWrap:(id)arg2; +- (void)AddLocalMsg:(id)arg1 MsgWrap:(id)arg2 fixTime:(_Bool)arg3 NewMsgArriveNotify:(_Bool)arg4; +- (void)AsyncOnSpecialSession:(id)arg1 MsgList:(id)arg2; +- (id)GetHelloUsers:(id)arg1 Limit:(unsigned int)arg2 OnlyUnread:(BOOL)arg3; +- (void)AddEmoticonMsg:(NSString *)msg MsgWrap:(CMessageWrap *)msgWrap; +- (void)DelMsg:(id)arg1 MsgWrap:(id)arg2; + + +@end + +@interface SettingUtil : NSObject ++ (id)getLocalUsrName:(unsigned int)arg1; +@end + +@interface MMNewSessionMgr : NSObject +- (unsigned int)GenSendMsgTime; +@end + +@interface WCBizUtil : NSObject + ++ (id)dictionaryWithDecodedComponets:(id)arg1 separator:(id)arg2; + +@end + +@interface NSMutableDictionary (SafeInsert) + +- (void)safeSetObject:(id)arg1 forKey:(id)arg2; + +@end + +@interface NSDictionary (NSDictionary_SafeJSON) + +- (id)arrayForKey:(id)arg1; +- (id)dictionaryForKey:(id)arg1; +- (double)doubleForKey:(id)arg1; +- (float)floatForKey:(id)arg1; +- (long long)int64ForKey:(id)arg1; +- (long long)integerForKey:(id)arg1; +- (id)stringForKey:(id)arg1; + +@end + +@interface NSString (NSString_SBJSON) + +- (id)JSONArray; +- (id)JSONDictionary; +- (id)JSONValue; + +@end + +@interface WCRedEnvelopesLogicMgr: NSObject + +- (void)OpenRedEnvelopesRequest:(id)params; +- (void)ReceiverQueryRedEnvelopesRequest:(id)arg1; +- (void)GetHongbaoBusinessRequest:(id)arg1 CMDID:(unsigned int)arg2 OutputType:(unsigned int)arg3; + +/** Added Methods */ +- (unsigned int)calculateDelaySeconds; + +@end + + +@interface SKBuiltinBuffer_t : NSObject + +@property(retain, nonatomic) NSData *buffer; // @dynamic buffer; + +@end + +@interface HongBaoRes : NSObject + +@property(retain, nonatomic) SKBuiltinBuffer_t *retText; // @dynamic retText; +@property(nonatomic) int cgiCmdid; // @dynamic cgiCmdid; + +@end + +@interface HongBaoReq : NSObject + +@property(retain, nonatomic) SKBuiltinBuffer_t *reqText; // @dynamic reqText; + +@end + +#endif /* WechatHeaders_h */ + +