iOS微信插件

  • 作用: 微信消息轰炸好友

效果图



分析前准备工作

  • 通过SSH连接手机
$ ssh root@iphoneIP
$ root@iphoneIP's password: // 默认是alpine
  • 先通过cycript进入到WeChat的进程
iPhone-5c:~ root# cycript -p WeChat

通过界面分析

  • 1.从好友的聊天页面我们可以看出来有一个UITextVeiw
cy# choose(UITextView)
  • 2.我们可以通过UITextView的delegate来获取到更过的信息
cy# [#0x1610b600 delegate]
  • 3.从上面的信息中可以可以看出进入MMGrowTextView是UITextVeiw.delegate, 进入MMGrowTextView.h文件我看到了id <MMGrowTextViewDelegate> m_delegate;
cy# [#0x17645580 m_delegate]
  • 4.进入MMGrowTextViewDelegate-Protocol.h看到了- (void)TextViewDidEnter:(NSString *)arg1;
cy# [#0x17be2df0 TextViewDidEnter:@"hello"]; // 执行完这个就可以看到手机发送了hello给当前页面的好友啦
总结: 通过上面的一连串分析, 只要我们拿到MMInputToolView对象, 并调用TextViewDidEnter:方法即可实现发送消息
cy# choose(MMInputToolView) // 输入"<MMInputToolView: 0x174e6070; frame = (0 0; 320 568); text = ''; layer = <CALayer: 0x174e6310>>"
cy# [#0x174e6070 TextViewDidEnter:@"hello"] // 通过这两句就可以给当前的好友发送消息

开始写代码

下载整个工程

  • 创建Tweak工程(注意: 微信的bundld是com.tencent.xin)

  • 修改Makefile文件(添加这几行)

THEOS_DEVICE_IP = iphoneIp
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0
  • 修改Tweak文件
static const char kf_BaseMsgContentViewControllerBombViewKey = '\0'; // 点击轰炸时候弹出来的View
static const char kf_BaseMsgContentViewControllerMessageTextFeildKey= '\0'; // 用来填写需要发送内容的UITextField
static const char kf_BaseMsgContentViewControllerCountTextFeildKey= '\0'; // 用来填写需要发送次数的UITextField
static const char kf_BaseMsgContentViewControllerTimeIntervalTextFeildKey= '\0'; // 用来填写需要发送时间间隔的UITextField
static const char kf_BaseMsgContentViewControllerCurrentCountKey= '\0'; // 已经发送了多少次啦
static const char kf_BaseMsgContentViewControllerBomdItemKey= '\0'; // 轰炸按钮
static const char kf_BaseMsgContentViewControllerStartButtonKey = '\0';  // 开始按钮
static const char kf_BaseMsgContentViewControllerTimernKey = '\0';  // 开始按钮

@interface MMInputToolView: UIView
- (void)TextViewDidEnter:(NSString *)text;
@end

@interface BaseMsgContentViewController: UIViewController
- (void)sendMessageWithMessage:(NSString *)message maxcount:(NSInteger)count;
- (void)hiddenBombMessageViewWithSender:(UIButton *)button;

- (UIView *)kf_bombView;
- (UITextField *)kf_meesageTextFeild;
- (UITextField *)kf_countTextFeild;
- (UITextField *)kf_timeIntervalTextFeild;
- (UIBarButtonItem *)kf_bomdItem;
- (UIButton *)kf_startButton;
- (NSNumber *)kf_currentTimes;
- (void)kf_setCurrentCount:(NSNumber *)number;

@end
%hook BaseMsgContentViewController
- (void)viewWillAppear:(BOOL)animated{
    %orig;
    NSMutableArray *items = [NSMutableArray arrayWithArray:self.navigationItem.rightBarButtonItems];
    UIBarButtonItem *bombItem = [self kf_bomdItem];
    if(![items containsObject:bombItem]){
        [items addObject:bombItem];
        self.navigationItem.rightBarButtonItems = items;
    }
}

%new

%new
- (void)addBombMessageView{
    [self.view addSubview:[self kf_bombView]];
    [self kf_bombView].alpha = 1.0;
    [self kf_meesageTextFeild].text = nil;
    [self kf_countTextFeild].text = nil;
    [self kf_timeIntervalTextFeild].text = nil;
}

%new
- (void)hiddenBombMessageViewWithSender:(UIButton *)button{
    if(button != nil ){
        [self.view endEditing:YES];
        [self kf_setCurrentCount: @(0)];
        NSInteger interval = [[self kf_timeIntervalTextFeild].text integerValue];
        if([[self kf_countTextFeild].text integerValue] > 0){
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(updateMessage) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:timer  forMode:NSDefaultRunLoopMode];
        objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerTimernKey, timer, OBJC_ASSOCIATION_RETAIN);
        [[self kf_meesageTextFeild] becomeFirstResponder];
    }
    }
     [self kf_bombView].alpha = 0.0;
     [self.view endEditing:YES];
}
%new
- (void)updateMessage{
    if([[self kf_countTextFeild].text integerValue] > 0){
        NSInteger maxCount = [[self kf_countTextFeild].text integerValue];
        [self sendMessageWithMessage:[self kf_meesageTextFeild].text maxcount:maxCount];
    }
}

