Что такое криптор вирусов

Обновлено: 28.03.2024

Ходит слух, будто некоторые программисты не очень хотят, чтобы сигнатурный анализ продуктов деятельности других кодеров шарил по сокровенным местам их творений. Чтобы их скрыть, они пользуются крипторами, которые традиционно написаны на языках более-менее низкого уровня. А что, если попробовать сишарп? В конце концов, 2013 год на дворе!

WARNING!

Вся информация представлена исключительно в образовательных целях. Автор и редакция не несут никакой ответственности за ее противозаконное использование!

Для начала вкратце освежим в памяти теорию. Для этого дадим определения тому, с чем мы имеем дело.

Выделяют следующие виды крипторов:

  • Static (стаб-код запуска одинаков всегда);
  • Polymorph (стаб-код запуска всегда разный).

Запуск в них может производиться двумя способами:

  • Scantime (запись расшифрованного файла на HDD, запуск);
  • Runtime (расшифровка и запуск производятся в памяти).

Ну что, теорию повторили, направление выбрали, поехали.

Scantime Crypter

Итак, первый на очереди Scantime, который для запуска программы вынужден предварительно записать ее на HDD. Запускаем Visual Studio и открываем проект из архива Csharp_ScanTime_Temp.rar. Два раза нажимаем на Form1.cs и смотрим на красивый GUI-интерфейс нашей программы (рис. 1), код обработчиков доступен по двойному нажатию на элементы управления.

Рис. 1. Шикарный дизайн нашего приложения. Готов побеждать в государственных тендерах!

Рис. 1. Шикарный дизайн нашего приложения. Готов побеждать в государственных тендерах!


Другие статьи в выпуске:

Всемогущий Temp

Сделаем так, чтобы при открытии нашей программы криптованный файл попадал в папку временных файлов %temp%. Открываем стаб, а точнее — текстовый файл Source из архива Csharp_ScanTime_Temp.rar. Окидываем беглым взглядом код и понимаем, что в целом мы производим практически те же (за некоторым исключением) действия, но в обратном порядке. У нас вызывается ResourceManager, задается имя вложенного ресурса и используемый алгоритм шифрования с ключом RC4KEY. Результат этих действий сохраняется в переменную массива байтов b, он и становится тем самым файлом, защиту которого мы организовывали. Осталось записать его и запустить. Для этого воспользуемся классом Path.GetTempPath(), который вернет нам актуальный для данной машины путь к временной папке в переменную string "nameA", а для удобства сразу допишем подходящее нам имя будущего файла Your_File.exe. Байты есть, полный путь готов (включая имя), давай же скорее писать! Для этого вызываем метод WriteAllBytes класса File, передавая ранее указанные параметры в виде аргументов. Последней строчкой кода будет Process.Start(nameA), который и запустит наш процесс.

NTFS-потоки

Открываем второй архив под именем Csharp_SanTime_NTFS.rar, смотрим файл Source. И видим почти ту же самую картину, за исключением того, что размер стаба увеличился более чем в два раза. А все потому, что там используются API-функции и их полный код обязан присутствовать в листинге. Разберем все по этапам:

  1. Вместо одного полного имени файла мы задаем еще одно. Это имя нашего потока, которое будет записано через двоеточие, что в итоге даст такой результат: JustTempFile.tmp:YourFile.exe.
  2. Запись осуществляется при помощи класса PInvokeWin32API.WriteAlternateStreamBytes(nameA, NTFSName, b), в качестве аргументов он принимает полное имя файла, имя потока и сами байты, которые требуется записать.
  3. Запуск Process.Start(),т которым здесь не отделаешься, поскольку данный способ не сработает на Windows 7 и выше (висту не тестировал). Выход из ситуации предоставил могучий API, вызывается он строкой StartNTFSProcess.Start(nameA + ":" + NTFSName), где и происходит обращение к именованному потоку.
  4. Выдерживаем секундную паузу и удаляем файл File.Delete(nameA), для глаза эта операция незаметна, и папка %temp% кажется нетронутой. Процесс работает исправно, но на диске уже ничего нет.

Рис. 2. Папка temp из способа с NTFS-потоками

Рис. 2. Папка temp из способа с NTFS-потоками

Runtime Crypter

