基本信息

报告名称:彩虹猫病毒分析报告

作者:sshui

报告更新日期:2023年4月24日

样本发现日期:***

样本信息

image-20230423113431006

壳信息

image-20230423134051837

image-20230423134139369

病毒调用CryptGenRandom函数。

简介

彩虹猫病毒属于MBR病毒,从功能上看,它是一款恶作剧病毒。该病毒会修改MBR主引导扇区,以此来破坏电脑的正常启动。在修改MBR后,电脑重启会停留在一个彩虹猫的画面,因此该病毒被称为是彩虹猫病毒。

行为分析

  1. 自动弹出多个浏览器搜索窗口
  2. 鼠标异常晃动
  3. 窗口颜色怪异
  4. 反复出现系统提示音
  5. 出现六个MEMZ进程

当用户尝试关闭任意一个MEMZ进程或者手动关闭计算机,都会出现大量弹窗随后蓝屏,接着Windows无法正常启动,只会循环播放一只彩虹猫附带还款的背景音乐,无论多少次重启均如此。

详细分析

查壳

image-20230423135618047

启动PEiD发现使用ASProtect v1.32*进行加壳或加密

image-20230423135834745

使用StudyPE+进行分析,查看样本的导入表,发现大量导入的函数,对函数进行分类:

  1. 和发生现象有明显直接联系的函数:
    1. 自动弹出多个浏览器搜索窗口——ShellExecute
    2. 鼠标异常晃动——SetCursorPos、GetCursorPos
    3. 桌面出现奇怪图标——DrawIcon
    4. 窗口颜色怪异——BitBlt、StretchBlt
    5. 反复出现系统提示音——PlaySoundA
    6. 出现6个MEMZ进程——ShellExecute
  2. 不直接关联,常成对出现完成某些功能
    1. OpenProcessToken、AdjustTokenPrivilege、LookUpPrivilegeValue——给进程提权
    2. GetMessage、TranslateMessage、DispatchMessage——简历消息循环
    3. CreateToolhelp32Snapshot、Process32First、Process32Nest——遍历进程
    4. SetWindowHookEx、UnhookWindowHookEx、CallNextHookEx——给窗口下钩子
    5. LoadLibrary、GetProcAddress——加载库并导入函数
  3. 不确定干啥
    1. SendInput、GetSystemMetrics、DefWindowProc……

入口部分

使用IDA载入样本,定位到入口函数Start并获取伪代码。在start函数的起始部分调用GetCommandLineW、CommandLineToArgvW获取进程参数,之后整个start函数可以根据进程参数分为“无参数”、“watchdog”、“main”三部分。注意,以下反编译得到伪代码部分函数、变量均为了方便查看对名称进行了一定修改,使其更符合其作用。

无参数部分

image-20230423145726217

首先利用MessageBox弹出两个警告消息对话框,当两个对话框都被用户确认时,调用GetModuleFIleNameW获取当前进程的路径并保存。

然后使用do while循环执行5次ShellExecuteW,参数为刚刚得到的样本进程路径、字符串“/watchdog”,生成5个MEMZ.exe进程。

最后调用ShellExecuteExW以“/main”为参数生成了一个MEMZ.exe进程。

image-20230423150456995

该函数接受一个SHELLEXECUTEINFOA结构体,结构体中设定了进程路径和执行参数。后续调用SetPriorityClass,对当中的hProcess成员赋值为0x80,意味着创建的进程拥有最高响应优先级。最后调用ExitProcess使当前进程结束。

故,我们可以得知6个MEMZ.exe的来源:当双击样本时生成了一个原始进程,而原始进程生成了5个watchdog进程和一个main进程,最后原始进程迅速结束了自己,当我们打开任务管理器时,还存在6个MEMZ.exe。

watchdog部分

主体

image-20230423151401338

首先是调用CrateThread创建了一个线程,暂时命名为GetVirProce(IDA自动命名为sub_40114A,作者在分析过程中改变了命名)。

子函数GetVirProce(sub_40114A)

image-20230423152127876

前三个函数用来获取当前进程路径并存储。然后一个大的永真的while循环,利用CreateToolhelp32Snapshot给进程拍快照,再用Process32FirstW和Process32NextW进行遍历,对当前MEMZ.exe进程数进行统计。由于sleep函数的存在,死循环每隔一段时间就能统计出当前MEMZ.exe进程的数量并保存在findVirusProcessCount中,然后先判断allVirusProcessCount和findVirusProcessCount的大小,再让allVirusProcessCount保存findVirusProcessCount的值。当findVirusProcessCount的值小于allVirusProcessCount的值,也就是MEMZ.exe进程减少时,调用AdjustProPrivileges函数(原sub_401021)。在表现中,我们关闭一个MEMZ.exe进程,系统就会进行蓝屏重启,可推测AdjustProPrivileges就是完成蓝屏重启功能的。

