iOS钉钉自动抢红包(非越狱环境)

马上就要过年了相信大家已经在钉钉里抢过一波红包了,也有些同学可能没有抢到比如说我。那除夕夜的红包大家应该不能再错过了吧,钉钉的自动抢红包之前也有很多大神写过了,比如说这里虽然版本有些旧了,我就在这个基础上又研究了一下。至于准备工具之类的我就不多说了,看我之前的文章里面有的。下面开始。

步骤

  • 找到打开红包的方法
  • 获取到最新红包的消息,调用打开红包的方法

分析

屏幕快照 2018-02-10 下午4.11.19.png

我们可以看到红包的类DTRedEnvelopPickView我们现在就到这个类里去寻找打开红包的方法。我们可以找到unpack的方法,但是这个是执行的一个block
屏幕快照 2018-02-10 下午4.20.47.png

我们直接hook到unpack方法利用xcode调试看看到底里面执行了什么方法。

CHOptimizedMethod(0, self,void,DTRedEnvelopPickView,unpack){
    CHSuper(0, DTRedEnvelopPickView,unpack);
}

点击打开红包后断点到这里,我们执行下一步就会看到

屏幕快照 2018-02-11 下午5.32.12.png

我们进入这个DTRedEnvelopServiceIMP头文件可以搜索到- (void)pickRedEnvelopCluster:(long long)arg1 clusterId:(id)arg2 successBlock:(CDUnknownBlockType)arg3这个方法。现在我们就清楚了这个就是打开红包的方法。然后我们继续分析最新消息的方法,我们通过xcode调试可以知道消息页面是DTBizConversation我们进入这个类可以看到setLastMessage方法,可以猜到这个应该是设置最新一条消息的,我们可以hook这个方法加一个断点,然后找同事给我们发一个消息,断点到了后我们就能看到
屏幕快照 2018-02-11 下午5.37.45.png

我们根据方法名就能猜出- (void)controller:(id)arg1 didChangeObject:(id)arg2 atIndex:(unsigned long long)arg3 forChangeType:(long long)arg4 newIndex:(unsigned long long)arg5;这个方法就是监听新消息的方法。我们hook到这个方法同样打断点。然后让同事发个红包给我们,就能找到第二个参数是一个聊天对象
屏幕快照 2018-02-11 下午5.39.54.png

我们打印_latestMessage可以看到一个消息的数据,然后我们打开红包断点到- (void)pickRedEnvelopCluster:(long long)arg1 clusterId:(id)arg2 successBlock:(CDUnknownBlockType)arg3这个打开红包方法里,看下传过去的参数,分析后就能找到是senderId和clusterId这两个我们在消息数据里可以拿到。现在就明确了,我们hook消息改变的方法判断是红包类型(红包类型为901和902)然后发送打开红包消息。

CHDeclareClass(DTConversationListDataSource)
CHOptimizedMethod(5, self,void,DTConversationListDataSource,controller,id,arg1,didChangeObject,id,arg2,atIndex,unsigned long long,arg3,forChangeType,long long,arg4,newIndex,unsigned long long,arg5){
    CHSuper(5, DTConversationListDataSource,controller,arg1,didChangeObject,arg2,atIndex,arg3,forChangeType,arg4,newIndex,arg5);
    NSLog(@"%@",arg2);
    NSString *json = CHIvar(arg2, _latestMessageJson, __strong NSString *);
    NSDictionary *data = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
    NSInteger type = [[data valueForKey:@"attachmentsType"] intValue];
    if(type == 902 || type == 901){
        if(![data[@"isRead"] boolValue]){
            NSString *clusterId = data[@"safeExtension"][@"clusterId"];
            long long sendId = [data[@"senderId"] longLongValue];
//            id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend;
            id imp = [NSClassFromString(@"DTRedEnvelopServiceIMP") new];
//            id protocl = CHIvar(imp, _networkIMP, __weak id);
            if (clusterId.length > 0){
//                pickRedEnvelopCluster:(long long)arg1 clusterId:(id)arg2 successBlock:(CDUnknownBlockType)arg3 failureBlock:(CDUnknownBlockType)arg4
                //拆红包
                id (*openRed_msgSend)(id, SEL,long long,id,id,id) = (void *)objc_msgSend;
                openRed_msgSend(imp,NSSelectorFromString(@"pickRedEnvelopCluster:clusterId:successBlock:failureBlock:"),sendId,clusterId,nil,nil);
            }
        }
    }
    
}

