MEMZ(彩虹猫)恶意程序全面分析
Sirius_v
2020年03月03日 20:02

        新人一枚,本次分析主要体现恶意代码分析的思想,注重于如何确定恶意程序有哪些功能模块,不会过度在意技术实现细节。本文如果有错误的地方,请大佬轻喷。

        注:本文仅在b站发布,转载请附上原文出处链接及本声明

        本次所用到的所有知识来源(参考):

              《汇编语言第三版》

              《加密与解密 第四版》

              《恶意代码分析与实战》

              《信息论与编码》

               Python 菜鸟教程

               恶意程序分析与高级对抗技术  -姜晔

              卡巴斯基-恶意软件分类:https://www.kaspersky.com.cn/resource-center/threats/malware-classifications

第一阶段:快速分析阶段:

MEMZ样本

       在初期拿到样本时,我们不能得知样本的黑白,面对可执行文件,最简单的处理办法就是直接在虚拟机中运行,来看看系统是否有异样发生。这个方法并不能够适用于多数情况,但对于本次样本的黑白判断就足够了。运行之后,很明显就是我们当年熟悉的彩虹猫木马。

        之所以将彩虹猫归属于木马,参考卡巴斯基发布的对木马的定义:Can’t self-replicate and often disguised as legitimate software.(这是在深入分析后得出的结果,该彩虹猫不会进行自我复制,传播)

        归类:Trojan.Win32.DiskWriter.A

第二阶段:基本分析阶段:

        批处理文件分析:

        文件的一开头我们就看到乱码,仔细观察后猜测为base64编码后的结果。使用Python,用正则表达式匹配乱码部分,进行base64解码。

Base64编码后的批处理命令

        解码后如下:我们发现相当多的由十六进制所表示的字符,这通常也是脚本类恶意程序经常使用的混淆手段,但是我们发现,诸如\x03、\x04、\x14之类的,这些ASCII码对于我们分析的意义都不大,甚至还有诸如\x90、\xe8这种已经超出了ASCII码所表示的范围

Base64解码后的批处理文件

        编写Python脚本,使用正则表达式匹配相应的字符串,进行去混淆操作,仅翻译在ASCII码范围内的十六进制字符,其余删除,去混淆后结果如下:多数情况操作还是无法识别。

去混淆后的批处理文件

        以上部分只能寄希望于行为分析了,目光转向批处理文件末尾,我们发现了js脚本,该脚本使用了混淆,插入了诸如^的字符,用于躲避较差杀软的检测。

        该批处理命令,将js代码,写入名为x.js的文件中,执行完x.js脚本,便删除,其中js脚本使用到了上述被混淆的批处理命令,但似乎没有什么特别的作用。(本人不会Java Script语言,只能读懂大概意思)

        同样我们发现了由通配符所指出的MEMZ.exe所在路径,所以我们可以猜测,上述批处理命令,是将恶意文件存放入C:\Users\Administrator\AppData文件夹下,最后一句是执行MEMZ.exe的命令,则猜测该批处理文件是彩虹猫病毒的启动器。

批处理文件尾部的JS脚本

        

        MEMZ程序本体的基本分析:

        使用 PEviewer ,PEID查看是否有加壳迹象,以及节外数据的存在:

                未发现加壳迹象,未发现节外数据存在

        使用IDA pro 查看MEMZ主体可打印字符串,以猜测程序功能,:

一些http链接:

一些HTTP链接(不是全部)

 cmd命令:

一些CMD常用的 命令

富有意义的字符串:

富有意义的字符串

       \\\\.\\PhysicalDrive0 

       \\note.txt

       Ntdll  通常如果一个程序主动加载Ntdll.dll,几乎就是恶意的

       RtlAdjustPrivilege 该函数是微软非公开的提权函数,可以绕过用户账户控制

       NtRaiseHardError 用于提权成功后制造蓝屏

        

        使用IDA pro 查看MEMZ主体导入表:(不截图,因为函数出现比较分散,整合结果)

