彩虹猫IDA分析记录

世上唯一不能复制的是时间,唯一不能重演的是人生,唯一不劳而获的是年龄。该怎么走,过什么样的生活,全凭自己的选择和努力。人生很贵,请别浪费!与智者为伍,与良善者同行。彩虹猫IDA分析记录,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

彩虹猫分析

彩虹猫分析过程,一天半时间算是分析完了,有一部分的代码IDA没有显示出来,所以得动态分析

概述

程序分为三种启动方式

  • 一种是不带任何参数的启动

  • 第二种是带 /main 参数启动

  • 第三种是带/watchdog参数启动

image-20200301011629363

这部分是每个启动方式都会执行的代码

  1. 通过GetSystemMetrics()获取屏幕的宽高 但之后似乎并没有用到这部分?
  2. 然后通过GetCommandLineW()获取命令行参数
  3. 最后再通过CommandLineToArgvW()函数解析参数得到参数数组(可以按照数组方式使用)
  4. 根据参数确定两种带参执行行为

无参启动

首先用户在运行MEMZ.exe文件之后 是不带参数的执行, 我猜我得到的样本应该是被大佬修改过的,会进行两次提醒,然后病毒代码才会真的开始执行

image-20200301011052554

上图是不带参数执行的代码

  1. 首先申请一段内存,之后通过GetModuleFileNameW函数获取到自己的可执行文件文件名
  2. 然后使用循环启动5个带/watchdog参数的副本
  3. 接下来构造SHELLEXECUTEINFOW 结构体 用于创建一个副本,并且带/main参数,与本身不同的是,会提高CPU的优先级,占用更多CPU时间,位后面占用系统资源做铺垫
  4. 然后退出进程

/main参数启动

image-20200301012557618

image-20200301012650842

该启动方式主要作用是为了将MBR扇区引导部分覆盖掉,并且写入重启之后的彩虹猫动画代码

  1. 这里通过APICreateFileA打开了磁盘,如果打开失败会退出,程序还是比较健壮的
  2. 接下来就是准备写入MBR的数据了,首先是304字节的引导程序(见下方)
  3. 然后往后偏移510字节,就是1920字节的第二段,要注意动画程序最前面是 AA55用来给MBR做结尾标志,所以前面总共512字节
  4. 最后将组合好的数据通过WirteFile写入磁盘,此时重启电脑已经挂了
  5. 创建一个note.txt文件并且写入嚣张的字符串,然后打开notepad显示这个内容
  6. 定义一个结构体,其中一个函数指针,所指向的函数,作用是得到一个随机数,然后随机启动一个程序或者网址

最终返回一个随机的整数,但是不明白为什么会有一个式子没想明白

image-20200301155538554

获取随机数的函数我也是使用了CryptGenRandom() 不明白为什么获取一个随机数这么麻烦

可能会随机到的网址和程序,很多

image-20200301155649593

  1. 通过循环创建了十个线程,线程函数如下,执行了传进来的指针函数,但是没看懂这个和上面那个指针函数是不是同一个,因为正常来说,传递进来的结构体应该第一步是还原成一个结构体,而这里直接当作函数指针用了,没看懂,而且参数数量对不上,但是代码至少是执行了

image-20200301155915765

  1. 创建完十个线程之后,就进入死循环状态,主线程不退出上面创建的子线程就不会退出

/watchdog参数启动

image-20200301012205830

该启动方式如同他的名字一般 (看门狗) ,是用来检测用户是否主动结束自身进程的,若结束了,则开始破坏用户电脑(其实/main 参数已经把MBR扇区覆盖了)

  1. 创建一个新的线程,经过进入分析,得知该进程会监控进程列表,

image-20200301162611799

  1. 需要注意的是第18行的sleep()睡眠了一秒,目的应该是为了等待/main运行完副本
  2. 一个死循环,作用是遍历所有的进程,然后判断是不是进程的副本,如果发现副本的数量减少了(也即是被任务管理器关闭了),则执行 sub_401021(),经过分析,这个函数是实现了蓝屏和重启