我们打好断点让同事发个红包,我们可以看到方法都执行了但是好像红包没有被领取,我们可以猜测我们创建的DTRedEnvelopServiceIMP对象是不是有问题,我们hook这个类的init方法打上断点看看它是怎么被创建的,重新运行,断点到了后我们可以看到

屏幕快照 2018-02-11 下午6.15.59.png

是这个类调用了DTRedEnvelopServiceFactory我们直接进这个类的头文件发现如下代码

#import <Foundation/NSObject.h>

@interface DTRedEnvelopServiceFactory : NSObject
{
}

+ (id)createServiceIMPWithPersistence:(id)arg1 network:(id)arg2;
+ (id)defaultServiceIMP;

@end

看到defaultServiceIMP我们应该就知道了我们调用这个方法创建出来就可以了

编码

方法我们都找到了要传什么参数也知道了这样就可以编写了,最终代码如下
//消息改变 拿到最新消息

CHOptimizedMethod(5, self,void,DTConversationListDataSource,controller,id,arg1,didChangeObject,id,arg2,atIndex,unsigned long long,arg3,forChangeType,long long,arg4,newIndex,unsigned long long,arg5){
    CHSuper(5, DTConversationListDataSource,controller,arg1,didChangeObject,arg2,atIndex,arg3,forChangeType,arg4,newIndex,arg5);
    NSLog(@"%@",arg2);
    NSString *json = CHIvar(arg2, _latestMessageJson, __strong NSString *);
    NSDictionary *data = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
    NSInteger type = [[data valueForKey:@"attachmentsType"] intValue];
    if(type == 902 || type == 901){
        if(![data[@"isRead"] boolValue]){
            NSString *clusterId = data[@"safeExtension"][@"clusterId"];
            long long sendId = [data[@"senderId"] longLongValue];
            id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend;
            id imp = typed_msgSend(objc_getClass("DTRedEnvelopServiceFactory"),NSSelectorFromString(@"defaultServiceIMP"));
//            id protocl = CHIvar(imp, _networkIMP, __weak id);
            if (clusterId.length > 0){
//                pickRedEnvelopCluster:(long long)arg1 clusterId:(id)arg2 successBlock:(CDUnknownBlockType)arg3 failureBlock:(CDUnknownBlockType)arg4
                //拆红包
                id (*openRed_msgSend)(id, SEL,long long,id,id,id) = (void *)objc_msgSend;
                openRed_msgSend(imp,NSSelectorFromString(@"pickRedEnvelopCluster:clusterId:successBlock:failureBlock:"),sendId,clusterId,nil,nil);
            }
        }
    }
}

逆向就是一步一步分析的过程,也要有比较敏锐的“嗅觉”,看到一个方法就能猜测到是做什么的。这个时候你编译运行到自己设备上让别人给你发个红包应该就会秒抢到了。有个问题就是这样用自己证书打包的话推送就收不到了。不过不影响我们抢红包。
代码在这里

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,504评论 25 707
  • 前言:最近笔者在研究iOS逆向工程,顺便拿微信来练手,在非越狱手机上实现了微信自动抢红包的功能。 题外话:此教程是...
    曾柏超阅读 1,825评论 0 2
  • 马上春节又要到来了,今年已经是我人生的第二十二个春节,每年的春节都会有不一样的地方但也有千篇一律的地方。 关于春节...
    鱼小坤阅读 333评论 0 1
  • 第一行代码中该demo无法使用,从写了一下,供参考学习。 之前的 shouldOverrideUrlLoading...
    tuionf阅读 697评论 0 1
  • 2017年6月24日星期六 心情❤良 1.今天给大家介绍——姿生本草精华水 温和无刺激补水修复配方,富含多种植物精...
    FAB星辰阅读 180评论 0 0