PC下的微信二次开发相信大家都会了,那么本篇文章将带领大家使用Frida框架对Mac下微信来进行二次开发!
PS:还有一种静态注入的方式也不错,但是考虑到大家xcode安装包太大就不在这里展开啦。
PS:frida如何去使用大家得自己去学,本文不过多展开。
主要功能涉及如下:
预先善其事,必先利其器!请先准备如下分析工具
首先利用Class-Dump拿到微信的头文件,打开终端执行:
1 |
|
成功执行之后会生成很多的头文件了,如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-
rw
-
r
-
-
r
-
-
1
n staff
927B
2
15
19
:
19
WXCPbQcwxtalkPackage.h
-
rw
-
r
-
-
r
-
-
1
n staff
975B
2
15
19
:
19
WXCPbReportItem.h
-
rw
-
r
-
-
r
-
-
1
n staff
1.7K
2
15
19
:
19
WXCPbSCAddVoiceGroupMemberResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
772B
2
15
19
:
19
WXCPbSCCancelCreateVoiceGroupResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
7.2K
2
15
19
:
19
WXCPbSCCreateVoiceGroupResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
6.9K
2
15
19
:
19
WXCPbSCEnterVoiceRoomResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
1.1K
2
15
19
:
19
WXCPbSCExitVoiceRoomResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
1.2K
2
15
19
:
19
WXCPbSCModifyVoiceGroupInfoResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
872B
2
15
19
:
19
WXCPbSCSubscribeLargeVideoResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
867B
2
15
19
:
19
WXCPbSCSubscribeVideoResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
2.0K
2
15
19
:
19
WXCPbSCVoiceClientSceneReportResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
864B
2
15
19
:
19
WXCPbSCVoiceGetGroupInfoBatchResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
637B
2
15
19
:
19
WXCPbSCVoiceMemberWhisperResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
5.9K
2
15
19
:
19
WXCPbSCVoiceRedirectResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
1.1K
2
15
19
:
19
WXCPbSCVoiceRoomHelloResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
904B
2
15
19
:
19
WXCPbSKBuiltinBuffer_t.h
-
rw
-
r
-
-
r
-
-
1
n staff
686B
2
15
19
:
19
WXCPbSubscribeVideoMember.h
-
rw
-
r
-
-
r
-
-
1
n staff
2.7K
2
15
19
:
19
WXCPbSwitchVideoGroupResp.h
-
rw
-
r
-
-
r
-
-
1
n staff
1.4K
2
15
19
:
19
WXCPbVideoGroupMember.h
-
rw
-
r
-
-
r
-
-
1
n staff
671B
2
15
19
:
19
WXCPbVoiceClientScene.h
-
rw
-
r
-
-
r
-
-
1
n staff
1.2K
2
15
19
:
19
WXCPbVoiceClientSceneExt.h
-
rw
-
r
-
-
r
-
-
1
n staff
2.9K
2
15
19
:
19
WXCPbVoiceConf.h
首先那么多的文件我们肯定不能一个个的去看,那样效率太低。相信大家做开发为了自己好维护代码,肯定不会给对象随便命名为abc这种吧!不会吧!不会吧!真的有这种人啊!!!但是我相信腾讯的程序员肯定不会这么做!!微信核心的功能是啥?是发消息哦,那么消息的英文是啥?Message !对就是他。所以我们就先塞选下这个Message!
# n @ localhost in ~/vscodewsp/wechat/dump [20:58:22]
$ ll |wc -l
4922
# n @ localhost in ~/vscodewsp/wechat/dump [20:58:29]
$ ll -l |grep Message|wc -l
157
# n @ localhost in ~/vscodewsp/wechat/dump [20:58:42]
执行如上命令我们把文件数从4922个转变到157了。这样就缩小了范围啦!如何再次缩小范围尼!那么就得是看大家的开发习惯啦,我一般做业务我都喜欢写service,controller,这种业务类名,于是我再次....
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
哎呦哎呦,就剩9个文件啦???那么这个一个个看也不碍事!!有时间就是任性!!!哼。最终定位到MessageService.h 打开一看,果然尼!真是运气好!
1 2 3 4 5 6 7 8 9 |
|
你看这功能不就来了嘛?Send开头的都是发送消息的函数啊。OK完事。那么就开始搞它!
PS:其实分析时候还是挺费事的,但是大家自己多动手肯定能找到的!
为了验证自己的分析是不是正确的,我们得进行验证啊,怎么验证?frida大法好!执行以下命令:
frida-trace -m "-[MessageService Send*]" 微信
1 2 3 4 5 6 7 |
|
然后会在当前目录生成handlers文件夹,里面是frida为我们自动生成的hook脚本文件。我们使用微信发送一条消息试试。
然后终端会输出一条信息:
195323 ms -[MessageService SendTextMessage:0x600000b6fae0 toUsrName:0x6503cfa934d442eb msgText:0x6000002ec860 atUserList:0x600000a73570]
这个就是触发了发送消息的hook信息啦。SendTextMessage 是不是跟我们在头文件信息里面看到的一样。
我们找到handles文件夹下SendTextMessage这个js文件,试试修改log输出然后再执行
frida-trace -m "-[MessageService Send*]" 微信
我们可以看到输出变啦2908 ms -[我的消息测试 SendTextMessage:0x600000b6fae0 toUsrName:0x6503cfa934d442eb msgText:0x6722df8306c2767b atUserList:0x6000009c2760]
如此可以确定我们找到的函数就是发送消息的函数。那么看看能不能打印出自己发送的消息内容
- (id)SendTextMessage:(id)arg1 toUsrName:(id)arg2 msgText:(id)arg3 atUserList:(id)arg4;
可以看到这个函数一共有4个参数:参数一:暂时不知道。参数二:toUsrName,我们可以知道是消息发送给谁的。参数三:msgText 消息内容,消息四:暂时不知道
分别把这四个参数给打印出来试试!修改js文件
1 2 3 4 5 6 7 |
|
然后执行 frida-trace -m "-[MessageService Send*]" 微信
发送一条消息
1 2 3 4 5 6 |
|
我们可以看到终端正确响应了,输出的正是我们发送的消息。那么我修改发送内容试试??添加如下代码:
args[4] = ObjC.classes.NSString.stringWithString_("MacOS微信分析")
然后微信发送任何消息,对方都将收到的是MacOS微信分析
这样我们就确定了发送文本消息的函数就是这个。那么我们如何主动调用它呢?
从上面的分析我们看到发送消息需要四个参数。第一个:通过分析应该是我们自己的微信id,第二个:对方的微信id,第三个:消息内容,第四个:可以为null
那么就打开hopper拖入微信具体分析分析吧
应用程序->微信->显示包内容->Contents->MacOS->WeChat 拖进hopper然后默认选项即可
在左边输入SendTextMessage搜索我们可以看到上面四个应该是我们所需要的,都打开看下伪代码。(我们分析需要找到函数调用的地方就能知道传参,然后再去分析参数是如何而来。那么除了函数定义地方代码,其余的都可以找到。
MMMessageSendLogic :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
这个伪代码看的就比较清楚了,
objc_unsafeClaimAutoreleasedReturnValue([[[r12 getService:[MessageService class]] retain] SendTextMessage:r15 toUsrName:r14 msgText:r13 atUserList:stack[-64]]);
我们可以看到第一个参数是r15,网上追溯r15,
r15 = [[rax CurrentUserName] retain];
r15是这里赋值的,那么再看看CurrentUserName方法内容。
1 2 3 4 5 6 7 8 9 10 |
|
可以看到是先判断是不是已经登录,然后调用CUtility类里面的GetCurrentUserName方法获得的。那么第一个参数我们就知道了。其余三个参数我们也很容易的可以手动构造。我们编写js脚本代码
1 2 3 4 5 6 7 8 9 10 11 |
|
将以上文本保存js文件,然后执行以下命令:
frida 微信 --debug --runtime=v8 --no-pause -l test.js
我们就可以看到微信上发送了一条消息
上面我们实现了微信消息的篡改及主动发送功能。那么我们再去看看微信是如何接到消息信息的!每当有人活或者群给我们发送消息的时候电脑或手机上一般都会提示通知,那么通知的英文是什么?notify 翻译就是通知的意思,我们碰碰运气看看能不能找到相关字样。还是在MessageService里面我们找到了- (void)notifyAddMsgOnMainThread:(id)arg1 msgData:(id)arg2;
这个方法,如何去确定它到底是不是尼?还是继续用frida去进行验证。
1 |
|
$ frida-trace -m "-[MessageService notify*]" 微信
Instrumenting...
-[MessageService notifyModMsgOnMainThread:msgData:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyModMsgOnMainThread_msgData_.js"
-[MessageService notifyAppMsgUploadProgress:msgData:uploadedBytes:totalBytes:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyAppMsgUploadProgress_msgDa_9b03499e.js"
-[MessageService notifyVideoMsgUploadProgress:msgData:uploadedBytes:totalBytes:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyVideoMsgUploadProgress_msg_e1db5f92.js"
-[MessageService notifyNewMsgNotificationOnMainThread:msgData:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyNewMsgNotificationOnMainTh_d56d83b5.js"
-[MessageService notifyChatSyncMsgsOnMainThread:msgList:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyChatSyncMsgsOnMainThread_msgList_.js"
-[MessageService notifyChatSyncMessagesMergedOnMainThread:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyChatSyncMessagesMergedOnMainThread_.js"
-[MessageService notifyRevokePatMsgOnMainThread:n64MsgId:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyRevokePatMsgOnMainThread_n64MsgId_.js"
-[MessageService notifyAddRevokePromptMsgOnMainThread:msgData:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyAddRevokePromptMsgOnMainTh_81637ebf.js"
-[MessageService notifyDelMsgOnMainThread:msgData:isRevoke:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyDelMsgOnMainThread_msgData_5bbc2297.js"
-[MessageService notifyMsgDeletedForSessionOnMainThread:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyMsgDeletedForSessionOnMainThread_.js"
-[MessageService notifyDelAllMsgOnMainThread:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyDelAllMsgOnMainThread_.js"
-[MessageService notifyAddMsgListForSessionOnMainThread:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyAddMsgListForSessionOnMainThread_.js"
-[MessageService notifyUnreadCntChangeOnMainThread:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyUnreadCntChangeOnMainThread_.js"
-[MessageService notifyMsgResendOnMainThread:msgData:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyMsgResendOnMainThread_msgData_.js"
-[MessageService notifyImgMsgUploadProgress:msgData:uploadedBytes:totalBytes:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyImgMsgUploadProgress_msgDa_e4e0cd43.js"
-[MessageService notifyAppMsgDownloadProgress:msgData:downloadedBytes:totalBytes:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyAppMsgDownloadProgress_msg_4e191704.js"
-[MessageService notifyUIAndSessionOnMainThread:withMsg:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyUIAndSessionOnMainThread_withMsg_.js"
-[MessageService notifyAddMsgOnMainThread:msgData:]: Loaded handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/notifyAddMsgOnMainThread_msgData_.js"
Started tracing 18 functions. Press Ctrl+C to stop.
我们可以看到有不少的方法被hook了,但是没事。我们用微信发送一个消息给自己或者其他人都可以看看输出。
1 2 3 4 5 6 |
|
我们可以看到三层相关的调用,那么我们就先看第一个notifyAddMsgOnMainThread
修改下js文件。
1 2 3 |
|
以我们上面的经验很快的就可以看出这个应该就是消息接受的方法,msgdata就是我们所需要的消息内容。那么我们还是得继续验证。把参数都打印出来看看。修改添加如下js
1 2 |
|
这两句话是为了输出2个参数的类型。然后也修改下frida命令执行
1 |
|
可以看到第一个参数是String,第二个参数是MessageData
1 2 3 4 5 6 7 8 |
|
MessageData是消息的结构体,那么我们就去头文件中搜索一下这个MessageData
1 2 3 4 5 6 7 8 9 10 |
|
可以看到是有MessageData这个文件的。那么我们打开看看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
|
看各个属性名应该没问题,就是他。那么我们直接修改js代码进行输出试试。
1 2 3 4 |
|
运行frida-trace -m "-[MessageService notifyAddMsgOnMainThread*]" 微信
1 2 3 4 5 6 7 8 9 |
|
如上我们可以看到成功接收到别人发送的消息内容。