Как делают многие

Открываем файл проекта из архива Csharp_RunTime_Simple.rar, смотрим Source.

Этот код запустит наше приложение из памяти, минуя HDD и сигнатурный анализ антивируса. Протестируем на работающем антивирусе… ого, не сработало! В чем проблема? Хм. проблема в пароле, точнее, в том, что он хранится в открытом и доступном для статического анализа виде. А это значит, что мы подошли к самому интересному и ключевому моменту статьи.

Как сделаем мы

Открываем проект файла из архива Csharp_RunTime_Hard.rar и наблюдаем большие изменения в программе.

Рис. 3. Результат работы криптора

Рис. 3. Изменён интерфейс - добавлен новый функционал

Теперь мы можем менять сведения о сборке и наконец-то дописали код для иконки. Проблема решена, пароль в стабе не видно! Хе-хе.

Вот так выглядит работа усложненного стаба: берем файл, шифруем, делим на части, шифруем части разными паролями и переворачиваем некоторые из них. Сохраняем все это в файл Source. При запуске такого стаба он проделает все эти операции наоборот и практически мгновенно, благодаря многопоточности и хеш-суммам для контроля правильной расшифровки байт. Вот как это выглядит:

Первой строкой получаем случайный мастер-пароль, затем шифруем им выбранный файл, делим его длину на 4 (если он нечетный — дописываем один пустой байт). Создаем массив, равный размеру одной этой части, и при помощи Array.Copy() поэтапно копируем в него шифрованные байты. Вычисляем MD5-хеш Convert.ToBase64String() и повторно шифруем этот кусок новым паролем. После чего он готов к записи в стаб.

Самое главное в крипторе посмотрели, теперь рассмотрим краткую выдержку из файла стаба:

В результате работы этого кода мы создаем новый поток, всего их будет пять. Первые четыре выполняют расшифровку записанных частей, для чего они каждый раз, подбирая пароль, сверяют полученный хеш строки с правильным. По окончании этого процесса управление возвращается главному потоку, где далее происходит переворачивание некоторых байт классом Array.Reverse() и склейка в Array.Copy(). Все, байты готовы, для запуска используется финальный пятый поток, выполняющий System.Reflection.Assembly.Load(), как и в первом случае (если стаб не стартует, криптуем файл заново).

Проверяем VirusTotal’ом

Рис. 4. VirusTotal до Рис. 5. VirusTotal после

Заключение

Web мы спасли от антивирусов несколько месяцев назад. Это было нетрудно — область относительно новая, не освоенная. С исполнимыми же файлами антивирусы борются уже десятилетиями. Побороть EXE-модуль будет сложнее, но… мы справимся :).

Выпуск 1. Ознакомительный

И найти хорошего криптора ой как сложно.

Но решение проблемы есть! Как мы знаем, антивирусные компании обмениваются технической информацией и создают специальные ресурсы, посредством которых мы сами отсылаем им сэмплы (типа VirusTotal’а). Но ведь и вирмейкеры тоже могут обмениваться информацией! Необязательно палить приватные мазы — публичные технологии тоже сгодятся. Например, было бы круто, если бы в каком-то одном месте лежали функции для генерации PE-файла, генерации импорта, шифрования ресурсов, рабочие функции определения SandBox’ов, тогда мы могли бы создавать крипторы так же непринужденно, как домики из кубиков Лего.

Кроме того, в решении проблемы здорово помогло бы использование высокоуровневых языков программирования. В паблике сейчас валяются исходники крипторов на С++ или VisualBasic’е, но ведь от этого проще не становится, поскольку разобраться в написанном коде — ой как непросто. На Python’е все выглядит в разы лучше, поэтому именно его мы сегодня и будем использовать. В общем, заложим фундамент этой благородной миссии. Присоединяйся!


Выпуск 2. PE-файл

Структура PE-файла довольно сложная, поэтому подробная документация будет ждать тебя на диске, а здесь я представлю твоему вниманию лишь избранные моменты.

Теперь посмотрим, что же нужно нам сделать, чтобы изменить файл и при этом не испортить его.

Выпуск 3. Теоретический криптор

