1.准备工作
借鉴此博文中软件以及思路准备
博主:喂草
博客地址://www.greatytc.com/p/c04ac36c6641
文章对我有启蒙作用,感谢!
2.修改上述博文中若干配置,以支持Xcode10
上述博文中用到了Xcode项目模板 EasySIMBL Bundle.xctemplate,但是最新版本Xcode不支持模板创建,所以我们要手动创建该项目。下文我以QQ为示例项目做演示。
1.打开Xcode创建项目,选择Installer Plug-in
2.注意product中要填写目标项目的最后一段,以QQ示例
3.创建qq.h和qq.m
#import <Foundation/Foundation.h>
@interface QQ : NSObject
+ (instancetype)sharedInstance;
@end
#import "QQ.h"
@interface QQ()
@end
@implementation QQ
/**
* @return the single static instance of the plugin object
*/
+ (instancetype)sharedInstance
{
static QQ *plugin = nil;
@synchronized(self) {
if (!plugin) {
plugin = [[self alloc] init];
}
}
return plugin;
}
/**
* A special method called by SIMBL once the application has started and all classes are initialized.
*/
+ (void)load
{
QQ *plugin = [QQ sharedInstance];
NSLog(@"++++++++ %@ plugin loaded ++++++++", plugin);
}
@end
4.转到qq target - info 中,修改如下项
5.转到qq target - Build Setting,修改如下项
3.思路整理,上述博文中已经详细写到防撤回相关思路和编写代码的方式,接下来重点介绍红包相关思路。
以我们常规认识,在各大平台将红包统称为RedPack,我们搜索该关键词,在Hopper Disassembleer中搜索.
好的项目命名规范都很明确,直接就有线索了,那么就先写出hook方法,先留着备用。
#import "BHMsgManager+hook.h"
#import "RedPackHelper.h"
@implementation NSObject (BHMsgManagerHook)
+ (void)hook{
[NSClassFromString(@"RedPackHelper") jr_swizzleClassMethod:@selector(openRedPackWithMsgModel:operation:) withClassMethod:@selector(hook_openRedPackWithMsgModel:operation:) error:NULL];
}
+ (void)hook_openRedPackWithMsgModel:(id)arg1 operation:(id)arg2{
[self hook_openRedPackWithMsgModel:arg1 operation:arg2];
}
接着我们要找到接受消息的方法,我们搜索msg关键词找到相关类
结果太多不好排除,直接靠猜,应该有个对应的管理类,按照一般命名规范,会以manager来作为后缀。。。逆向真的九分调试一分代码,调试七分靠猜三分靠实力。
疑似类:BHMsgManager,先去看看有哪些方法,找到class-dump出来的header文件,在Xcode中打开
果然是个消息收发管理类,方法一目了然,很明确,通过方法名可以大致猜到什么用途,我们要找的是收到消息的时候调用函数,上方图中有个疑似方法
- (void)appendSendMessageModel:(id)arg1;
我们继续hook调试这个方法,看看是否有我们需要的数据。
#import "BHMsgManager+hook.h"
#import "BHMsgManager.h"
#import "RedPackHelper.h"
@implementation NSObject (BHMsgManagerHook)
+ (void)hook{
[self jr_swizzleMethod:@selector(appendReceiveMessageModel:msgSource:) withMethod:@selector(hook_appendReceiveMessageModel:msgSource:) error:NULL];
[NSClassFromString(@"RedPackHelper") jr_swizzleClassMethod:@selector(openRedPackWithMsgModel:operation:) withClassMethod:@selector(hook_openRedPackWithMsgModel:operation:) error:NULL];
}
- (void)hook_appendReceiveMessageModel:(id)arg1 msgSource:(long long)arg2{
NSLog(@"+++接收到的消息:%@ class %@",arg1,[arg1 class] );
[self hook_appendReceiveMessageModel:arg1 msgSource:arg2];
}
+ (void)hook_openRedPackWithMsgModel:(id)arg1 operation:(id)arg2{
[self hook_openRedPackWithMsgModel:arg1 operation:arg2];
}
@end
我们要打印一下收到的arg1参数以及他的类型,好找到对应的类进一步分析,第二个参数arg2不太像是我们需要的消息体,因为它是个long long类型的。
发现是一个__NSArrayM,对应就是我们熟知的NSArray类型,而且内部数据已经打印出来,我们继续分析内部元素的数据和类型,写一个for循环打印内部元素和对应类型。
- (void)hook_appendReceiveMessageModel:(id)arg1 msgSource:(long long)arg2{
// NSLog(@"+++接收到的消息:%@ class %@",arg1,[arg1 class] );
for (id msg in arg1) {
NSLog(@"+++消息体 %@ 消息类型 %@",msg, [msg class]);
}
[self hook_appendReceiveMessageModel:arg1 msgSource:arg2];
}
运行,看下控制台消息。
发现消息类型是BHMessageModel,顺藤摸瓜,我们要找到能标识红包消息和其他消息的字段,我们读一下BHMessageModel.h文件。
好的项目能一目了然,MsgType这个字段应该就是消息类型字段,是个int类型数据,然后就要找到红包信息的MsgType是多少,我们继续写代码输出一下MsgType。
- (void)hook_appendReceiveMessageModel:(id)arg1 msgSource:(long long)arg2{
// NSLog(@"+++接收到的消息:%@ class %@",arg1,[arg1 class] );
for (id msg in arg1) {
NSLog(@"+++消息体 %@ 消息类型 %d",msg, [msg msgType]);
}
[self hook_appendReceiveMessageModel:arg1 msgSource:arg2];
}
这里注意一下,红包如果靠等别人发就比较被动了,我们找一个小号和自己大号来发,来尽量过滤掉杂乱消息。
两者数据不同,说明能区分两种不同的消息,那么我就get到了它的点,针对311类型消息,我们直接调用之前写好的打开红包的方法。
- (void)hook_appendReceiveMessageModel:(id)arg1 msgSource:(long long)arg2{
// NSLog(@"+++接收到的消息:%@ class %@",arg1,[arg1 class] );
for (BHMessageModel * msg in arg1) {
if (msg.msgType == 311) {
NSLog(@"+++收到红包消息 消息体 %@ 消息ID %d",msg, msg.msgID);
[NSClassFromString(@"RedPackHelper") openRedPackWithMsgModel:msg operation:0];
}
}
[self hook_appendReceiveMessageModel:arg1 msgSource:arg2];
}
ok,let's test it!
由于我这个是个小号没有实名认证,但是结果很明确,我们实现了自动抢红包的逻辑。
PS:本文仅仅作为学习,切勿用做商业用途,在此感谢腾讯公司提供的强大的程序免费供我们使用,再次感叹QQ技术团队的强大,只有良好的代码才有良好的阅读体验。
代码已上传GitHub,再次强调切勿用作商业用途,本文仅仅作为参考学习用途,如用作商业用途伤害到软件公司的权益,本人不负任何责任。
地址:https://github.com/wwpp3399/MacQQAutoOpenRedPack/tree/master