提权:

       OpenProcessToken

       AdjustTokenPrivilege

       LookupPrivilegeValue

装载Ntdll,进行提权以及制造蓝屏:

       LoadLibraryA

       GetProcAddress

遍历进程:

       CreateToolhelp32Snapshot

       Process32FirstW

       Process32NextW

       OpenProcess

       GetCurrentProcess

       GetCurrentThreadID

Shell:

       ShellExcuteW

       ShellExcuteA

       ShellExcuteEXW

使用钩子:

       CallNextHookEx

       SetWindowsHookExW

       UnhookWindowsHookEx

       CreateWindowExA

       GetMessageW

       DispatchMessageW

       TranslateMessage

有意思的API:

       CommandLineToArgv

       CryptAcquireContext

       CryptGenRandom

       Sleep

       WriteFile 有可能往MBR中写入恶意代码

       PlaySoundA 发出声音

       行为分析:

       批处理文件行为分析:(用火绒剑进行监控,写下如下关键操作)

              在桌面上创建文件x与x.js,运行x.js文件。

              将MEMZ.exe加入环境变量。

              运行MEMZ.exe

              x.js行为分析:

              在桌面上创建z.zip文件,将x文件中的数据写入z.zip

              将MEMZ复制到C:\Users\Mark42\AppData\Roaming下,并命名为MEMZ.exe

              删除z.zip、x、x,js文件

       MEMZ.exe行文分析:(由于MEMZ程序运行后,直接干扰了用户使用,很显然无法使用火绒剑进行行为跟踪,所以我尽可能的记录MEMZ所造成的影响,并且做出功能模块的猜测)

MEMZ运行一段时间后的虚拟机截图

              运行MEMZ.exe后,MEMZ创建了多个进程

              如果关闭任意MEMZ进程,则强制蓝屏,对应基本分析中的NtRaiseHardError函数

              弹出一个记事本,显示计算机已经被破坏的句子

              鼠标光标被控制在左上角。

              每隔一段时间打开InternetExplore访问我们在基本分析中看到的网址。

              电脑一直发出声音,可能相对应在基本分析中的PlaySound函数。

              并且桌面颜色一直在变化,成镜像的形式

              MessageBox不停的弹窗,提示一些嘲讽信息

              有记事本,设备管理器,设备管理器的打开,很显然对应我们在基础分析当中看到的cmd命令

              重启计算机后,看到一直猫,并且重复一段音乐,显然操作系统引导过程被破坏

              由于无法进行更详细的行为分析,直接进入深入分析阶段

第三阶段:深入分析阶段:

        确认该程序是否有使用混淆技术,即恶意程序本身的一部分代码是被加密过的,使用IDA pro熵插件,寻找高熵值的位置。根据信息论,一个段中某块数据的信息熵越高,则说明,该块数据越混乱,则极有可能是加密数据。

信息熵计算公式,其中pi为某字符出现的概率

        例如我选择一块64字节的数据,如果计算的信息熵H(X)≈6则推出pi≈1/64。那么就说明这块数据几乎每个字符都不一样。

代码节信息熵,正常,其余部分的信息熵就不再展示,都是正常的

        即使如此,我们也不能够认定该恶意程序没有使用混淆技术,恶意程序可能使用的混淆技术比较简单,也许就是使用了一个xor 指令,所以我们搜寻xor指令。我们发现所有的xor指令都是相同寄存器直接的异或,这些都是寄存器清零操作。

        综上所述,该MEMZ木马,存在混淆的概率极低。

xor指令查找

        先使用IDA pro 对字符串的引用进行定位,首先给一些简单的功能函数命名,方便接下来的分析。也就是分而治之的方法

        例如,在基本分析阶段,我们看到许多http链接,我们通过这些http链接的交叉引用,分析相应函数的作用,以及对相关变量,函数,进行命名。我们看到了ShellExcuteA函数的调用,传入参数open,以及我们基本分析所见的http链接,cmd命令。于是这个函数的作用就非常的了然了,用于弹出浏览器窗口。因为多数http链接都是无意义的。

