0x01 前言

小夏是一名普通Mac用户,某天,他打算试试思维导图来记录工作学习。
他问同事小芳:“Mac下有啥好用的思维导图软件?”
小芳:“XMind呀,很实用的思维导图软件。”
小夏:“那到哪里下载,要钱吗?”
小芳:“哎,你百度XMind破解版呀! 不需要花钱的,直接安装!”
小夏:“这么方便!我试试!”


这些所谓的破解版真的安全么?

0x02 样本概述

Xmind是一款实用的思维导图软件,正版官网售价高达99刀, 这个价格当然对普通用户无法承受, 通过搜索,很多站点都提供了破解版下载

1.jpg

对比相同版本号的正版和破解版, hash如下:

dab95dbad19995aeb88cc5d1bb0a7912  XMind_orig   //正版   [v3.7.1]   [306.2M]

094b3a161b7d041d217f6c61624ed388  XMind_new    //破解版 [v3.7.1]   [327.9M]

我们发现该样本采集了用户的很多隐私信息, 上传到了第三方服务器,采集信息如下图

2.jpg

目的

1、黑产非法售卖用户信息, 泄漏用户隐私

2、广告推广, 获取盈利

3、钓鱼执法, 发送侵权律师函

4、etc

下面我们对该样本详细分析


0x03 基本信息

在Mac应用中,OSX系统下的Mach-O是可执行文件格式,程序跑起来解析Mach-O,然后链接系统的库文件以及第三方动态库。

我们使用MachOView进行解析

3.jpg

在可执行文件 Load Commands 字段中记录了程序的加载指令,LC_LOAD_DYLIB是程序加载的动态库,其中Name字段记录了该动态库的路径,通常程序启动会根据该字段加载动态库。这里发现其加载了新增的两个动态库文件libcJFishPoolHook.dylib、libXMindHook.dylib。除此之外,XMind使用Java编写,移植到Mac平台,可执行文件也没有什么值得重点分析。

总结一下,主要做了如下事情:

1、程序启动初始化,获取资源文件。

2、加载.ini配置文件,得到启动的参数键值对。

3、将参数解析,然后运行加载Library(Java打包的动态库).

4.jpg

直接对比正版和破解版的包目录, 在包中我们发现了多出来的2个dylib文件

5.png

libC.JFishPoolHook.dylib

libXMindHook.dylib

下面对这2个dylib进行详细分析


0x04 dylib分析

对于Mac/iOS中使用到的dylib,可以使用class-dump和hoppper结合进行反汇编分析。class-dump又是一款开源解析MachO利器,与MachOView相似的是,他可按照MachO偏移量,找寻符号表(Symbol Table),从而导出类名和方法名,但是他提供了诸多参数用于导出不同架构的MachO链接符号表。使用如下命令导出类名方法名到文件中:

$ class-dump --arch x86_64 libCJFishPoolHook.dylib > header.txt

$ cat header.txt

6.jpg

从导出结果来看,很可疑的是CJFishPoolHook类,该类有多达16个成员, 写该动态库的程序员非常老实,没有进行任何加密、混淆类名、方法名的操作,因此从字面上也不难猜出其含义为qq号、微信号、手机号、邮箱号、操作系统、CPU类型、内存、MAC地址、内网IP、公网IP、用户名、应用列表、设备ID,是否上传信息、开启应用和关闭应用的时间。

7.jpg

第二个动态库的类方法较少,很明显能猜出,hook了程序的函数,修改程序运行逻辑。

主要方法为:

1、init初始化方法

2、ExChangeImp,Method Swizzling动态交换函数指针,用于hook

3、BuyHook

4、CheckUpdatesHook

5、HelpHook

6、TitleHook

7、OpenURLHook

8、DateMenuItemHook

最后还使用了一个加密方法方法,该方法传入第一个参数(明文),第二个参数key用于加密内容。

@interface NSString (AES)
+ (id)AESDecrypt:(id)arg1 password:(id)arg2;
+ (id)AESEncrypt:(id)arg1 password:(id)arg2;
@end

@interface NSString (Number)
- (BOOL)isPureFloat;
- (BOOL)isPureLongLong
;- (BOOL)isPureInt;
@end


0x06 抓包分析

