彩虹猫分析

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

概述

程序分为三种启动方式

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

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

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

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

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

无参启动

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

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

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

/main参数启动

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

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

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

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

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

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

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

/watchdog参数启动

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

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

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

  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(),但是讲道理,我没弄懂这样写法是怎么回事...

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

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

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

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

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

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

MBR引导程序和动画程序

写入的程序分为两段

第一段 引导代码

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

第二段 动画代码

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

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

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

其他函数

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

扭曲桌面

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

扰乱鼠标

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

钩子函数

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

WH_CBT Hook

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

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

2)完成系统指令;

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

4)设置输入焦点事件;

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

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

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

桌面绘制图标

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

#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

彩虹猫IDA分析记录的更多相关文章

  1. IDA 操作记录

    IDA 操作记录 1.加载文件 windows 下,用ida加载文件后,会在该文件同目录下生成几个文件,含义如下: .id0 : 二叉树数据库 .id1:    文件包含描述每个程序字节的标记 .na ...

  2. IDA分析脱壳后丢失导入表的PE

    1. 问题 一些程序经过脱壳后(如用OD的dump插件),一些导入表信息丢失了,导致拖入IDA后看不到API的信息(如右图所示,第一个红圈处实际是GetCurrentProcessId),给分析造成极 ...

  3. Fine报表权限流程分析记录

    Fine报表权限流程分析记录 URL访问三种类型的报表:第一个:BI报表 例如: http://192.25.103.250:37799/WebReport/ReportServer?op=fr_bi ...

  4. PostgreSQL的基础数据类型分析记录-转

    src:http://www.codeweblog.com/postgresql%E7%9A%84%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E ...

  5. 获取登录验证码失败及前后端不同域导致session丢失问题分析记录

    前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...

  6. scratch制作彩虹猫病毒模拟器

    scratch制作彩虹猫病毒模拟器 hello,大家好. 编程慢慢更加接近生活,甚至小孩也开始学了,比如scratch编程,小编今天就带了一件作品(彩虹猫病毒模拟器) 我们先看一下效果| 做的还可以, ...

  7. sizzle分析记录:关于querySelectorAll兼容问题

    querySelector和querySelectorAll是W3C提供的新的查询接口 目前几乎主流浏览器均支持了他们.包括 IE8(含) 以上版本. Firefox. Chrome.Safari.O ...

  8. Java GC分析记录

    Java GC记录 近来.项目没有特别忙碌的时候,抽空看了下生产环境的项目运行状况,我们的项目一直运行速度不是很快,偶尔会出现卡顿的现象,这点给人的体验感觉也就不那么好了.先抛个测试环境截图(生产环境 ...

  9. Eureka 分析记录

    本文是一些记录和想方法,分析大部分来自 http://www.iocoder.cn/Eureka/ 感兴趣的可以去看一下.

  10. linux日志朔源分析记录

    lastlog 记录用户最后一次登录情况 只有root最近登录过 lastlog -u 用户名或者uid uid 直接在passwd文件中的低三位可以看到 lastb 记录用户用户登录失败的用户记录, ...

随机推荐

  1. Istio安装和部署

    Istio的版本对k8s的版本是有要求的,不兼容的版本会引发一些隐蔽的错误,安装前先参考下图 版本 目前支持 发行日期 停止维护 支持的 Kubernetes 版本 未测试,可能支持的 Kuberne ...

  2. 小记录 单选框的注意点 html中字符串拼接 el-upload手动上传 表格跳转 v-for动态添加背景色 控制label标签于文本框之间的间距

    在element-ui中 单选框的v-model的值最好是一个字符串 否者可能不能够进行数据回填哈 单选框 的类型必须是字符串类型哈 在elemnet-ui中 如果你想从A页面拿到B页面中的值 可以有 ...

  3. 【笔记】学到几个 golang 代码小技巧

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 从这篇文章学到:10个令人惊叹的Go语言技巧,让你的代码更 ...

  4. docker容器中部署 kafka 和 elk

    1.下载zookeeper docker pull wurstmeister/zookeeper 2.下载kafka docker pull wurstmeister/kafka:2.11-0.11. ...

  5. PDF标准详解(一)——PDF文档结构

    已经很久没有写博客记录自己学到的一些东西了.但是在过去一年的时间中自己确实又学到了一些东西.一直攒着没有系统化成一篇篇的文章,所以今年的博客打算也是以去年学到的一系列内容为主.通过之前Vim系列教程的 ...

  6. vim 从嫌弃到依赖(23)——最后的闲扯

    截止到上一篇文章,关于vim的基础操作都已经讨论完了,这篇我主要就是闲扯,瞎聊.就想毕业论文都有一个致谢一样,这篇我们就作为整个系列的致谢吧 学习vim到底能给我们带来什么 学习vim到底能给我们带来 ...

  7. centos环境下MySQL8.0.25离线升级至8.0.32

    环境 centos7 mysql8.0.25 下载新版本mysql 下载地址:https://dev.mysql.com/downloads/mysql/ 升级 备份数据 先保存原始数据,进入mysq ...

  8. SpringBoot实现统一异常处理

    目录 前言 实现步骤 定义统一响应对象类 定义业务异常枚举接口和实现 定义业务异常基类 定义全局异常处理切面 测试和验证 总结 前言 近日心血来潮想做一个开源项目,目标是做一款可以适配多端.功能完备的 ...

  9. DHCP的安装与配置

    一:前期准备 1.打开windows虚拟机,使用仅主机模式 (虚拟机(M)→设置(S)→网络适配器) 2.修改Windows ip可选范围为192.168.1.204到192.168.1.207 对应 ...

  10. vuecli 自动转换小文件为 base64 格式,如何关闭?

    1. 问题 最近在写 vue 项目时,发现稍微小一点的静态资源,例如字体文件, 图片都被自动转换为 base64 格式了. 在网上搜索时基本都是去配置 url-loader ,配置后提示:Can't ...