子函数AdjustProPrivileges(sub_401021)

image-20230423163447584

首先调用CreateThread创建了20个StartAddress线程。

函数StartAddres

image-20230423162443236

SetWindowsHookExW和UnhookWindowsHookEx用于给窗口下钩子,干了什么事要到回调函数fn里去看。

函数fn

image-20230423162642720

code==3表示目标窗口即将被创建,此刻IParam表示该窗口的基本信息(坐标、大小等),能够发现这些信息正在被随机修改,同时此刻的修改是能够立即起效的。

当创建了完20个随机窗口后,AdjustProPrivileges函数调用Shutdown函数(原sub_401050)进行关机。

image-20230423163948287

函数Shutdown

前一种方式是使用LoadLibraryA加载ntdll库,再连续两次调用GetProcAddress获取“RtlAdjustPrivilege”、“NtRaiseHardError”两个未公开Windows API地址。随后调用这两个函数主动引发蓝屏

后者则是先利用一系列函数给当前进程提权,然后调用ExitWindowsEx主动关闭Windows。

总结:AdjustProPrivileges函数主要功能为强制关机,首先在关机前创建大量位置内容随机的窗口,然后使用蓝屏或者退出Windows的方式来强制关闭计算机。

注册并创建窗口

image-20230423165239420

回到主体部分,在创建完AdjustProPrivileges线程后,调用RegisterClassExA注册了一个名为“hax”的用户自定义窗口类型,并调用CreateWindowExA将其创建。

回调函数DefWindowPro(原sub_401000)

image-20230423165912827

创建的窗口存在一个回调函数DefWindowPro。查看代码可知,该窗口回调函数会对窗口消息进行过滤,若消息为WM_CLOSE或者WM_ENDSESSION,则调用AdjustProPrivileges强制关机,若是其他消息就不做任何处理,直接丢给系统默认处理函数DefWindowProcW。

消息循环

接着调用GetMessage、TranslateMessage、DispatchMessage包进一个大的while循环(俗称消息循环),对前面创建的窗体完成收取消息和派发消息的工作。

main部分

MBR部分

主体

程序首先对引导区扇区进行覆盖,在前304字节填充第一部分数据,然后使用0填充206字节数据,再填充1952字节的第二部分数据。这部分代码就是开机重启后屏幕播放跑动的小猫的部分。

炫耀

image-20230424090728048

程序创建了一个名为note.txt的记事本,往里面写入了一段话进行炫耀。再使用Windows自带的记事本打开。

其他部分

主体

image-20230423170633688

此刻程序调用CreateThread函数生成了10个线程,同时为参数v9赋初始值off_405130,且每次循环v9都自增2。

image-20230423171119752

v9指向的是一块数据区,不难看出这里存储的是函数地址,同时还保存有函数创建延迟时间。

image-20230423171734696

综上,这部分代码创建了十个进程,这十个进程和创建它们的延迟时间被存放在v9指向静态地址为off_405130数据区。通过查看具体的代码不难发现,这调用十个函数都属于破坏页面显示的攻击函数。

子函数InfiniteLoopFunction(原sub_401A2B)

image-20230423172428923

这部分代码就是循环执行上面主体部分提到的十个攻击函数,名称和作用分别是:

原名称 自定义函数名 作用
sub_004014FC GetRandomLink 运行浏览器,随机打开网站浏览,运行任务管理器,注册表管理器等
sub_0040156D desCursor 鼠标失控
sub_004017A5 Keyboard 插入键盘事件,对键盘进行监控
sub_004016A0 PlaySound 病毒运行过程中发出声音
sub_004015D4 BecomeTwinkling 改变屏幕显示并且桌面上软件界面被复制
sub_0040162A MoreDialog 更多的弹窗
sub_00401866 DrawingIcon 绘制ICON
sub_00401688 EnumChildWindow 枚举子窗口,随后对子窗口进行变形操作
sub_004017E9 StretchWindow 界面大小改变,桌面变形
sub_004016CD ChangeDesktopColor 让桌面变色

具体的操作就不再进行分析了。

解决方案及防范措施

  1. 若系统还能正常运行,先使用查杀软件查杀后,重建MBR引导程序。
  2. 若系统无法运行,可通过U盘启动运行系统,再对原引导区进行引导修复,重建MBR。
  3. 安装合规的病毒木马查杀程序。
  4. 不打开、下载、安装来路不明的软件。