通过上面的简单分析不难猜测, 他把采集的信息发送到服务端了, 通过抓包分析该样本与服务端通信的过程如下:

第一次向服务端发送了checklocked, 返回值为0, 说明可以传输设备信息

8.jpg

接下的data是用来上传用户信息的。Body是经过AES加密后base编码的密文,既然key已经有了,可以尝试解开请求密文

9.jpg

通过静态分析我们知道他使用了AES加密算法, 而key就硬编码在代码中

10.jpg

结合上述过程,了解到加密算法的第一个参数为kCCEncrypt,第二个为kCCAlgorithmAES128,第三个为加密的填充模式kCCOptionECBMode。 依据此我们写出的AES解密方法应该为:

CCCryptorStatus cryptStatus = 
CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionECBMode, //ECB Mode   
keyPtr,kCCKeySizeAES128,iv,[self bytes],dataLength, /* input 
*/buffer,bufferSize, /* output */numBytesEncrypted);

key为:iMdpgSr642Ck:7!@
解开的密文为

11.jpg

下面我们看看该样本是如何获取这些用户隐私的。


0x05 静态分析

用户隐私收集

CJFishPoolHook.dylib中会获取用户的隐私信息, 其流程如下

12.jpg

在应用初始化过程中,单例类的CJFishPoolHook执行初始化Init,随后,在Init方法中进行初始化成员操作,包含上述的16个信息。

在初始化过后,开启捕获用户信息startCapture。这其中包含获取用户联系方式(getContact),获取设备信息(getDevice),判断设备是否需要上传信息(checkLocked),获取应用ID(getProduct),获取设备上的应用列表(getFeature),获取地理位置(getLocation),获取启动时间(getHabitStart)。

最后一步,上传所有数据到服务器,并且使用AES加密算法加密httpbody。

恶意收集QQ信息, 电话, 微信号,应用列表

应用从Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ目录获取个人QQ信息。在该目录下,保存着用户的临时聊天记录,截图等信息。

13.png

从/Applications遍历本机安装的应用,形成应用列表。

14.png

恶意推广

libCJFishPoolHook.dylib修改了更新xmind的官方网站, 推广其自己的广告站点

15.jpg

进程注入后,使用Method Swizzling挂钩MenuItem、Button等按钮,使其失效或重定向跳转到其他网站,屏蔽注册、激活检查更新功能。难怪启动应用后发现激活按钮失效,无法进行版本更新,购买激活产品却跳转到另一个网站。


0x07 小结

本次的逆向分析过程清晰,单从网络传输和静态分析上就能了解到该重打包应用运行状态的全部过程。对此公司搜集用户信息的这种行为,不想做过多评价。

主要还是从两个方面进行总结,对于开发者而言,要了解一些基本的防御手段,注重网络传输安全、存储安全,在开发过程中,尽量不要把key明文编码于程序中,哪怕是将二次编码后的key放到应用内也好。我们无法得知软件是否会被破解,key是否会泄露,而一旦暴露出来,则很容易被利用从而解开密文信息。更有甚者,直接使用base编码内容、数据位亦或运算编码,这种更容易被分析。同时我们可以混淆加密、反调试等手段增加软件破解的难度。另一方面,站在用户的角度,下载安装未经验证的软件,是一件很危险的事情,例如著名的XcodeGhost事件,其实就是开发者安装了非官方验证的开发软件,导致开发的程序带有后门,窃取和上传大量用户信息。

本文所述的只是个人信息安全的一角,但却不能忽视他的存在。就同本文中libCJFishPoolHook命名一样,真正的含义是鱼塘,软件使用者是鱼,养在破解者的鱼塘中,等鱼养大了,也该收网了。


过去六年间,Mac销量越来越高,也意味着苹果用户越来越多。而用户一多,生态圈内的软件产出势必增长, 同时也会出现更多恶意软件浑水摸鱼

16.jpg

Mac恶意软件发展历史

17.jpg

我们发现很多Mac用户对自身的安全并不是很重视,针对用户的恶意软件逐渐增多,窃取用户的隐私, 监控用户的日常行为, 恶意推广广告, etc。因此,我们应该提高自身的安全意识, 警钟长鸣。


本文作者
ch4r0n
网络安全从业者
专注于移动端安全和二进制逆向分析

源链接

Hacking more

...