Как сделать криптор

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

Хаддан никому не известный тип


Популярность: 10


Сказал(а) спасибо: 0

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

Итак, теперь ты знаешь, как устроены exe-шники. Теперь я вкрадце опишу наш план.
план
В исполняемых файлах нас больше всего интересуют PE-заголовок, таблица секций и секция кода.
Как будет работать наш криптор?
Сначала заполненная часть секции кода будет зашифрована. Поскольку мы пишем простой криптор, то "шифровать" он будет простым not'ом.
В конец кода мы запишем крохотный декриптор, который этот самый код расшифрует и передаст ему управление.
Тут есть 2 момента. Во-первых, при запуске программы должен начинать работать не шифротекст, а декриптор. Поэтому нам придется изменить Entry Point в PE заголовке. А во-вторых, так просто изменять код бинарников нам никто не даст. При запуске программы вся секция кода помещается в память. Вот там мы изменим код программы. Чтобы мы могли писать в секцию кода, необходимо изменить ее Object Flag.

push 12345678
ret

передает управление в точку с адресом 12345678h. А если она сместиться, сам понимаешь, неизбежны ошибки. Если поместить декодер в конце - таких проблем не возникнет.

Как ты заметил, размер каждой секции выровнен относительно File Align. Значит в секции кода, скорее всего, есть немного места для декодера. Мы не будем расширять секцию кода, а значит у екзешника даже не измениться размер.

Двойной клик по семерке с глобусом
Вкурил? Приступим к реализации вкрадце описанного мною плана.
Как будет внедряться код?
Сначала следует изменить PE заголовок и элемент таблицы секции, описывающий секцию кода (как правило самый первый элемент). Мы добавляем код, следовательно его размер измениться.

inc(PEModuleHeader.Size_of_Code,sizeof(CryptCode)) ;
inc(SectionTable.Virtual_Size,sizeof(CryptCode));

Затем вспоминаем, что мы собираемя модифицировать код в процессе работы программы:

SectionTable.Object_Flags:=SectionTable.Object_Fla gs or $80000000;

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

STVirtSize:=SectionTable.Virtual_Size;
PEModuleHeader.Entry_Point_RVA:=PEModuleHeader.Bas e_of_Code+STVirtSize;

Определяемя с функцией шифрования:

function crypt(b:byte):byte;
begin
result:=not b;
end;

Мы должны прочитать бинарник до начала кода.
Затем зашифровать код. Затем вставить прямо за ним дешифровщик. Как он выглядит:

mov ecx, 0xddccbbaa; помещаем в ecx длинну зашифрованного кода
call 0 ; вызываем следующую команду
pop eax ; помещаем в eax адрес текущей команды
push 0xddccbbaa ; помещаем в стек старую точку входа
sub eax,14 ; вычисляем адрес конца шифротекста
not byte ptr [eax]; "шифруем"
dec eax ; переходим к предыдущему байту
loop $-3 ; в начало цикла
ret ; переходим в старый Entry Point

Вот тут скорее всего возникнет масса вопросов.

Сначала мы помещаем в регистр ecx длину шифротекста. Затем вызываем инструкцию, смещенную относительно данной на ноль байт, то есть следующую. Что нам это дало - при выполнении инструкции call в вершину стека помещается адрес следующей команды. Затем мы извлекаем этот самый адрес, теперь уже текущей команды, в регистр eax. Помещаем в стек адрес старой точки входа - зачем - чуть ниже.
Мы вычитаем из eax длину вышестоящих команд, таким образом теперь в eax записан адрес конца шифротекста, ведь декодер следует прямо за ним.
Мы инвентируем байт по адресу [eax], то есть последний байт шифротекста. Уменьшаем eax на единицу, то есть теперь в нем записан адрес предпоследнего байта шифротекста. loop -3 - переходим к инструкции not byte ptr [eax]. При этом из ecx вычитается единица.
Цикл будет повторяться до тех пор, пока не обнулиться ecx, то есть, пока весь код не будет расшифрован. Ты еще помнишь, что в ecx записанна длина кода?
Затем выполниться инструкция ret. При этом управление передастся в точку с адресом, записанным в вершину стека. Если ты помнишь, туда мы записали старую точку входа. То есть сразу после дешифровки управление передастся расшифрованному коду программы.

Ни один атакующий не хочет, чтобы его инструменты обнаружили и раскрыли раньше времени. Поэтому, как правило, в чистом виде никто вредоносные программы не распространяет. Например, пользователю прилетело фишинговое письмо от имени известной транспортной компании и просят проверить документы во вложении. Подобные письма достаточно часто являются началом атаки, так было и на этот раз. Внутри архива находился исполняемый файл 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 позволяет запускать даже хорошо изученные семейства ВПО.

image

Любой криптор состоит из двух основных вещей: билдер и стаб.

Стаб - шаблон с заранее прописанными функциями.

Билдер - заполняет шаблон (стаб) введеными значениями и выдает готовый файл.

Для начала определим функционал и распределим его по двум вышеописанным модулям:

Шифрование файла - Builder

Генерация ключа шифрования - Builder

Добавление иконки - Builder

Заполнение и компиляция стаба - Builder

Pump файла (искусственное увеличение веса) - Builder

Защита от виртуальной машины - Stub

Дешифровка файла и запуск в памяти - Stub

В стабе нам необходимо определить переменные, которые будут заполняться через билдер:

image
image

image

Автозагрузку делаем через дефолтный метод, кладем ярлык в папку %startup%, а сами прыгаем в %programdata%.

image

Дефолтный AES-декриптор, юзал его против Wanna-Die.

image

Метод, который детектит виртуалку. Использовал его в первой версии Куриямы. Достаем инфу о системе и делаем несколько сравнений с значениями виртуалок (на VPS работать тоже не будет).

image

image

Builder

Создаем WinForms приложение и кидаем туда следующие элементы:

image

Делаем обработчики для всех кнопок слева и всех чекбоксов в правой колонке. Для кнопок выбора иконки и файла создаем элемент Open File Dialog:

image

image

image

Делаем зависимые друг от друга чекбоксы, чтоб юзер не смог выбрать две несовместимые вещи.

image

image

image

Генерируем рандомные байты, пишем в файл и возвращаем путь до него.

image

Заполняем стаб, шифруем файл и компилируем.

image
image

Для уборки GEN детектов и обфускации, будем юзать ConfuserEx. Для начала нужно скомпилировать CLI-версию и основные DLL для работы. Далее, добавляем все эти файлы в ресурсы криптора. Дропаем файл его в %temp%, кидаем туда же файлы конфьюзера и протектим.


Запрещен слив на вирус тотал , или других сканнеров которые сливают файлы в базу данных.

Разрешено сканировать файлы на avcheck,antiscan,dyncheck.

Я гарантирую что на выше перечисленых сканерах не будет превышаться более одного или двух детектов. Кроме dyncheck'a так как рантайм всегда зависит от вашего файла.

Запрещен реверс и слив покупаемого файл ( крипта)

Гарантия на крипт 12 часов.

⚡️ Актуально , принимаю заказы писать в телеграмм ⚡️
⭐️Криптую такие софты как - МАЙНЕРЫ , РАТНИКИ , СТИЛЛЕРЫ ( РЕДЛАЙН , МАРС , РАКУН И ДРУГИЕ) , БОТНЕТЫ, ЛОАДЕРЫ , КЛИППЕРЫ И ДРУГОЙ СОФТ. УТОЧНЯЙТЕ В ЛС⭐️

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