弹出浏览器窗口的代码

        依然我们继续从字符串入手,根据这些字符串的交叉引用,定位到函数,我们看到了PlaySoundA的API函数,所以标记函数为:Make_A_Sound

声音有关的字符串

发出声音的函数

        根据一些嘲讽的句子的交叉引用我们再次定位到一个函数,我们发现SetWindowsHookExW、UnhookWindowsHookEx,就是知道该函数(CreateHook)是用来创建钩子,MessageBoxA,告诉我们会弹出嘲讽的句子。其中要挂钩的函数被我标明为HookFunction。

我标记为CreateHook的函数

        在该函数的左侧,我们发现了创建线程的句子,用来创建20个线程,都是CreateHook。

创建线程

寻找未公开的API函数

        如果这两个函数未被找到,或者执行失败,则进行关闭系统权限的申请,最后调用ExitWindows进行关机。

申请关闭系统权限,关机

         字符串使用完毕了,接下来我们从一些特定的API出发,例如CreateToolhelp32Snapshot,检查交叉引用,定位到调用它的函数,我将其命名为Monitoring_Process,很显然在行为分析中,我们得知MEMZ会创建多个进程,那么我们就可以知道,这个部分的代码,就是用来互相监控对方,只要其中一个进程被终止,则会调用上述我们已经分析完成的函数,弹窗,强制蓝屏

监控部分的代码

监控部分的代码,已经调用用于蓝屏,关机的函数(CreateThread_and_AdjustPrivilege)

        命名功能函数,变量,或者较短函数的过程结束,该过程是为了方便接下来的分析。

        进入OllyDbg进行调试,配合IDA pro进行代码分析,Ollydbg的跟踪过程,基本不做截图。

        粗略浏览MEMZ程序的开始代码,我们发现,该程序,可以有参数也可没参数。并且有参数时,有两种参数。其中一个参数是/watchdog

程序根据命令行传入的参数,执行不同功能的代码

        当程序无参数传入时,创建五个进程,传入/watchdog参数,最后再创建一个进程,传入/main参数,我们有理由相信,传入/main参数的进程,将会修改主引导记录(MBR)。剩下传入的参数为/watchdog,仅仅只是互相监控进程,如果有任意一个被终止,就执行强制蓝屏代码,有兴趣的小伙伴自己分析,在此不再赘述。

无参数传入的程序执行流程

        我们用Ollydbg,给调试进程传入/main参数,跟踪到相应代码,我们发现程序打开了物理磁盘

打开物理磁盘

        并且将我标记的Boot_Code区域的代码写入磁盘。

        将恶意代码直接覆盖主引导扇区。

用恶意程序,直接覆盖MBR引导

         通过Ollydbg,我们可以直接分析,写入引导扇区的代码,在此就不再说明,大家有兴趣可以自行分析。

写入引导扇区的代码

        本次分析中,省略了一些MEMZ的小模块,比如光标控制,模拟键盘输入,桌面变色等等,有兴趣大家自行分析,较为简单。

第四阶段:编写启发特征,用于静态启发检测:

        对于MEMZ的批处理文件:我们知道一般来说正常的批处理文件,是不会将命令进行加密处理变为不可读的状态,所以我编写以下正则表达式用作启发特征:

Regular_Expression = r'echo ([\d\w\+/=]+)>&#​39;

        但是为了降低误报率,我们再提取一个特征,用来匹配执行js脚本然后删除的操作

Regular_Expression_Two = r'cscript\s(.+\.js)\s>NUL\s2>NUL\s+del\s\1\s>NUL\s2>NUL' 

Regular_Expression_Two_compiled = re.compile(Regular_Expression_Two,re.I)

        以上特征编写的并不是很好,可以进行改进,大佬轻喷。

        对于MEMZ的本体:

                我个人认为最好取特征的位置是,写入引导的恶意代码

                其次为了降低误报率,这些字符串的同时出现,也可以作为一条启发特征

可以用于编写特征的位置

                留给大家自己探索。

        非常感谢你们能够阅读到这里。