Для начала выберем файл, который будет у нас исполнять функции лабораторной мыши. Чтобы сделать приятное Андрюшку :), мы, пожалуй, будем издеваться над Putty.exe. Упрощенно его структура будет выглядеть так:

  1. Служебные данные
  2. Первая кодовая секция
  3. Другие секции с данными

Алгоритм криптора следующий. Создать две ассемблерные программы. Первая будет косить под обычную прогу и проверять, что мы не в эмуляторе, а потом передаст управление на вторую программу. Вторая же восстановит оригинальную структуру файла и передаст управление на оригинальную точку входа Putty. И записать эти программы в файл.

В результате получится следующая структура:

  1. Служебные данные
  2. Первая кодовая секция
    1. Наша первая программа, которая передаст управление на 4.2
    2. Шифрованный код первой секции
    1. Часть кодовой секции, перезаписанной программой 2.1
    2. Вторая программа, которая оригинальный код из 4.1 поместит на 2.1, а потом расшифрует кодовую секцию и передаст на нее управление.

    Выпуск 4. Практический криптор

    Ну наконец-то мы добрались до сердца нашей статьи. Для работы криптора нам понадобится модуль pefile (будем использовать несколько модифицированную версию), и с помощью либы откроем Putty:

    import pefile
    pe = pefile.PE("putty.exe")

    Магия, правда? :). А теперь прикинь, что все это пришлось бы писать на С++!

    Поскольку в начале программы будет наш код, то сохраним оригинальный код, скопировав его в последнюю секцию. Адрес первой секции в файле находится в переменной — pe.sections[0]. PointerToRawData, а последней, соответственно — в pe.sections[-1].PointerToRawData:

    pe.data_copy(pe.sections[0].PointerToRawData, pe.sections[-1].PointerToRawData, 512)

    Оригинальный код сохранен, и мы приступим к написанию первой программы. Конечно же, писать мы ее будем на ассемблере, используя FASM для компиляции. Создадим файлик pack.tpl.asm с содержанием:

    use32
    mov eax, >
    jmp eax

    Ты, наверное, уже догадался, что это не готовый исходник, это лишь шаблон для шаблонизатора из TornadoWeb, а его мы уже отлично знаем, ведь именно его мы использовали при написании HTML-морфера. Сгенерируем первую программу:

    asm = Template(open("pack.tpl.asm", "r").read()).generate(
    go=pe.OPTIONAL_HEADER.ImageBase + pe.sections[-1].VirtualAddress+512,
    )
    with open("pack.asm", "w") as f:
    f.write(asm)
    os.system(r"c:fasmwFASM.EXE pack.asm")

    В переменной go мы передаем адрес в памяти, где будет наша вторая программа — то есть, в последней секции, начиная с 512 байта. А в последней строчке компилим результат на FASM’е. Теперь запишем получившийся код в начало первой секции:

    new_pack = open("pack.bin", "rb").read()
    pe.data_replace(offset=pe.sections[0].PointerToRawData, new_data=new_pack)

    Вторую программу запишем в файл copy.tpl.asm. Размер у нее более внушительный, поэтому полный код смотри на диске. Там содержится два цикла, один скопирует 512 байт оригинальной программы с последней секции в первую, а второй цикл расшифрует всю первую секцию. После этого передается управление на оригинальную программу.

    При компиляции темплейта нужно передать туда параметры для циклов копирования и расшифровки:

    copy_from = pe.OPTIONAL_HEADER.ImageBase+pe.sections[-1].VirtualAddress
    copy_to = pe.OPTIONAL_HEADER.ImageBase+pe.sections[0].VirtualAddress
    oep = pe.OPTIONAL_HEADER.ImageBase+pe.OPTIONAL_HEADER.AddressOfEntryPoint
    asm = Template(open("copy.tpl.asm", "r").read()).generate( copy_from=copy_from, copy_to=copy_to, copy_len=512, xor_len=pe.sections[0].Misc_VirtualSize, key_encode=1, original_oep=oep,)

    Остался маленький штришок — записать вторую прогу в файл и сделать первую секцию записываемой, чтобы расшифровщик не выдавал ошибок, а также установить точку входа на начало первой секции:

    new_copy = open("copy.bin", "rb").read()
    pe.data_replace(offset=pe.sections[-1].PointerToRawData+512, new_data=new_copy)
    pe.sections[0].Characteristics |= pefi le.SECTION_CHARACTERISTICS["IMAGE_SCN_MEM_WRITE"]
    pe.OPTIONAL_HEADER.AddressOfEntryPoint = pe.sections[0].VirtualAddress
    pe.write(fi lename="result.exe")

    Выпуск 5. Завершающий

    Если собрать кусочки кода вместе, то будет у нас всего 50 строк. Всего лишь 50 — и криптор готов! А теперь прикинь, сколько строк содержала бы программа на С? Конечно, это еще далеко не готовый продукт, над ним нужно работать и работать. Чтобы довести систему до реального криптора, нужно добавить как минимум шифрование ресурсов и импорта, а также антиэмуляцию. О том как теоретически эти проблемы решить, смотри во врезках. Удачи!

    Желательный функционал 1. Обход песочниц

    В крипторе нужно делать проверки на запуск в виртуальной машине, SandBox’е или анализаторе типа анубиса. Чтобы их зедетектить, нужно провести небольшое исследование и написать программу, которая будет на экран выводить разные внутренние параметры системы, а дальше — проверить этот файл на том же анубисе и в скриншоте посмотреть параметры, которые показала наша прога. Дальше все просто — при запуске на системе с подобными параметрами — просто уходим в цикл.

    Обязательный функционал 2. Шифрование ресурсов и импорта

    Для шифрования ресурсов мы должны пройтись по секции ресурсов и сохранить оттуда важные для запуска файла — иконки и манифест. Дальше создаем новые ресурсы с важными ресурсами, а остальное шифруем. После запуска криптора восстанавливаем все обратно.

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

    Обязательный функционал 1. АнтиЭмуляция

    Кроме избавления от внешних сигнатур, очень важно, чтобы антивирус в своем эмуляторе не добрался до исходного файла. Для этого нужна антиэмуляция. Раньше были очень популярны приемы, основанные на предположении, что эмулятор не понимает все инструкции процессора. Сейчас же ситуация изменилась, и самые эффективные приемы основаны на использовании Windows API. Согласись, что антивирус вряд ли сможет эмулировать все API.

    Вот тебе такая идейка для реализации:

    Внутренности Антивирусов

    В упрощенном виде, антивирус — это набор правил (сигнатур) и система, которая проверяет файл по этим правилам.

    К примеру, пусть в антивирусе будут такие сигнатуры:

    • секция с кодом, записываемая +10;
    • после запуска прописывается в авторан +30;
    • вторая секция с именем Zeus +30;
    • меньше 4 энтропия кодовой секции +20;
    • есть сертификат от майкрософта -10.

    Дальше антивирь проверяет те правила, которые возможно проверить без запуска EXE, потом в эмуляторе запускает файл и проверяет все остальные правила. А после этого подсчитывает сумму, если она больше 100, значит вирус, если меньше — значит не вирус.

    Как работает pefile

    При загрузке в pefile экзэхи, библиотека сохраняет сам файл в pe.data, а потом обрабатывает его и создает массив структур pe.structures. Структура — это объект, у которого есть адрес. Адрес, по которому она находится в файле, и есть набор полей.

    Что скрывают:

    Интернет-ссылки

    image

    Экземпляры Trojan-Downloader в первую очередь скачивают/обновляют другое вредоносное ПО по одной или нескольким ссылкам. Очевидно, что если ссылки хранить в явном виде, то система автообработки любой антивирусной компании с легкостью извлечет их, добавит в список на периодическое скачивание и забанит доступ к этим ресурсам. Смысл Trojan-Downloader'а пропадает напрочь. Зловредам других классов также свойственно скачивать новые версии своих модулей.

    Компоненты
    Пароли

    Тривиальное шифрование:

    Отсюда вывод: вирусописателям есть что скрывать внутри своих творений, и они пытаются это делать. Если вы отлично знаете, что такое битовые операции XOR, ROL и понимаете, как при помощи них можно преобразовать данные, вы можете пропустить весь этот раздел.

    Предположим, у вас есть строка httр://secret.url, и вы хотите спрятать ее в коде от просмотра глазами. При этом алгоритм расшифровки и ключ тоже будут находиться в этом же коде, ведь вам самим эта строка понадобится. Пожалуй, самым-самым простым способом будет следующий.

    image

    Представим строку в виде цепочки битов 110100001110100… Заменим каждый бит на противоположный 001011110001011… Получим строку "ЧЛЛП┼╨╨МЪЬНЪЛ╤КНУ". Теперь невооруженным глазом такую строку уже не узнать. Зато программно можно. Применим ко всему файлу операцию NОТ: то, что было зашифровано, расшифруется обратно. А что нет — зашифруется. В получившемся файле URL виден автоматике и глазам.

    image

    Слегка усложним. При шифровании инвертировать можно не каждый бит, а, например, каждый четвертый (чтобы никто не догадался). Такое вот инвертирование некоторых битов называется так же операцией XOR. Записывается a := a XOR key, где a — это преобразуемый байт, а key — ключ, в котором записано, какие биты меняем.

    image

    При этом, операция NOT эквивалентна a := a XOR FF. Шестнадцатеричное FF равно двоичному 11111111 — инвертируем каждый бит.

    Другие методы

    Расшифровка:

    Небольшое отступление. В ЛК сейчас используются такие методы автоанализа, которым все равно, что зашифровано, и как. Хотя бы даже очень стойким алгоритмом (в отличие от описанных). Если данные используются самой программой, они все равно будут нами извлечены. Ниже я лишь продемонстрирую, что описанные методы шифрования не защитят вирусописателя и не составят трудности даже для аналитика-любителя. Никаких откровений. Следите за руками.

    Аналогично, если 'Й' = 'h' + key, то key = 'Й' — 'h'. И проверяем, что оставшаяся часть урла действительно является урлом.

    Но вот что делать, если злоумышленник линейно менял ключ от байта к байту?
    'Й' = 'h' + key
    'Ц' = 't' + (key + d)
    'У' = 't' + (key + 2d)
    'К' = 'p' + (key + 3d).

    Все то же самое:
    key = 'Й' — 'h'
    key + d = 'Ц' — 't'

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

    Комбинирование

    Например, они комбинируют методы. Запишут урл задом наперед, да еще через байт, а потом еще поксорят с переменным ключом. Да, некоторую автоматику это может сбить с толку. По факту же это не мешает успешно детектировать такие файлы. А как только зловреда разберет вирусный аналитик, он добавит в дешифровщик метод Reverse(Unicode(LinearXor(stream))), после этого все старые и новые версии расшифровываются автоматически.

    Водяные знаки

    После компиляции зашифрованная строчка будет в исполняемом файле, но обнаружить ее непросто. Ведь неизвестно, что искать и где.

    Однако, как мы только что выяснили, если копия Эдуарда все-таки попадет в публичный доступ, то у Григория окажутся два варианта программы, и он без труда найдет разницу в них и разгадает шифр. Получится только хуже для вас, Григорий сможет подделывать чужие копии.

    Заключение:

    Вот в целом и все. Мы познакомились с некоторыми тривиальными методами шифрации и выяснили, почему же они бесполезны. Если у вас есть вопросы и комментарии — отлично, очень жду. Если же материал показался вам слишком простым, то вот вам жизненный пример из области анализа вирусов на эту же тему.

    Вирус (инфектор) встраивает свое тело в заражаемый файл. Тело у него постоянно, но он его ксорит по DWORD'ам с псевдослучайными числами так:
    srand(key);
    crypted[0] = body[0] XOR rand();
    crypted[1] = body[1] XOR rand();

    Известно, что в качестве генератора псевдо-случайных чисел используется самый популярный в компиляторах алгоритм:

    Ни один атакующий не хочет, чтобы его инструменты обнаружили и раскрыли раньше времени. Поэтому, как правило, в чистом виде никто вредоносные программы не распространяет. Например, пользователю прилетело фишинговое письмо от имени известной транспортной компании и просят проверить документы во вложении. Подобные письма достаточно часто являются началом атаки, так было и на этот раз. Внутри архива находился исполняемый файл Cassandra Crypter — популярный криптор, полезной нагрузкой которого могут выступать различные семейства вредоносного программного обеспечения. Алексей Чехов, аналитик CERT-GIB, рассказывает, как Cassandra проникает на компьютер жертвы и приводит с собой других незваных гостей.


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


    Первая стадия

    Cassandra маскируется под легитимное приложение. В точке входа располагается стандартная для приложений Windows Forms функция запуска.


    Конструктор формы также выглядит стандартным, ничем не отличающимся от легитимного приложения.


    При детальном анализе был обнаружен вызов функции aaa() , которая содержит вредоносный функционал. Ее вызов приводит к расшифровке и подгрузке вспомогательной dll .


    Для расшифровки используется алгоритм AES.


    После подгрузки вспомогательной dll вызовется одна из её функций, в результате чего будет получена и запущена вторая стадия криптора.


    Вторая стадия содержится в изображении, в зашифрованном виде, в исходной сборке.


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


    В первой стадии злоумышленники практически не используют средства противодействия анализу, отладки и так далее, за исключением обфускации дополнительной библиотеки.

    Вторая стадия

    Конфигурационный файл

    Ключ, который используется на первой стадии расшифровки пейлоада

    Поле, содержащее пейлоад в расшифрованном виде

    Поле содержащее сырой (не разобранный) конфиг

    Поле, содержащее подготовленный конфиг

    Поле, содержащее флаг типа инжекта

    Поле, содержащее флаг закрепления в системе

    Поле, содержащее имя файла после закрепления в системе

    Поле, содержащее название мьютекса

    Поле, содержащее информацию об использовании загрузчика

    Поле, содержащее информацию о пути до загруженного файла

    Поле, содержащее ссылку на пейлоад

    Поле, содержащее информацию об использовании Anti-VM/Sandbox-функции, осуществляющей поиск

    Поле, содержащее информацию об использовании Anti-VM/Sandbox-функции, осуществляющей поиск строк в пути файла

    Поле, содержащее информацию об использовании Fake MessageBox

    Текст заголовка Fake MessageBox

    Текст Fake MessageBox

    Информация о кнопках Fake MessageBox

    Информация об иконке Fake MessageBox

    Количество секунд, в течение которых приложение будет бездействовать

    Функция, осуществляющая разбор конфигурационного файла

    Функция, осуществляющая разбор конфигурационного файла

    Полезная нагрузка

    Полезная нагрузка содержится в крипторе в зашифрованном виде. Расшифровка проходит в два этапа:

    1. В цикле осуществляется побайтовый XOR шифрограммы, ключа и значения операции XOR от последнего элемента байта шифрограммы и 112. Полученные значения сохраняются в созданный массив. Ключ для первой стадии содержится в конфигурационном файле.


    2. Осуществляется дешифрование, аналогичное тому, что было на первой стадии: используется операция XOR, в качестве ключа используются первые 16 байтов массива, полученного на первом этапе.


    Закрепление в системе

    Закрепление в системе осуществляется через создание отложенной задачи. Файл копируется в директорию AppData//+”.exe” . После этого исходный файл удаляется и создается задача на выполнение.



    Anti-VM

    В функции осуществляется поиск виртуальных видеоадаптеров и специфических ключей реестра, свойственных для виртуальных машин.



    Anti-Sandbox

    Реализованы три функции противодействия песочнице:

    Детект изолированной среды. Функция проверяет путь до исполняемого файла и ищет в нём специфические строки, таких как \\VIRUS, SAMPLE, SANDBOX и т.д. Также осуществляется поиск окна, свойственного WindowsJail, и библиотеки SbieDll.dll, загруженной в процесс.

    Попытка обхода песочницы по таймауту. Реализована при помощи стандартной процедуры Sleep.

    Попытка обхода песочницы по user activity. Реализована при помощи показа Fake MessageBox.

    Защита от повторного запуска

    Реализована путем создания мьютекса с заданным именем в системе.


    Функционал

    Downloader

    Реализована функция загрузки пейлоада из сети.


    Запуск полезной нагрузки

    Содержит два варианта запуска пейлоада:


    2. Инжект полезной нагрузки в запущенный процесс. Есть возможность выбора из нескольких процессов.


    На данный момент Cassandra — достаточно распространенный тип крипторов. Как правило, злоумышленники используют его в массовых рассылках, чтобы незаметно запускать на машине пользователя вредоносное ПО. Cassandra позволяет запускать даже хорошо изученные семейства ВПО.

    Читайте также: