Как сделать криптор
Популярность: 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 позволяет запускать даже хорошо изученные семейства ВПО.
Любой криптор состоит из двух основных вещей: билдер и стаб.
Стаб - шаблон с заранее прописанными функциями.
Билдер - заполняет шаблон (стаб) введеными значениями и выдает готовый файл.
Для начала определим функционал и распределим его по двум вышеописанным модулям:
Шифрование файла - Builder
Генерация ключа шифрования - Builder
Добавление иконки - Builder
Заполнение и компиляция стаба - Builder
Pump файла (искусственное увеличение веса) - Builder
Защита от виртуальной машины - Stub
Дешифровка файла и запуск в памяти - Stub
В стабе нам необходимо определить переменные, которые будут заполняться через билдер:
Автозагрузку делаем через дефолтный метод, кладем ярлык в папку %startup%, а сами прыгаем в %programdata%.
Дефолтный AES-декриптор, юзал его против Wanna-Die.
Метод, который детектит виртуалку. Использовал его в первой версии Куриямы. Достаем инфу о системе и делаем несколько сравнений с значениями виртуалок (на VPS работать тоже не будет).
Builder
Создаем WinForms приложение и кидаем туда следующие элементы:
Делаем обработчики для всех кнопок слева и всех чекбоксов в правой колонке. Для кнопок выбора иконки и файла создаем элемент Open File Dialog:
Делаем зависимые друг от друга чекбоксы, чтоб юзер не смог выбрать две несовместимые вещи.
Генерируем рандомные байты, пишем в файл и возвращаем путь до него.
Заполняем стаб, шифруем файл и компилируем.
Для уборки GEN детектов и обфускации, будем юзать ConfuserEx. Для начала нужно скомпилировать CLI-версию и основные DLL для работы. Далее, добавляем все эти файлы в ресурсы криптора. Дропаем файл его в %temp%, кидаем туда же файлы конфьюзера и протектим.
Запрещен слив на вирус тотал , или других сканнеров которые сливают файлы в базу данных.
Разрешено сканировать файлы на avcheck,antiscan,dyncheck.
Я гарантирую что на выше перечисленых сканерах не будет превышаться более одного или двух детектов. Кроме dyncheck'a так как рантайм всегда зависит от вашего файла.
Запрещен реверс и слив покупаемого файл ( крипта)
Гарантия на крипт 12 часов.
⚡️ Актуально , принимаю заказы писать в телеграмм ⚡️
⭐️Криптую такие софты как - МАЙНЕРЫ , РАТНИКИ , СТИЛЛЕРЫ ( РЕДЛАЙН , МАРС , РАКУН И ДРУГИЕ) , БОТНЕТЫ, ЛОАДЕРЫ , КЛИППЕРЫ И ДРУГОЙ СОФТ. УТОЧНЯЙТЕ В ЛС⭐️
Читайте также: