0x01 前言小夏是一名普通Mac用户,某天,他打算试试思维导图来记录工作学习。他问同事小芳:“Mac下有啥好用的思维导图软件?”小芳:“XMind呀,很实用的思维导图软件。”小夏:“那到哪里下载,要…
0x01前言
小霞是普通的Mac用户。有一天,他计划尝试他的思维导图记录工作和学习。
他问他的同事小芳:“有没有一款适合Mac的思维导图软件?”
小芳:“XMind,非常实用的思维导图软件。”
小霞:“在哪里下载,你想要钱在哪里?”
小芳:“嘿,你百度XMind破解版!没需要花钱,直接安装!”
小霞:“这么方便!我试试!”
这些所谓的破解版真的安全么?
0x02示例概述
Xmind是一款实用的思维导图软件。真正的官方网站价格高达99刀。普通用户当然无法承受这个价格。通过搜索,许多网站提供了破解下载▼

比较正版和破解版的相同版本号,哈希如下:
Dab95dbad19995aeb88cc5d1bb0a7912 XMind_orig //正版 [v3.7.1] [306.2M]
094b3a161b7d041d217f6c61624ed388 XMind_new //破解版[v3.7.1] [327.9M]
我们发现该示例收集了大量用户的私人信息,上传到第三方服务器,并收集了如下所示的信息。
目的
1.黑色产品非法出售用户信息,泄露用户隐私
2.广告宣传,获取利润
3.渔业执法,派遣侵权律师
4等
下面我们详细分析样本
0x03基本信息
在Mac应用程序中,OSX下的Mach-O是可执行文件格式。该程序运行以解析Mach-O,然后将系统的库文件链接到第三方动态库。
我们使用MachOView进行解析

程序的load命令记录在可执行文件的Load Commands字段中。 LC_LOAD_DYLIB是程序加载的动态库。 “名称”字段记录动态库的路径。通常,程序根据字段开始加载动态库。在这里发现它已经加载了两个新的动态库文件libcJFishPoolHook.dylib和libXMindHook.dylib。此外,XMind是用Java编写的,移植到Mac平台上,在可执行文件中没有值得分析的东西。
综上所述,主要内容如下:
1.程序开始初始化并获取资源文件。
2.加载.ini配置文件并获取已启动的参数键值对。
3,解析参数,然后运行Load Library(Java打包动态库)。

直接比较正版和破解包目录,在包中我们发现了两个以上的dylib文件

libC.JFishPoolHook.dylib
libXMindHook.dylib
以下是对这两个dylib的详细分析
0x04 dylib分析
对于Mac/iOS中使用的dylib,您可以使用class-dump和hoppper的组合进行反汇编分析。类转储是另一种解析MachO工具的开源解决方案。与MachOView类似,它可以根据MachO偏移找到类名和方法名,但它提供了许多导出参数。 MachO链接符号表为不同的架构。使用以下命令将类名方法名称导出到文件:
$ class-dump --arch x86_64 libCJFishPoolHook.dylib> header.txt
$ cat header.txt

从导出的结果来看,CJFishPoolHook类最多有16个成员是可疑的。编写动态库的程序员非常诚实,并且不执行任何操作,例如加密,混淆类名和方法名称,所以字面意思不难猜测qq数字,微信号,手机号码的含义是什么,邮箱号码,操作系统,CPU类型,内存,MAC地址,内部网IP,公共网络IP,用户名,应用程序列表,设备ID,是否上传信息,何时打开应用程序以及何时关闭应用程序。

