彩虹猫IDA分析记录
彩虹猫分析
彩虹猫分析过程,一天半时间算是分析完了,有一部分的代码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
作者:cjdty
出处:https://www.cnblogs.com/cjdty/p/12387772.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库