首页
社区
课程
招聘
[原创]MacOS微信逆向分析-Frida
发表于: 2021-2-15 22:31 120753

[原创]MacOS微信逆向分析-Frida

2021-2-15 22:31
120753

MacOS微信逆向分析-Frida

0.前言


 

PC下的微信二次开发相信大家都会了,那么本篇文章将带领大家使用Frida框架对Mac下微信来进行二次开发

 

PS:还有一种静态注入的方式也不错,但是考虑到大家xcode安装包太大就不在这里展开啦。

 

PS:frida如何去使用大家得自己去学,本文不过多展开。

 

PS:文章编写不易,转载请标注出处

 

PS:欢迎大家跟帖交流

 

主要功能涉及如下:

  1. 微信消息发送
  2. 微信消息监听

1.微信版本


 

图片描述

2.工具


 

预先善其事,必先利其器!请先准备如下分析工具

  1. Hopper Disassembler
  2. Class-dump
  3. Frida
  4. Pycharm(可选)
  5. Vscode(可选)

3.Dump 出头文件


 

首先利用Class-Dump拿到微信的头文件,打开终端执行:

1
class-dump -H /Applications/WeChat.app

成功执行之后会生成很多的头文件了,如下所示

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

4.分析


 

首先那么多的文件我们肯定不能一个个的去看,那样效率太低。相信大家做开发为了自己好维护代码,肯定不会给对象随便命名为abc这种吧!不会吧!不会吧!真的有这种人啊!!!但是我相信腾讯的程序员肯定不会这么做!!微信核心的功能是啥?是发消息哦,那么消息的英文是啥?Message !对就是他。所以我们就先塞选下这个Message

1
2
3
4
5
6
7
8
9
# 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
# n @ localhost in ~/vscodewsp/wechat/dump [20:58:42]
$ ll -l |grep Message|grep Service|wc -l
       9
 
# n @ localhost in ~/vscodewsp/wechat/dump [21:02:13]
$ ll -l |grep Message|grep Service
-rw-r--r--  1 n  staff   5.1K  2 15 19:19 FTSFileMessageService.h
-rw-r--r--  1 n  staff   382B  2 15 19:19 IMessageServiceAppExt-Protocol.h
-rw-r--r--  1 n  staff   980B  2 15 19:19 IMessageServiceFileExt-Protocol.h
-rw-r--r--  1 n  staff   381B  2 15 19:19 IMessageServiceFileReTransferExt-Protocol.h
-rw-r--r--  1 n  staff   755B  2 15 19:19 IMessageServiceImageExt-Protocol.h
-rw-r--r--  1 n  staff   780B  2 15 19:19 IMessageServiceVideoExt-Protocol.h
-rw-r--r--  1 n  staff   407B  2 15 19:19 IMessageServiceVideoReTransferExt-Protocol.h
-rw-r--r--  1 n  staff   3.1K  2 15 19:19 MMFTSMessageService.h
-rw-r--r--  1 n  staff    20K  2 15 19:19 MessageService.h
 
# n @ localhost in ~/vscodewsp/wechat/dump [21:02:25]
$

哎呦哎呦,就剩9个文件啦???那么这个一个个看也不碍事!!有时间就是任性!!!哼。最终定位到MessageService.h 打开一看,果然尼!真是运气好!

1
2
3
4
5
6
7
8
9
- (id)SendLocationMsgFromUser:(id)arg1 toUser:(id)arg2 withLatitude:(double)arg3 longitude:(double)arg4 poiName:(id)arg5 label:(id)arg6;
- (id)SendNamecardMsgFromUser:(id)arg1 toUser:(id)arg2 containingContact:(id)arg3;
- (id)SendStickerStoreEmoticonMsgFromUsr:(id)arg1 toUsrName:(id)arg2 md5:(id)arg3 productID:(id)arg4;
- (id)SendEmoticonMsgFromUsr:(id)arg1 toUsrName:(id)arg2 md5:(id)arg3 emoticonType:(unsigned int)arg4;
- (id)SendImgMessage:(id)arg1 toUsrName:(id)arg2 thumbImgData:(id)arg3 midImgData:(id)arg4 imgData:(id)arg5 imgInfo:(id)arg6;
- (id)SendTextMessage:(id)arg1 toUsrName:(id)arg2 msgText:(id)arg3 atUserList:(id)arg4;
- (id)SendAppMusicMessageFromUser:(id)arg1 toUsrName:(id)arg2 withTitle:(id)arg3 url:(id)arg4 description:(id)arg5 thumbnailData:(id)arg6;
- (id)SendAppURLMessageFromUser:(id)arg1 toUsrName:(id)arg2 withTitle:(id)arg3 url:(id)arg4 description:(id)arg5 thumbnailData:(id)arg6;
- (id)SendAppURLMessageFromUser:(id)arg1 toUsrName:(id)arg2 withTitle:(id)arg3 url:(id)arg4 description:(id)arg5 thumbUrl:(id)arg6 sourceUserName:(id)arg7 sourceDisplayName:(id)arg8;