第二个动态库具有较少的类方法,很明显它可以被猜测,钩住程序的功能,并修改程序运行逻辑。
主要方法是:
1,init初始化方法
2,ExChangeImp,Method Swizzling动态交换函数指针,用于钩子
3,BuyHook
4,CheckUpdatesHook
5,HelpHook
6,TitleHook
7,OpenURLHook
8,DateMenuItemHook
最后,使用加密方法,该方法传入第一个参数(明文),第二个参数密钥用于加密内容。
@interface NSString (AES)
+ (id)AESDecrypt:(id)arg1 密码:(id)arg2;
+ (id)AESEncrypt:(id)arg1 密码:(id)arg2;
@结束
@interface NSString (Number)
- (BOOL)是PureFloat;
- (BOOL)是PureLongLong
; - (BOOL)是PureInt;
@结束
0x06捕获数据包分析
通过上述简单分析来猜测并不难。他将收集的信息发送到服务器。通过数据包捕获分析样本和服务器的过程如下:
第一次向服务器发送checklocked,返回值为0,表示可以传输设备信息。

下一个数据用于上传用户信息。 Body是基本加密后AES编码的密文。由于密钥已存在,您可以尝试解锁请求密文。

通过静态分析,我们知道他使用AES加密算法,并且密钥在代码中被硬编码。

结合上述过程,加密算法的第一个参数是kCCEncrypt,第二个是kCCAlgorithmAES128,第三个是加密的填充模式kCCOptionECBMode。据此,我们编写的AES解密方法应该是:
CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionECBMode, //ECB 模式
keyPtr,kCCKeySizeAES128,iv,[self bytes],dataLength, /* 输入
*/buffer,bufferSize, /* 输出 */numBytesEncrypted);
关键是:iMdpgSr642Ck: 7!@
解锁的密文是▼

让我们来看看样本如何获得这些用户的隐私。
0x05静态分析
用户隐私收集
CJFishPoolHook.dylib将获取用户的私人信息,过程如下▼

在应用程序初始化过程中,单例类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信息。在此目录中,存储用户的临时聊天记录,屏幕截图和其他信息。

从/Applications遍历本地安装的应用程序以形成应用程序列表。
恶意推广
libCJFishPoolHook.dylib修改了xmind的官方网站,以推广自己的广告网站

注入进程后,使用Method Swizzling挂钩MenuItem,Button等,
使其失效或重定向跳转到其他网站,屏蔽注册、激活检查更新功能。难怪启动应用程序后,激活按钮无效,无法执行版本更新,激活产品是购买并跳转到另一个网站。
0x07摘要
反向分析过程是明确的,可以从网络传输和静态分析中理解重新打包的应用程序运行状态的整个过程。公司收集用户信息的行为不希望被过度评估。
主要从两个方面,对于开发人员,了解一些基本的防御,注意网络传输的安全性,存储安全性,在开发过程中,尽量不要对程序中的关键文本进行编码,即使它将是两个关键后的第二个编码放在应用程序中。我们无法知道软件是否会被破解,密钥是否会泄漏,一旦暴露,很容易用来解锁密文信息。而且,直接使用基本编码内容,数据位或算术编码更容易分析。同时,我们可以混淆加密,反调试等手段来增加软件破解的难度。另一方面,从用户的角度来看,下载和安装未经验证的软件是非常危险的。例如,着名的XcodeGhost事件,实际上是开发人员安装了非官方的验证开发软件,从而导致了程序的开发。有后门窃取和上传大量用户信息。
这篇文章只是个人信息安全的一角,但不能忽视他的存在。就像本文中libCJFishPoolHook的命名一样,真正的意思是鱼塘,软件用户是鱼,在饼干的鱼塘里养大,鱼应该被抬起,网应该关闭。
在过去的六年中,Mac的销量变得越来越高,这意味着越来越多的Apple用户。随着越来越多的用户,生态系统中的软件输出必将增长,并且更多的恶意软件将出现在水中。

Mac恶意软件开发历史

我们发现许多Mac用户并不太关注自己的安全性。用户的恶意软件越来越多,窃取用户的隐私,监控用户的日常行为,恶意推广广告等。因此,我们应该提高自己的安全意识和警钟。
本文作者
ch4r0n
网络安全从业者
专注于移动端安全和二进制逆向分析