Всем привет. Решил написать самый примитивный дроппер на плюсах. Юзаю WinInet. Скачивание файла происходит по прямой ссылке с файлообменника. На моей ВДС Windows Server 2019 все отлично работает, файл скачивается. Запускаю на голой системе Windows 7 без драйверов и тд, где установлен только Internet Explorer по дефолту. В итоге вылетает ошибка ERROR_INTERNET_SECURITY_CHANNEL_ERROR 12157 The application experienced an internal error loading the SSL libraries - код ошибки с MSDN.
Код:
Ошибка на 79 строчке.
P.S. на говнокод не обращайте внимание, делал быстро на коленке и к релизу обязательно перепишу. Главное сейчас решить ошибку
Код:
C++:
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <wininet.h>
#include <iostream>
#include <vector>
#pragma comment(lib,"wininet")
using namespace std;
int main(int argc, char* argv[])
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
if (argc == 1)
{
cout << "0 arguments were passed!";
return 1;
}
if (argc == 2)
{
cout << "No output file name!";
return 1;
}
vector <LPCSTR> names;
vector <LPCSTR> urls;
for (int i = 0; i < argc; i += 2)
{
if (i != 0)
{
names.push_back(argv[i]);
}
}
for (int i = 1; i < argc; i += 2)
{
urls.push_back(argv[i]);
}
cout << "Start download" << endl;
for (int i = 0; i < urls.size(); i++)
{
HINTERNET hInternetSession;
HINTERNET hURL;
DWORD dwBytesRead = 1;
hInternetSession = InternetOpen(
L"tes",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, 0
);
if (!hInternetSession)
{
cout << "InternetOpen failed! Error " << GetLastError() << endl;
system("pause");
return 1;
}
hURL = InternetOpenUrlA(
hInternetSession,
urls[i],
NULL, 0, INTERNET_FLAG_KEEP_CONNECTION |
INTERNET_FLAG_DONT_CACHE |
INTERNET_FLAG_SECURE |
INTERNET_FLAG_IGNORE_CERT_CN_INVALID |
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
INTERNET_DEFAULT_HTTPS_PORT,
0
);
if (!hURL)
{
cout << "InternetOpenUrlA failed! Error " << GetLastError() << endl;
system("pause");
return 1;
}
DWORD fileSize = 0;
DWORD lenFileSize = sizeof(DWORD);
HttpQueryInfo(
hURL,
HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
&fileSize,
&lenFileSize,
NULL
);
float tb = 1099511627776;
float gb = 1073741824;
float mb = 1048576;
float kb = 1024;
string size_prefix_str;
float size;
if (fileSize >= tb)
{
size_prefix_str = " TB";
size = tb;
}
else if (fileSize >= gb && fileSize < tb)
{
size_prefix_str = " GB";
size = gb;
}
else if (fileSize >= mb && fileSize < gb)
{
size_prefix_str = " MB";
size = mb;
}
else if (fileSize >= kb && fileSize < mb)
{
size_prefix_str = " KB";
size = kb;
}
else if (fileSize < kb)
{
size_prefix_str = " Bytes";
size = 1;
}
else
{
size_prefix_str = " Bytes";
size = 1;
}
char buf[1024];
DWORD dwTemp;
HANDLE hFile = CreateFileA(names[i], GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
);
if (!hFile)
{
cout << "CreateFileA failed! Error " << GetLastError() << endl;
system("pause");
return 1;
}
if (INVALID_HANDLE_VALUE == hFile)
{
cout << "ERROR INVALID_HANDLE_VALUE " << GetLastError() << endl;
system("pause");
return 1;
}
float current_byte = 0.0;
int percent = 0;
int old_percent = 0;
string s;
for (; dwBytesRead > 0;)
{
if (!InternetReadFile(hURL, buf, (DWORD)sizeof(buf), &dwBytesRead))
{
cout << "InternetReadFile failed! Error " << GetLastError() << endl;
system("pause");
return 1;
}
current_byte += dwBytesRead;
percent = (current_byte / fileSize) * 100;
if (percent % 5 == 0 and percent != old_percent)
{
system("cls");
cout << names[i] << "[" << i + 1 << "/" << names.size() << "] " << current_byte / size << size_prefix_str << " of " << fileSize / size << size_prefix_str << " - " << percent << "%\n";
old_percent = percent;
}
WriteFile(hFile, buf, dwBytesRead, &dwTemp, NULL);
}
cout << "Downloaded" << endl;
InternetCloseHandle(hURL);
InternetCloseHandle(hInternetSession);
CloseHandle(hFile);
}
system("pause");
return 0;
}
Ошибка на 79 строчке.
C++:
if (!hURL)
{
cout << "InternetOpenUrlA failed! Error " << GetLastError() << endl;
system("pause");
return 1;
}
Последнее редактирование: