彩虹猫分析
彩虹猫分析过程,一天半时间算是分析完了,有一部分的代码IDA没有显示出来,所以得动态分析
概述
程序分为三种启动方式
-
一种是不带任何参数的启动
-
第二种是带
/main
参数启动 -
第三种是带
/watchdog
参数启动
这部分是每个启动方式都会执行的代码
- 通过
GetSystemMetrics()
获取屏幕的宽高 但之后似乎并没有用到这部分? - 然后通过
GetCommandLineW()
获取命令行参数 - 最后再通过
CommandLineToArgvW()
函数解析参数得到参数数组(可以按照数组方式使用) - 根据参数确定两种带参执行行为
无参启动
首先用户在运行
MEMZ.exe
文件之后 是不带参数的执行, 我猜我得到的样本应该是被大佬修改过的,会进行两次提醒,然后病毒代码才会真的开始执行
上图是不带参数执行的代码
- 首先申请一段内存,之后通过
GetModuleFileNameW
函数获取到自己的可执行文件文件名 - 然后使用循环启动5个带
/watchdog
参数的副本 - 接下来构造
SHELLEXECUTEINFOW
结构体 用于创建一个副本,并且带/main
参数,与本身不同的是,会提高CPU的优先级,占用更多CPU时间,位后面占用系统资源做铺垫 - 然后退出进程
带/main
参数启动
该启动方式主要作用是为了将
MBR扇区
引导部分覆盖掉,并且写入重启之后的彩虹猫动画代码
- 这里通过API
CreateFileA
打开了磁盘,如果打开失败会退出,程序还是比较健壮的 - 接下来就是准备写入MBR的数据了,首先是
304字节
的引导程序(见下方) - 然后往后偏移510字节,就是1920字节的第二段,要注意动画程序最前面是
AA55
用来给MBR做结尾标志,所以前面总共512字节 - 最后将组合好的数据通过
WirteFile
写入磁盘,此时重启电脑已经挂了 - 创建一个
note.txt
文件并且写入嚣张的字符串,然后打开notepad
显示这个内容 - 定义一个结构体,其中一个函数指针,所指向的函数,作用是得到一个随机数,然后随机启动一个程序或者网址
最终返回一个随机的整数,但是不明白为什么会有一个式子没想明白
获取随机数的函数我也是使用了CryptGenRandom()
不明白为什么获取一个随机数这么麻烦
可能会随机到的网址和程序,很多
- 通过循环创建了十个线程,线程函数如下,执行了传进来的指针函数,但是没看懂这个和上面那个指针函数是不是同一个,因为正常来说,传递进来的结构体应该第一步是还原成一个结构体,而这里直接当作函数指针用了,没看懂,而且参数数量对不上,但是代码至少是执行了
- 创建完十个线程之后,就进入死循环状态,主线程不退出上面创建的子线程就不会退出
带/watchdog
参数启动
该启动方式如同他的名字一般 (看门狗) ,是用来检测用户是否主动结束自身进程的,若结束了,则开始破坏用户电脑(其实
/main
参数已经把MBR扇区覆盖了)
- 创建一个新的线程,经过进入分析,得知该进程会监控进程列表,
- 需要注意的是第18行的
sleep()
睡眠了一秒,目的应该是为了等待/main
运行完副本 - 一个死循环,作用是遍历所有的进程,然后判断是不是进程的副本,如果发现副本的数量减少了(也即是被任务管理器关闭了),则执行
sub_401021()
,经过分析,这个函数是实现了蓝屏和重启
- 进入这个函数之后,首先会创建20个线程,但是线程函数不知道是那个,不过根据我运行病毒的结果来看,应该是弹出的那几个警告窗口。
- 加载
ntdll
获取RtlAdjustPrivilege()
、NtRaiseHardError()
两个函数,在查询这两个函数的时候,注意到NtRaiseHardError()
在上一个函数提权之后执行会导致蓝屏(应该是操作系统的bug win10不见的有效) - 判断有没有加载成功那两个函数,成功了就尝试造成蓝屏,失败了继续
- 打开自己的进程,获取访问令牌,然后通过
LookupPrivilegeValueW()
获取到关机权限(大佬写的程序就是不一样,我的话直接system(“shutdown -r -t 0”)😉 AdjustTokenPribileges()
通知系统权限已经更改- 通过
ExitWindowsEx()
退出,指的注意的是,根据参数判断是强制重启 - 返回到主程序30行,这里创建了一个结构体,通过强转之后结果应该是
00000030
但是查询了这个结构体之后,并没有弄清楚他的意图。 - 31行这里放进去了一个窗口回调函数
sub_401000()
,但是讲道理,我没弄懂这样写法是怎么回事…
-
从函数参数上面判断,这应该是处理下面要注册的窗口的事件函数,作用依旧是判断是否会被关闭,如果用户意图关闭,就执行第三步那个蓝屏函数。
-
然后注册窗口类,但是参数是强转的
SHELLEXECUTEINFOW
结构体,经过查询我实在不知道这两个结构体的相似处,但是结合上面对lpVerb
成员的赋值,觉得确实有可能,稍后研究一些这样的写法 -
创建一个窗口,但是没有显示出来
-
一个循环,其中获取一条消息,通过 如果遇到
WM_QUIT
消息或者发生错误就会退出循环(应该还是防止关闭?) -
循环中两个函数,一个作用是将按键消息转变为字符消息,另一个是分发消息给窗口程序,这样窗口的回调函数可以处理相关消息,正常来说这个循环不会终止,但是为什么写这个有点懵逼。觉得可能是为了做出死循环 但是又不会让程序未响应,类似的手段在Qt中使用过。稍后再测试正常情况下循环会不会结束
-
如果
while()
退出了,则会执行到/main
的代码
MBR引导程序和动画程序
写入的程序分为两段
第一段 引导代码
长度是304 这个应该是引导代码
第二段 动画代码
长度是 1952
这个应该是彩虹猫动画程序本体
这个地址开始 往下很长一段都是内容 要注意 那个 AA55 是MBR扇区的结束标志
这里据我了解,MBR扇区总共512字节
其他函数
按照执行过程,分析了上面的代码,但是还有些代码并被调用,IDA中没有找到调用他们的代码
扭曲桌面
IDA的函数列表中有这个函数 但是 没有找到调用他的地方 代码实现效果 恶搞效果满满 啊哈哈哈!!
扰乱鼠标
实际运行的时候有运行到,但是IDA中没有找到调用它的代码
钩子函数
- 设置了一个钩子,钩子类型是
WH_CBT
WH_CBT Hook
在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:
1)激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;
2)完成系统指令;
3)来自系统消息队列中的移动鼠标,键盘事件;
4)设置输入焦点事件;
5)同步系统消息队列事件。
Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。
- 把窗口位置弄乱 (具体效果我得再运行一次)
桌面绘制图标
从代码来看,运行之后鼠标所在之处都是叉叉图标 下面是测试代码(学到了 : – )
#include <stdio.h> #include <windows.h> #include <iostream> using namespace std; int main() { struct tagPOINT Point; int v1 = GetSystemMetrics(11) / 2; int v2 = GetSystemMetrics(12) / 2; //LPCWSTR wstr = (LPCWSTR)0x7F01; cout << v1 << endl; HWND hWnd = GetDesktopWindow(); HDC v3 = GetWindowDC(hWnd); HICON v4 = LoadIconW(0, (LPCWSTR)0x7F01); GetCursorPos(&Point); DrawIcon(v3, v1, v2, v4); getchar(); ReleaseDC(hWnd, v3); return 0; }
枚举所有窗口
但是调用他的代码没找到,所以,应该是再某个线程中,枚举完了之后 每个都来扭曲一下 改变大小什么的
百花齐放的效果哇
桌面负片效果显示
跑完之后 桌面变成负片显示… 像是见了鬼一样
播放系统音效
强烈怀疑这个应该是在某个循环里面的 然后 就像是一个神奇的曲子一样
乱七八糟输入东西
提交消息到窗口 目测应该会乱输入东西
额外的
win10运行
手头暂时没有win10的虚拟机,所以我猜测一下 GPT分区运行之后,重启应该不能显示那个动画了,
在支持从GPT启动的操作系统中,这里也用于存储第一阶段的启动代码。在这个MBR中,只有一个标识为0xEE的分区,以此来表示这块硬盘使用GPT分区表。
在使用MBR/GPT混合分区表的硬盘中,这部分存储了GPT分区表的一部分分区(通常是前四个分区),可以使不支持从GPT启动的操作系统从这个MBR启动,启动后只能操作MBR分区表中的分区。
原文链接:https://blog.csdn.net/li33293884/article/details/50562527
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/225595.html