彩虹猫MEMZ病毒分析
前言
彩虹猫是一款很有意思的病毒,结构也很简单,适合小白分析练手。这篇分析也是闲暇之余想到的一个项目,不但展示了分析结果,也重点阐述了分析过程中遇到问题时的解决思路,尽量做到详细、多图、无死角,希望能对同样是新手的师傅们多一点帮助。
简介
彩虹猫病毒属于MBR病毒,从功能上看,它是一款恶作剧病毒,中招的用户MBR会被篡改重启后无法正常进入系统只会出现彩虹猫的动画。同时在中招之后用户的鼠标和键盘会间歇性失效,桌面不断出现弹窗并且出现负片效果,鼠标图标会被修改,发出错误提示的声音,通过任务管理器关闭MEMZ.exe进程桌面会出现大量弹窗,随后出现蓝屏。
什么是MBR病毒?
引导区病毒是PC机上最早出现的病毒,也是我国最早发现的病毒种类。这类病毒主要感染软盘的引导扇区和硬盘的引导扇区或者主引导记录。
一个正常的计算机启动过程是:计算机读取引导扇区或者主引导记录加载其进入内存中,然后引导相应的系统。而一台染有引导区病毒的机器则会先把病毒加载入内存然后才进行正常的引导过程。
病毒大致运行流程分析
准备工作
样本:彩虹猫MEMZ病毒
工具:PEID、IDA、StudyPE+
环境:Windows7
基本信息
样本类型:PE32executable (GUI) Intel 80386, for MS Windows
MD5:19dbec50735b5f2a72d4199c4e184960
SHA1:6fed7732f7cb6f59743795b2ab154a3676f4c822
样本下载
微信公众号后台回复:“彩虹猫”即可获得下载链接。
开始分析
在开始做这个病毒的分析之前,先查查有没有壳,导入软件之后发现并没有壳,换个思路。
再看看这个软件的导入表信息,发现里面有7个动态链接库文件。
根据查阅相关资料得知该dll文件的含义如下:
KERNEL32.dll:控制着系统的内存管理、数据的输入输出操作和中断处理
USER32.dll:创建窗口和发送消息,与用户界面相关
GDI32.dll:用来绘制图像和显示文字
ADVAPI32.dll:负责对象的安全性,注册表的操控以及事件日志
SHELL32.dll:用于打开网页和文件,建立文件时的默认文件名的设置
WINMM.dl:用于低档的音频和游戏手柄
PSAPI.dll:Windows系统进程状态支持模块
在ADVAPI32.dll文件中查看得知该病毒给进程提权使用了以下函数
OpenProcessToken:得到进程的令牌句柄
AdjustTokenPrivileges:判断修改令牌权限
LookupPrivilegeValue:查询进程的权限取得特权的LUID值
现在把该样本导入进我们所用到的反编译工具里面。
用IDA将样本导入定位到入口函数start之后按下F5获得该段的伪代码,发现在start函数的起始部分调用GetCommandLineW、CommandLineToArgvW获取进程参数。
继续向下看代码,
这个进程的传递参数,类似于标准C运行时argv和argc值。从而走不同的流程。
接着往下走可以看到:
这里说一下跳出的两个Messagebox,其中Messagebox函数结构如下:
MessageBox(句柄,显示内容,标题,MB_OK);
在这个代码中,函数句柄为0表明是当前窗口的句柄。其中,messagebox返回值为6,即表明点击确定按钮。紧接着,代码利用GetModuleFileName函数记录下了当前进程加载已加载模块的文件的完整路径。
再来详细说一下开启的5个MEMZ.exe进程:用一个while循环,循环了5次,利用ShellExecuteW函数创建了5个进程,而这个进程所打开的程序目录就是刚才v10指定的,在指定参数中选择“watchdog”,可选选项中选择“用最近的位置和大小显示,激活”。也就是说,在这里代码连续五次调用了ShellExecuteW函数,以字符串“watchdog”为参数,所以也生成了5个MEMZ.exe进程。
来看一下ShellExecuteEx函数的结构,通过利用搜索引擎的查询可以得知:
语法格式:
BOOLShellExecuteEx(
_Inout_SHELLEXECUTEINFO *pExecInfo
);
参数:输入输出参数都是SHELLEXECUTEINFO结构体,其结构定义如下:
typedefstruct _SHELLEXECUTEINFO {
DWORD cbSize; //结构大小,sizeof(SHELLEXECUTEINFO)
ULONG fMask; //指定结构成员的有效性
HWND hwnd; //父窗口句柄或出错时显示错误父窗口的句柄,可以为NULL
LPCTSTR lpVerb; //指定该函数的执行动作
LPCTSTR lpFile; //操作对象路径
LPCTSTR lpParameters; //执行参数,可以为NULL
LPCTSTR lpDirectory; //工作目录,可以为NULL
int nShow; //显示方式
HINSTANCEhInstApp; //如果设置了SEE_MASK_NOCLOSEPROCESS,并且调用成功则该值大于32,调用失败者被设置错误值
LPVOID lpIDList; //ITEMIDLIST结构的地址,存储成员的特别标识符,当fMask不包括SEE_MASK_IDLIST或SEE_MASK_INVOKEIDLIST时该项被忽略
LPCTSTR lpClass; //指明文件类别的名字或GUID,当fMask不包括SEE_MASK_CLASSNAME时该项被忽略
HKEY hkeyClass; //获得已在系统注册的文件类型的Handle,当fMask不包括SEE_MASK_HOTKEY时该项被忽略
DWORD dwHotKey; //程序的热键关联,低位存储虚拟关键码(KeyCode),高位存储修改标志位(HOTKEYF_),当fmask不包括SEE_MASK_HOTKEY时该项被忽略
union{
HANDLEhIcon; //取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略
HANDLEhMonitor ;//将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略
}DUMMYUNIONNAME;
HANDLE hProcess; //指向新启动的程序的句柄。若fMask不设为SEE_MASK_NOCLOSEPROCESS则该项值为NULL。
//但若程序没有启动,即使fMask设为SEE_MASK_NOCLOSEPROCESS,该值也仍为NULL。
//如果没有新创建进程,也会为空
}SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
通过对比发现,代码又生成了一个参数为main的MEMZ进程,但与前几个不同的是,关键是紧接着调用了SetPriorityClass,当中对hProcess成员复制为0x80,该值意味着创建的进程将拥有最高的响应优先级,调至最高的目的是为了防止用户中断该进程并且优先占用内存CPU
最后,用ExitProcess函数结束自己的进程。
现在我们就可以知道6个MEMZ.exe进程是怎么来的了:最开始双击生成了一个原始进程,原始进程生成了5个watchdog进程和1个/main进程,然后原始进程迅速结束了自己,当再次打开任务管理器查看时,就存在了6个MEMZ.exe。
SetPriorityClass()优先权的意义通过微软可以得知:
Watchdog部分分析
CreateThread函数创建了一个线程,每一个进程都会创建一个线程,因此,对于5个MEMZ进程来说,就创建了5个线程。
跳转到sub_40114A处进行分析判断,看一下这个线程做了什么事情。
可以看到首先是调用三个函数获取进程路径。先使用LocalAlloc函数申请地址存放路径
再用GetCurrentProcess获取进程句柄,最后调用GetProcessImageFileNameA获取进程当前路径。
接着一个大的while循环把后面的代码都包了进去,注意该while循环的条件永远为真,说明是个死循环。在循环内部使用CreateToolhelp32Snapshot给进程拍快照,再用Process32FirstW和Process32NextW进行遍历,这都是非常常见的操作,我们在观察阶段查看导入表时也发现了这三个函数,这里就用上了。
当遍历完所有进程后,我们就统计出了MEMZ.exe的进程个数。然后最关键的地方来了,由于Sleep函数的存在,死循环每隔一段时间就能统计出当前MEMEZ.exe进程的个数并存放在v4变量中,然后先判断v4和v7的大小,再让v7保存v4的值。如此就形成了一个监测机制,v7永远只保存v4最大的值,一旦v4的值小于了v7就会被if语句监测到,并进入sub_401021子函数。只要MEMZ.exe进程数量减少,系统就会蓝屏重启,这就是它的监测原理。反过来我们可以推测sub_401021就是完成系统蓝屏重启功能的。
子函数sub_40114A分析完成之后,转到下一个子函数sub_401021
开头代码如下:
好家伙在这个函数开头,就利用dowhile循环连续创建了20个线程。StartAddress是新线程所执行的线程函数地址。这时候双击StartAddress准备去看这个线程做了什么事,但是双击过后却没有任何反应,报错发现原来是IDA的代码识别出现错误,为了不影响分析主线,直接按G输入地址4010FE就可以跳到StartAddress的代码。
SetWindowsHookEx和UnhookWindowsHookEx用于给窗口下钩子,干了什么事要到回调函数fn里去看。code==3表明目标窗口即将被创建,此时lParam表示该窗口的基本信息(坐标、大小等),修改这些信息可以在窗口真正创建之前生效,下方正是在随机修改窗口的位置。
打开sub_401A55子函数,发现该函数用于生成随机数。
在MessageboxB函数中,lpText参数存放的是一些消息,利用v3获取的随机数从26条消息中取出一条显示出来
在这里代码使用了SetWindowsHookEx函数给窗口下钩子,调回到fn函数进行查看。
通过阅读这段代码发现这一段代码主要是随机生成窗口,窗口的位置和大小都是随机生成的。也就是说该线程的作用主要是随机生成窗口,以及随机生成一些信息。
返回sub_401021函数查看其下半部分。
下半部分的代码主要是触发电脑关机,但其设置了两种触发形式,第一种是引发电脑蓝屏,另一种是强制退出Windows系统。
代码先加载了ntdll动态链接库,然后利用RtlAdjustPrivilege函数获取进程ACL的任意权限。该函数由于未在MSDN中公布,所以需要用GetProcAddress获取函数地址,间接调用。而NtRaiseHardError就会让电脑蓝屏,同样也需要间接调用。
后一种方式则是先通过一系列函数进行提权,然后用ExitWindowsEx函数退出Windows系统。
经过以上分析,发现sub_401021函数既负责生成大量窗口也用来实现强制关机。
Main部分
接下来的操作就是本病毒最核心的部分了,对MBR的操作以及让电脑出现总总异常,这里放一个对MBR的介绍,简单的说就是早期系统的一个系统引导代码,从Win8开始以后的系统基本上都不在使用MBR分区做为系统引导了,都开始使用GPT分区了。
将程序内的硬编码拷贝到申请的堆内存中去,然后再写入MBR区域,写入成功就弹出note.txt
每个线程的功能都不相同,具体的功能都是由某个特定的API来实现的,相对来说是比较好分析的,为了方便直观这里用思维导图来展示。
至此该病毒“彩虹猫MEMZ”全部分析完毕。
解决方案
1.不要打开不知名的下载软件和邮件附件
2.如果系统还能运行,先用查杀软件查杀后,重建MBR引导程序
3.如果系统不能运行,通过启动U盘运行系统,打开分区软件,选择“搜索分区”,之后点击“保存更改”,恢复被彩虹猫吞掉的所有分区,再进行引导修复,重建MBR,重启就可以进入系统,全部文件无损坏、丢失,无需重装系统、更换硬盘等。