![](https://img.haomeiwen.com/i3817720/1eae4ed9e3f33c6d.png)
前言
前几天跟同事聊天无意间聊到逆向这个话题,心里顿时起了想学学逆向的想法。刚好在朋友圈看到有人在卖一键群发的软件,我本着探索的精神来研究下,看看能不能做到。所以在这里班门弄斧下,记录一下自动群发的制作过程,写的不好请见谅,因为我也是第一次学习逆向。先看看效果图。(本文为本人原创,如转发请标明出处)
![](https://img.haomeiwen.com/i3817720/7c2d9ec1692e3b07.gif)
内容简述(文章内容有点长,请耐心看完)
我这个自动群发功能需要两个App。(其实可以直接在脱壳App加一键群发的界面,我为了巩固keychain的知识(用keychain是为了可以两个App之间进行数据共享),我直接做成两个App,下面有讲到)
一个是自己写的原生App,用于输入群发内容,一键启动进行群发。
另一个是在pp助手下载的微信脱壳App,用于群发消息的。
![](https://img.haomeiwen.com/i3817720/0fb9980ccbf8fea4.png)
必备工具
开始之前,我们需要确保电脑有以下工具,没有的话需要安装后再继续
1.pp助手
PP助手主要的功能是下载脱壳ipa文件
![](https://img.haomeiwen.com/i3817720/98a6a8b7a83b4132.png)
2. 安装class-dump
class-dump主要是用来查看脱壳之后的Mach-O文件的所能暴露出来的头文件.如何安装呢?
安装方式:
一、直接下载文件,下面是网上一位大神提供的
下载地址
二、直接去github搜class-dump,下载工程后获取里面的class-dump文件
然后把class-dump复制到/usr/local/bin/class-dump即可(OS X 10.11以上).
![](https://img.haomeiwen.com/i3817720/8094faa1d632fe61.png)
这时候我们直接在终端上敲出class-dump指令了.如下所示.
![](https://img.haomeiwen.com/i3817720/bd179b039c319611.png)
3. 安装MonkeyDev
安装MonkeyDev是为了可以直接执行微信的函数或者获取微信的变量值。由于OpenDev已经不更新了,所以AloneMonkey在OpenDev基础上做了更新。
MonkeyDev原文安装链接
安装完之后,在xcode新建项目的时候,发现会多了以下这个选项
![](https://img.haomeiwen.com/i3817720/1282b4ec70531447.png)
自动群发的逻辑原理
![](https://img.haomeiwen.com/i3817720/524138262e764436.png)
如上图所示.我们把通过PP助手下载的越脱壳ipa文件通过class-dump指令来查看所有包含类的头文件.然后编写代码.通过runtime的机制动态注入到破壳文件中,最后安装应用程序.
MonkeyDev的作者已经把其中的三步进行了封装,我用了之后,发现相当的简单粗暴
通过PP助手下载破壳ipa文件
![](https://img.haomeiwen.com/i3817720/133272a84ca2816b.png)
下载后拿到ipa包,留着备用
通过Class-dump指令查看所有头文件信息
这时刚刚下载的IPA派上用场了,对IPA包进行解压
![](https://img.haomeiwen.com/i3817720/989e6855c984a0f2.png)
找到wechat包,显示包内容
![](https://img.haomeiwen.com/i3817720/674d52e01a36ac26.png)
找到里面的WeChat文件
![](https://img.haomeiwen.com/i3817720/7db927a539333fd9.png)
拿到此文件之后,执行下面的指令(我的WeChat文件被我放到桌面了)
class-dump -H "WeChat文件的路径" -o "存放头文件的路径"
![](https://img.haomeiwen.com/i3817720/c886888a42f5efd6.png)
执行完之后会发现桌面多了一个文件夹,叫Headers,里面全是微信的头文件,随便用一个前端的IDE打开即可
![](https://img.haomeiwen.com/i3817720/cbdda53d1c40785d.png)
好了,到此基本工作就做完了,接下来就进入主题了,开始着手制作自动群发
使用MonkeyDev完成我们接下来的操作
打开xcode,拉到下面,选择MonkeyApp创建一个工程
![](https://img.haomeiwen.com/i3817720/b41d580977ceaf41.png)
接下来,我们需要做的就是把我们的ipa文件放到指定位置,也就是我们刚刚用pp助手下载的ipa。里面的put ipa or app here文件不要删除.
![](https://img.haomeiwen.com/i3817720/9852f6115bc294b0.png)
OK,工作基本完成一半了,接下来要写代码了,代码只能在wechatdemoDylib.m编写
![](https://img.haomeiwen.com/i3817720/e5f5c0f6f88101be.png)
接下来开始写代码
如何找到你想要的界面并进行写代码
有好几种方法可以获取,这里我使用xcode来演示。按照常规开发逻辑来说首先要知道群发界面是从个人中心的设置里面进去的,所以要获取个人中心界面的点击方法。不过我要说一下我踩过的坑
在这里我要说一下我踩过的坑,我用代码实现了从个人中心一路跳转到群发助手,才发现,群发助手是在首页弹出来的,于是我抱着探索的精神去首页看了一下他的头文件,发现真的有一个函数是直接跳到群发助手的,害我前面写了那么久的代码,原来都是白费功夫。
所以下面我们不看个人中心了,我们看首页
![](https://img.haomeiwen.com/i3817720/ad2fd63612a522c1.png)
1、从首页自动跳转到群发助手
现在我们知道了首页是哪个控制器了,所以用全局搜索可以定位首页控制器的文件位置,打开之后我们仔细看可以看到下面有个函数就是我们要的跳转群发助手界面。
![](https://img.haomeiwen.com/i3817720/5ba567b28964f251.png)
好了,我们现在知道控制器的名字和跳转的方法,所以直接在wechatdemoDylib.m文件写代码,如下图所示
CHDeclareClass(NewMainFrameViewController);
CHOptimizedMethod0(self, void, NewMainFrameViewController, viewDidLoad){
CHSuper0(NewMainFrameViewController, viewDidLoad);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
id(*goSend2)(id,SEL)=(void *)objc_msgSend;
goSend2(self,@selector(openMassSend));
});
//监听App从后台进入前台
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
NSLog(@"我进来了");
//这里的代码是为了在一键群发App跳转到微信用的
id(*goSend2)(id,SEL)=(void *)objc_msgSend;
goSend2(self,@selector(openMassSend));
}];
}
CHConstructor // code block that runs immediately upon load
{
@autoreleasepool
{
CHLoadLateClass(NewMainFrameViewController);
CHHook(0,NewMainFrameViewController,viewDidLoad);
}
}
然后运行代码,发现可以直接从首页跳到群发助手界面了
![](https://img.haomeiwen.com/i3817720/4221b512ac47a2f3.png)
2、找到新建群发按钮的点击方法
接下来要做的是找到底下这个新建群发的点击方法,还是用xcode寻找,于是找到了,这个按钮在MassSendContentLogicController这个类,然后点击方法是onNewMassSend,老规矩,去找一下这个类
![](https://img.haomeiwen.com/i3817720/1e3ad2266b1ede46.png)
![](https://img.haomeiwen.com/i3817720/7e3add881c4a2bae.png)
类名和函数名都知道了,接下来写代码
CHDeclareClass(MassSendContentLogicController); // declare class
CHOptimizedMethod0( self, void, MassSendContentLogicController, ViewDidInit) // hook method (with no arguments and no return value)
{
CHSuper0(MassSendContentLogicController, ViewDidInit);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
id(*goSend2)(id,SEL,id)=(void *)objc_msgSend;
goSend2(self,@selector(onNewMassSend:),NULL);
});
}
CHConstructor // code block that runs immediately upon load
{
@autoreleasepool
{
CHLoadLateClass(MassSendContentLogicController);
CHHook(0, MassSendContentLogicController,ViewDidInit);
}
}
运行代码,发现可以跳到选择联系人界面,所以要做到如何自动触发全选和点击下一步,如下图
3、自动触发全选按钮和下一步
老规矩,找到全选按钮和下一步按钮的方法名,如下图
![](https://img.haomeiwen.com/i3817720/f86816d32146737b.png)
![](https://img.haomeiwen.com/i3817720/4213584171b287b2.png)
上代码
CHDeclareClass(MMMassSendContactSelectorViewController); // declare class
CHOptimizedMethod0( self, void, MMMassSendContactSelectorViewController, viewDidLoad) // hook method (with no arguments and no return value)
{
CHSuper0(MMMassSendContactSelectorViewController, viewDidLoad);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
id(*goSend2)(id,SEL,id)=(void *)objc_msgSend;
goSend2(self,@selector(onSelectAll:),nil);
});
//全选之后自动执行下一步操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
id(*goSend3)(id,SEL,id)=(void *)objc_msgSend;
goSend3(self,@selector(onDone:),nil);
});
}
CHConstructor // code block that runs immediately upon load
{
@autoreleasepool
{
CHLoadLateClass(MMMassSendContactSelectorViewController);
CHHook(0, MMMassSendContactSelectorViewController,viewDidLoad);
}
}
运行代码,你会发现他会自动勾选全部联系人并且跳转到群发消息界面了,这时只需要输入文字就可以群发了
![](https://img.haomeiwen.com/i3817720/1c6cac8e53eb7546.jpeg)
♀️♀️♀️♀️但是我们要做的是自动群发啊,所以这时我们另一个App(群发助手)就派上用场了,我们在群发助手输入内容,然后点击按钮,他就会自动唤起微信,并且一步步走到群发界面,然后自动将消息发出去。
制作一键群发App
制作这个App的目的是输入内容后,点击按钮,他就会自动唤起微信,并且一步步走到群发界面,然后自动将消息发出去。创建工程的时候不用选择MonkeyApp,按照常规形式创建工程即可。界面和代码实现如下
代码实现
[[KeyChainTool shareInstance] saveContentToKeyChain:content forAccount:keyChainAccount service:keyChain_Content_Servies];
[[KeyChainTool shareInstance] saveContentToKeyChain:@"1" forAccount:keyChainAccount service:keyChain_Push_Servies];
NSURL *url = [NSURL URLWithString:@"zhushou://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:nil completionHandler:nil];
}else{
NSLog(@"没安装app 你打开个锤子");
}
备注:这里需要配置一下URL Types,用于启动微信,在wechatDemo里面,target->info->URL Types添加一个types
![](https://img.haomeiwen.com/i3817720/203244e6fbde62fe.png)
备注:还需要引入keychain文件,这里有下载地址,两个工程都要引入这个文件。
这里用keychain是为了能够使两个App可以进行数据共享。
keychain下载地址 提取码: yjzc (友情提示:在微信工程中,该文件必须放在config文件夹,另一个App则随便)
好了,到这里一键群发App已经制作完毕。接下来再回到微信工程里面
最后一步 从一键群发App跳转到微信,并自动发送消息
回到微信的工程里面,我们需要在这个界面接收到群发消息,所以我们需要解析出这个界面里面,哪个函数是用来发送消息的
![](https://img.haomeiwen.com/i3817720/4d0c9d1082692f1e.png)
由xcode解析到,这个类叫MMMassSendWriteMessageViewController
![](https://img.haomeiwen.com/i3817720/79b24d6ff9d4df8d.png)
于是定位到代码里面,这里我调试了很久,因为不知道哪个才是发送消息的函数,最后终于找出来了,就是这个
![](https://img.haomeiwen.com/i3817720/9b0fa7b02821ce83.png)
代码如下
CHDeclareClass(MMMassSendWriteMessageViewController); // declare class
CHOptimizedMethod0( self, void, MMMassSendWriteMessageViewController, viewDidLoad) // hook method (with no arguments and no return value)
{
CHSuper0(MMMassSendWriteMessageViewController, viewDidLoad);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSString *c = [[KeyChainTool shareInstance] getContentFromKeyChain:keyChainAccount service:keyChain_Content_Servies];
id(*goSend3)(id,SEL,NSString *)=(void *)objc_msgSend;
goSend3(self,@selector(SendTextMessageToolView:),c);
});
}
CHConstructor // code block that runs immediately upon load
{
@autoreleasepool
{
CHLoadLateClass(MMMassSendWriteMessageViewController);
CHHook(0, MMMassSendWriteMessageViewController,viewDidLoad);
}
}
运行两个App,发现可以一键群发了,end
结束
卓敦第一次玩逆向,文章有写的不好的地方,可以私信提出宝贵意见,求轻点喷。班门弄斧了,这里demo就不上传了。在此谢过。
鸣谢
有一部分效果图由于我已经做过了,懒得再次实现,所以是借助了这位仁兄
的图。
网友评论