%new
- (void)sendMessageWithMessage:(NSString *)message maxcount:(NSInteger)count{

    NSNumber *number = [self kf_currentTimes];
    NSInteger current = [number integerValue];
    if(current < count){
        MMInputToolView *toolView = (MMInputToolView *)[self valueForKey:@"_inputToolView"];
        [toolView TextViewDidEnter:message];
    }else{
       NSTimer *timer = (NSTimer *)objc_getAssociatedObject(self, &kf_BaseMsgContentViewControllerTimernKey);
        [timer invalidate];
        timer = nil;
    }
    current++;
     [self kf_setCurrentCount:@(current)];

}


// 界面相关
%new

- (UIView *)kf_bombView{
    UIView *bombView = objc_getAssociatedObject(self, &kf_BaseMsgContentViewControllerBombViewKey);
    if(bombView == nil){
        CGFloat X =  ([UIScreen mainScreen].bounds.size.width - 300) / 2;
        bombView = [[UIView alloc] initWithFrame:CGRectMake(X, 80, 300, 220)];
        objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerBombViewKey, bombView, OBJC_ASSOCIATION_RETAIN);
        bombView.layer.cornerRadius = 10;
        bombView.backgroundColor = [UIColor whiteColor];
        [bombView addSubview:[self kf_meesageTextFeild]];
        [bombView addSubview:[self kf_countTextFeild]];
        [bombView addSubview:[self kf_timeIntervalTextFeild]];
        [bombView addSubview:[self kf_startButton]];
    }
    return bombView;

}
%new

- (UITextField *)kf_meesageTextFeild{
    UITextField *messageTextFeild = objc_getAssociatedObject(self, &kf_BaseMsgContentViewControllerMessageTextFeildKey);
    if(messageTextFeild == nil){
        messageTextFeild = [[UITextField alloc] initWithFrame:CGRectMake(15, 20, 270, 30)];
        messageTextFeild.font = [UIFont systemFontOfSize:13];
        messageTextFeild.borderStyle = UITextBorderStyleRoundedRect;
        messageTextFeild.placeholder = @"发送内容";
        objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerMessageTextFeildKey, messageTextFeild, OBJC_ASSOCIATION_RETAIN);
    }
    return messageTextFeild;
}
%new

- (UITextField *)kf_countTextFeild{
    UITextField *countTextFeild = objc_getAssociatedObject(self, &kf_BaseMsgContentViewControllerCountTextFeildKey);
    if(countTextFeild == nil){
        countTextFeild = [[UITextField alloc] initWithFrame:CGRectMake(15, 70, 270, 30)];
        countTextFeild.font = [UIFont systemFontOfSize:13];
        countTextFeild.borderStyle = UITextBorderStyleRoundedRect;
        countTextFeild.placeholder = @"轰炸次数";
        countTextFeild.keyboardType = UIKeyboardTypeNumberPad;

        objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerCountTextFeildKey, countTextFeild, OBJC_ASSOCIATION_RETAIN);
    }
    return countTextFeild;
}
%new

- (UITextField *)kf_timeIntervalTextFeild{
    UITextField *timeIntervalTextFeild = objc_getAssociatedObject(self, &kf_BaseMsgContentViewControllerTimeIntervalTextFeildKey);
    if(timeIntervalTextFeild == nil){
        timeIntervalTextFeild = [[UITextField alloc] initWithFrame:CGRectMake(15, 120, 270, 30)];
        timeIntervalTextFeild.font = [UIFont systemFontOfSize:13];
        timeIntervalTextFeild.borderStyle = UITextBorderStyleRoundedRect;
        timeIntervalTextFeild.placeholder = @"时间间隔/秒";
        timeIntervalTextFeild.keyboardType = UIKeyboardTypeNumberPad;
        objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerTimeIntervalTextFeildKey, timeIntervalTextFeild, OBJC_ASSOCIATION_RETAIN);
    }
    return timeIntervalTextFeild;
}
%new
- (UIBarButtonItem *)kf_bomdItem{

    UIBarButtonItem *bomdItem = objc_getAssociatedObject(self, &kf_BaseMsgContentViewControllerBomdItemKey);
    if(bomdItem == nil){
        bomdItem = [[UIBarButtonItem alloc] initWithTitle:@"轰炸" style:UIBarButtonItemStylePlain target:self  action:@selector(addBombMessageView)];
        objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerBomdItemKey, bomdItem, OBJC_ASSOCIATION_RETAIN);
    }
    return bomdItem;

}
%new
- (UIButton *)kf_startButton{
    UIButton *startButton = objc_getAssociatedObject(self, &kf_BaseMsgContentViewControllerStartButtonKey);
    if(startButton == nil){
        startButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 170, 270, 30)];
        [startButton setTitle:@"开始" forState:UIControlStateNormal];
        [startButton addTarget:self  action:@selector(hiddenBombMessageViewWithSender:) forControlEvents:UIControlEventTouchUpInside];
        [startButton setTitleColor:[[UIColor greenColor] colorWithAlphaComponent:0.7] forState:UIControlStateNormal];
        objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerStartButtonKey, startButton, OBJC_ASSOCIATION_RETAIN);
    }
    return startButton;
}


%new
- (NSNumber *)kf_currentTimes{
    NSNumber * times = objc_getAssociatedObject(self, &kf_BaseMsgContentViewControllerCurrentCountKey);
    if(times == nil){
        times = @(0);
        objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerCurrentCountKey, times, OBJC_ASSOCIATION_RETAIN);
    }
    return times;
}
%new
- (void)kf_setCurrentCount:(NSNumber *)number{
    objc_setAssociatedObject(self, &kf_BaseMsgContentViewControllerCurrentCountKey, number, OBJC_ASSOCIATION_RETAIN);
}
%end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容