image-20200301162958279

  1. 进入这个函数之后,首先会创建20个线程,但是线程函数不知道是那个,不过根据我运行病毒的结果来看,应该是弹出的那几个警告窗口。
  2. 加载ntdll 获取 RtlAdjustPrivilege()NtRaiseHardError()两个函数,在查询这两个函数的时候,注意到NtRaiseHardError()在上一个函数提权之后执行会导致蓝屏(应该是操作系统的bug win10不见的有效)
  3. 判断有没有加载成功那两个函数,成功了就尝试造成蓝屏,失败了继续
  4. 打开自己的进程,获取访问令牌,然后通过LookupPrivilegeValueW()获取到关机权限(大佬写的程序就是不一样,我的话直接system(“shutdown -r -t 0”)😉
  5. AdjustTokenPribileges()通知系统权限已经更改
  6. 通过ExitWindowsEx()退出,指的注意的是,根据参数判断是强制重启
  7. 返回到主程序30行,这里创建了一个结构体,通过强转之后结果应该是 00000030 但是查询了这个结构体之后,并没有弄清楚他的意图。
  8. 31行这里放进去了一个窗口回调函数sub_401000(),但是讲道理,我没弄懂这样写法是怎么回事…

image-20200301164134942

  1. 从函数参数上面判断,这应该是处理下面要注册的窗口的事件函数,作用依旧是判断是否会被关闭,如果用户意图关闭,就执行第三步那个蓝屏函数。

  2. 然后注册窗口类,但是参数是强转的SHELLEXECUTEINFOW结构体,经过查询我实在不知道这两个结构体的相似处,但是结合上面对lpVerb成员的赋值,觉得确实有可能,稍后研究一些这样的写法

  3. 创建一个窗口,但是没有显示出来

  4. 一个循环,其中获取一条消息,通过 如果遇到WM_QUIT消息或者发生错误就会退出循环(应该还是防止关闭?)

  5. 循环中两个函数,一个作用是将按键消息转变为字符消息,另一个是分发消息给窗口程序,这样窗口的回调函数可以处理相关消息,正常来说这个循环不会终止,但是为什么写这个有点懵逼。觉得可能是为了做出死循环 但是又不会让程序未响应,类似的手段在Qt中使用过。稍后再测试正常情况下循环会不会结束

  6. 如果while()退出了,则会执行到/main的代码

MBR引导程序和动画程序

写入的程序分为两段

第一段 引导代码

长度是304 这个应该是引导代码

image-20200229163753462

第二段 动画代码

长度是 1952 这个应该是彩虹猫动画程序本体

image-20200229163706028

这个地址开始 往下很长一段都是内容 要注意 那个 AA55 是MBR扇区的结束标志

这里据我了解,MBR扇区总共512字节

image-20200229163817418

image-20200229163913155

其他函数

按照执行过程,分析了上面的代码,但是还有些代码并被调用,IDA中没有找到调用他们的代码

扭曲桌面

image-20200301172554048

IDA的函数列表中有这个函数 但是 没有找到调用他的地方 代码实现效果 恶搞效果满满 啊哈哈哈!!

image-20200301184235180

扰乱鼠标

image-20200301172648323

实际运行的时候有运行到,但是IDA中没有找到调用它的代码

钩子函数

image-20200301174140432

  1. 设置了一个钩子,钩子类型是WH_CBT

WH_CBT Hook

在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:

1)激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;

2)完成系统指令;

3)来自系统消息队列中的移动鼠标,键盘事件;

4)设置输入焦点事件;

5)同步系统消息队列事件。

Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。

  1. 把窗口位置弄乱 (具体效果我得再运行一次)

image-20200301180353407

桌面绘制图标

image-20200301182930239

从代码来看,运行之后鼠标所在之处都是叉叉图标 下面是测试代码(学到了 : – )

#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;
}

image-20200301183114108

枚举所有窗口

image-20200301185221424

但是调用他的代码没找到,所以,应该是再某个线程中,枚举完了之后 每个都来扭曲一下 改变大小什么的

百花齐放的效果哇

桌面负片效果显示

image-20200301185615487

跑完之后 桌面变成负片显示… 像是见了鬼一样

播放系统音效

image-20200301190319609

强烈怀疑这个应该是在某个循环里面的 然后 就像是一个神奇的曲子一样

乱七八糟输入东西

image-20200301190714513

提交消息到窗口 目测应该会乱输入东西

额外的

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!