本帖最后由 清新 于 2018-10-12 17:24 编辑
一共五篇文章讲解:
一:非越狱开发工具安装
二: WeChat登录页面,第三方框架使用以及CocoaPod安装
三:非越狱应用网络传输,应用结构分析,如何快速找到方法和类以及如何使用框架
四:WeChat消息获取,抢红包以及一些常用的功能增加以及修改
五:WeChat 62数据登录实现,获取接口数据,获取接口参数,接口调用,并且传到服务器
如果喜欢看的人多就再发一篇游戏数据破解以及游戏内置辅助如何实现以及原理附带demo打开上一篇的重构项目,我们先新建一个插件的目录,运行手机点击发现,利用xcode查看这个页面是什么(图片),图片
上面为FindFriendEntryViewController控制器,现在我们对它进行页面上面添加一个
按钮,打开logos文件夹,点击WeChatDylib.xm移除所有代码,在logos文件夹下面新建header文件
header文件中用来写添加代码的东西,不添加的话在xm里面是会报错的,引入XUI,添加如下代码,如果要写规范一些你可以申明- (void)viewDidLoad- (void)tweakItemTapped:(id)sender
这里做完了,然后我们编写一下XUI的代码,新建一个setting bundle
在setting bundle里面添加一个文件,把文件改为interface.json
接下来就是在interface中写一下代码,代码根据功能写,我们的功能开启微信红包功能,开启防撤回功能,输入运动步数,消息获取。[HTML] 纯文本查看 复制代码
{
"subheader":"微信插件功能页面",
"title":"插件",
"items":[
{
"label":"Switch"
},
{
"cell":"Switch",
"label":"自动抢红包",
"key":"wechatmoney",
"default":true
},
{
"label":"Switch"
},
{
"cell":"Switch",
"label":"防撤回",
"key":"wechatch",
"default":true
},
{
"label":"Switch"
},
{
"cell":"Switch",
"label":"消息获取",
"key":"message",
"default":true
},
{
"placeholder":"做多输入10个数",
"keyboard":"NumberPad",
"cell":"TextField",
"label":"运动步数",
"key":"number",
"alignment":"Right",
"maxLength":10
},
],
"header":"Hello World"
}
写完页面代码之后我们开始配置其他的代码,在WeChatExtensionDylib.xm中编写代码,代码如下:[Objective-C] 纯文本查看 复制代码 #import <UIKit/UIKit.h>
#import "Header.h"
%hook FindFriendEntryViewController
- (void)viewDidLoad {
%orig;
UIBarButtonItem *tweakItem = [[UIBarButtonItem alloc] initWithTitle:@" 插件" style:UIBarButtonItemStylePlain target:self action:@selector(tweakItemTapped:)];
[tweakItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]} forState:UIControlStateNormal];
self.navigationItem.leftBarButtonItem = tweakItem; // 设置界面导航栏左上角按钮
}
%new
- (void)tweakItemTapped:(id)sender {
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"WeChat" ofType:@"bundle"];
NSString *xuiPath = [[NSBundle bundleWithPath:bundlePath] pathForResource:@"interface" ofType:@"json"];
[XUIListViewController presentFromTopViewControllerWithPath:xuiPath withBundlePath:bundlePath];
}
%end
好了,代码都写完了,现在你可以运行你的手机,点击发现,左上角有一个插件的按钮,点击之后会有如下页面:
至于页面大概就这个样子把,第五篇文章我暂时是不写了,因为感觉也没多少人看这东西,前面四篇文章基本上把东西全都写出来了如果你先做一些其他的插件,以及功能也是完全没有问题的了,只是在于你细心和一些工具的利用了,我们继续。根据重构代码我们现在开始对插件的利用。因为我们现在添加了插件所以以前的WeChatConfig文件夹里面的内容我们也不需要调用了WeChatExtensionDylib.h文件我们也不需要调用了,我们只需要在WeChatHook文件中取得插件中设置的值就可以了。
以上代码就是取得插件中文本的值,因为我怕number属性可能导致错误,所以我在interface.json文件中修改了textfiled的key,然后把key改成了wechatnumber,就是上面那一份代码,你们自己改改吧,没改就说明压根就没认真看~
下面进行撤回功能和消息获取,红包功能在消息获取这里判断就可以了,我就不写了,写了这么多感觉有点烦了.....消息撤回功能:新建一个WeChatServiceManager文件WeChatServiceManager.h文件内容[Objective-C] 纯文本查看 复制代码 #import <Foundation/Foundation.h>
#import "WeChatHeader.h"
[url=home.php?mod=space&uid=593715]@interface[/url] WeChatServiceManager : NSObject
+(CMessageMgr*)sharedCMessageMgr;
@end WeChatServiceManager.m文件内容[Objective-C] 纯文本查看 复制代码 #import "WeChatServiceManager.h"
#import <objc/runtime.h>
@implementation WeChatServiceManager
+(CMessageMgr *)sharedCMessageMgr{
MMServiceCenter* serviceCenter = [objc_getClass("MMServiceCenter") defaultCenter];
return [serviceCenter getService:[objc_getClass("CMessageMgr") class]];
}
@end 然后新建一个WeChatMessageHook.m文件,这个文件里面写hook方法[Objective-C] 纯文本查看 复制代码 #import <Foundation/Foundation.h>
#import <CaptainHook.h>
#import "WeChatHeader.h"
#import "WeChatServiceManager.h"
CHDeclareClass(CMessageMgr);
CHOptimizedMethod1(self, void, CMessageMgr, onRevokeMsg,CMessageWrap*, msgWrap){
BOOL isSender = [objc_getClass("CMessageWrap") isSenderFromMsgWrap:msgWrap];
id enabledVal = [[NSUserDefaults standardUserDefaults] objectForKey:@"wechatch"];
BOOL isEnabled = [enabledVal boolValue]; if(![color=#000][font=Menlo][size=18px] isEnabled[/size][/font][/color] || isSender){
CHSuper1(CMessageMgr, onRevokeMsg, msgWrap);
return;
}
CMessageWrap *newMsgWrap = [[objc_getClass("CMessageWrap") alloc] initWithMsgType:0x2710];
NSString* revokePersonName = nil;
//获取撤回人
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<!\\[CDATA\\[(.*?)撤回了一条消息\\]\\]>" options:NSRegularExpressionCaseInsensitive error:nil];
NSTextCheckingResult *result = [regex matchesInString:msgWrap.m_nsContent options:0 range:NSMakeRange(0, msgWrap.m_nsContent.length)].firstObject;
if (result.numberOfRanges >= 2) {
revokePersonName = [msgWrap.m_nsContent substringWithRange:[result rangeAtIndex:1]];
}
NSString* sendContent = [NSString stringWithFormat:@"%@ 撤回了消息", revokePersonName ? revokePersonName : msgWrap.m_nsFromUsr];
[newMsgWrap setM_uiStatus:0x4];
[newMsgWrap setM_nsContent:sendContent];
[newMsgWrap setM_nsToUsr:msgWrap.m_nsToUsr];
[newMsgWrap setM_nsFromUsr:msgWrap.m_nsFromUsr];
[newMsgWrap setM_uiCreateTime:[msgWrap m_uiCreateTime]];
[[WeChatServiceManager sharedCMessageMgr] AddLocalMsg:msgWrap.m_nsFromUsr MsgWrap:newMsgWrap];
}
CHConstructor{
CHLoadLateClass(CMessageMgr);
CHClassHook1(CMessageMgr, onRevokeMsg);
}
在WeChatHeader文件中添加属性,这里我就直接复制下来了,你们自己查看一下[Objective-C] 纯文本查看 复制代码 #ifndef WeChatHeader_h
#define WeChatHeader_h
#import <UIKit/UIKit.h>
@interface CMessageWrap
@property(nonatomic, strong) NSString* m_nsContent; //发送消息的内容
@property(retain, nonatomic) NSString* m_nsToUsr; //发送人
@property(retain, nonatomic) NSString* m_nsFromUsr; //接收人
@property (nonatomic, assign) NSInteger m_uiMessageType;
@property(assign, nonatomic) unsigned long m_uiStatus;
@property(assign, nonatomic) unsigned long m_uiCreateTime;
+ (BOOL)isSenderFromMsgWrap:(CMessageWrap*) msgWrap;
- (CMessageWrap*)initWithMsgType:(int) type;
@end
@interface MMServiceCenter
- (id)getService:(Class) name;
@end
@interface CMessageMgr
- (void)AddLocalMsg:(NSString*)from MsgWrap:(CMessageWrap*) msgWrap;
@end
#endif /* WeChatHeader_h */
新建一个WeChatMessageSendHook.m这个文件中写消息获取功能[Objective-C] 纯文本查看 复制代码 #import <Foundation/Foundation.h>
#import <CaptainHook.h>
#import "WeChatHeader.h"
CHDeclareClass(CMessageMgr)
CHOptimizedMethod2(self, void, CMessageMgr, AsyncOnAddMsg, NSString*, msg, MsgWrap, CMessageWrap*, msgWrap){
id enabledVal = [[NSUserDefaults standardUserDefaults] objectForKey:@"message"];
[font=Menlo][size=18px]
BOOL[/size][/font][color=#000][font=Menlo][size=18px] isEnabled = [enabledVal [/size][/font][/color][font=Menlo][size=18px]boolValue[/size][/font][color=#000][font=Menlo][size=18px]];[/size][/font][/color]
if ([color=#000][font=Menlo][size=18px]isEnabled[/size][/font][/color]) {
NSString* content = msgWrap.m_nsContent;
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:nil message:[NSString stringWithFormat:@"%@",content] delegate:self cancelButtonTitle:@"确定i" otherButtonTitles:nil, nil];
[alert show];
}
CHSuper2(CMessageMgr, AsyncOnAddMsg, msg, MsgWrap, msgWrap);
}
CHConstructor{
CHLoadLateClass(CMessageMgr);
CHClassHook2(CMessageMgr, AsyncOnAddMsg, MsgWrap);
}
最后这里我再贴上我最后的文件结构,我把有些不需要的东西都删了,现在代码就更加少了,你也不需要传值进来了,除非你不想让使用的人看见,最好备份一份代码哦。
到这里所有功能都写好了,你只要认真看这代码写就一定不会错的,除非有些地方我遗忘了。还有就是是不是刚刚修改了微信步数变成了9万多步?哈哈,叫你们不认真看类型,NSString转 unsigned int没有几万步才奇怪
好了前面四章基础学习部分都写完了,第五章我看有没有那么多人看吧,没有的话我也懒的发,其实你们通过前面四章就可以完全自己找方法然后自己写了。最后贴上我的demo,不免费~,收费还特高,自己从第一章看到第四章然后自己写代码就不需要下载了,都是一样的,这个就是为了赚那些不想写代码光看不做事情的CB,想学会还不写代码?怎么可能,勤加练习才会让你的技术更好
别改太多了!!!!!!看聊天记录,9万步实在太恐怖了!,不说我也不知道
Demo下载:
好像改不了收多少CB,那我就不上传了Demo了
|