你看这功能不就来了嘛?Send开头的都是发送消息的函数啊。OK完事。那么就开始搞它!

 

PS:其实分析时候还是挺费事的,但是大家自己多动手肯定能找到的!

5.FridaHook验证


 

为了验证自己的分析是不是正确的,我们得进行验证啊,怎么验证?frida大法好!执行以下命令:

 

frida-trace -m "-[MessageService Send*]" 微信

1
2
3
4
5
6
7
$ frida-trace -m "-[MessageService Send*]" 微信
Instrumenting...                                                       
-[MessageService SendTextMessageWithString:toUser:]: Auto-generated handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/SendTextMessageWithString_toUser_.js"
-[MessageService SendAppURLMessageFromUser:toUsrName:withTitle:url:description:thumbUrl:sourceUserName:sourceDisplayName:]: Auto-generated handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/SendAppURLMessageFromUser_toUsrN_eaefd0af.js"
------------------------------------------------------------------------------
-[MessageService SendNamecardMsgFromUser:toUser:containingContact:]: Auto-generated handler at "/Users/n/vscodewsp/wechat/__handlers__/MessageService/SendNamecardMsgFromUser_toUser_c_b5899e8d.js"
Started tracing 18 functions. Press Ctrl+C to stop.

然后会在当前目录生成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文件


[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2022-1-25 15:21 被胡家二少编辑 ,原因: 更新
收藏
免费 14
支持
分享
打赏 + 22.00雪花
打赏次数 3 雪花 + 22.00
 
赞赏  闪星星   +1.00 2021/07/28 助人为乐~
赞赏  mb_wzofwafl   +20.00 2021/03/20 感谢分享~
赞赏  demoscene   +1.00 2021/02/25
最新回复 (22)
雪    币: 7958
活跃值: (3665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
分析的很详细,支持一波
2021-2-16 09:01
1
雪    币: 2333
活跃值: (1061)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
牛逼class
2021-2-18 11:01
0
雪    币: 4168
活跃值: (15932)
能力值: ( LV9,RANK:710 )
在线值:
发帖
回帖
粉丝
4
牛逼
2021-2-18 17:28
0
雪    币: 3368
活跃值: (2246)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
MARK
2021-2-19 09:41
0
雪    币: 35662
活跃值: (64621)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
6
感谢分享!
2021-2-19 10:08
0
雪    币: 1507
活跃值: (853)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
虽然只1个函数,但是是最重要的发消息。引导思路特别好
2021-2-21 13:11
0
雪    币: 5492
活跃值: (3317)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
mark
2021-2-22 09:51
0
雪    币: 14424
活跃值: (10038)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
很详细,多谢分享。
2021-2-22 10:29
0
雪    币: 741
活跃值: (3128)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10

。。。

最后于 2021-2-24 19:34 被saloyun编辑 ,原因:
2021-2-24 19:12
0
雪    币: 379
活跃值: (274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
2021-3-3 20:57
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
文章写的非常浅显易懂,给作者点个赞
2021-3-20 22:37
0
雪    币: 82
活跃值: (207)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错!支持!
2021-9-14 18:41
0
雪    币: 201
活跃值: (61)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
15

你好,我这边使用 frida-trace -m "-[MessageService Send*]" 微信。一直提示Failed to attach: timeout was reached。是什么原因呢。=-=网上找了一圈没有找到解决方法。是否需要启用mac端的frida-server。更新重装最新的frida版本。问题得到解决。

最后于 2022-1-14 16:58 被浪荡男同学编辑 ,原因:
2022-1-12 14:47
0
雪    币: 20
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
关键是作者的思路
2022-1-12 23:57
0
雪    币: 154
活跃值: (1225)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
mark了
2022-1-14 20:10
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
learn
2022-3-4 17:58
0
雪    币: 276
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
var MessageData = new ObjC.Object(args[3]).$ivars;
大佬能解释一下这个$ivars怎么得出来的嘛?
2022-3-6 17:44
1
雪    币: 123
活跃值: (1267)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20

e03K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6X3M7X3W2V1j5g2)9J5k6i4u0W2i4K6u0r3k6r3!0U0M7#2)9J5c8X3A6S2N6X3q4K6j5%4u0A6M7s2c8Q4x3X3c8S2M7r3W2Q4x3V1k6Q4x3U0y4G2j5X3A6U0

$ivars: object mapping each instance variable name to its current value, allowing you to read and write each through access and assignment

2022-5-10 19:04
0
雪    币: 123
活跃值: (1267)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
hook她的心 var MessageData = new ObjC.Object(args[3]).$ivars; 大佬能解释一下这个$ivars怎么得出来的嘛?

2f6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6X3M7X3W2V1j5g2)9J5k6i4u0W2i4K6u0r3k6r3!0U0M7#2)9J5c8X3A6S2N6X3q4K6j5%4u0A6M7s2c8Q4x3X3c8S2M7r3W2Q4x3V1k6Q4x3U0y4G2j5X3A6U0

$ivars: object mapping each instance variable name to its current value, allowing you to read and write each through access and assignment

2022-5-10 19:05
0
游客
登录 | 注册 方可回帖
返回