wininet_downloader_cpp


wininet.lib cpp 下载

#include <windows.h>
#include <wininet.h>
#include <string>
#include <iostream>
using namespace std;
 
#pragma comment(lib, "wininet.lib")
 
#define  DOWNHELPER_AGENTNAME         "downloader"
#define  LEN_OF_BUFFER_FOR_QUERYINFO  128
#define  DOWNLOAD_BUF_SIZE            (10*1024)  
#define  MAX_DOWNLOAD_REQUEST_TIME    10  
#define  MAX_DOWNLOAD_BYTESIZE        (10000*1024*1024)
 
 
BOOL _TryHttpSendRequest(LPVOID hRequest, int nMaxTryTimes); 
 

BOOL DownloadUrl(std::string strUrl, std::string strFileName)
&#123;
    BOOL bRet = FALSE;
    if (strUrl == "" || strFileName == "")
        return FALSE;
 
   
    HINTERNET hInet = NULL; 
    HINTERNET hConnect = NULL; 
    HINTERNET hRequestHead = NULL; 
    HINTERNET hRequestGet = NULL; 
    HANDLE hFileWrite = NULL; 
    char* pBuf = NULL; 
    DWORD dwRequestTryTimes = MAX_DOWNLOAD_REQUEST_TIME;
    DWORD dwDownBytes = 0; 
    DWORD dwDownFileTotalBytes = 0; 
    DWORD dwWriteBytes = 0; 
    char bufQueryInfo[LEN_OF_BUFFER_FOR_QUERYINFO] = &#123;0&#125;; 
    DWORD dwBufQueryInfoSize = sizeof(bufQueryInfo);
    DWORD dwStatusCode = 0;
    DWORD dwContentLen = 0;
    DWORD dwSizeDW = sizeof(DWORD);
 
    
    CHAR pszHostName[INTERNET_MAX_HOST_NAME_LENGTH] = &#123;0&#125;;
    CHAR pszUserName[INTERNET_MAX_USER_NAME_LENGTH] = &#123;0&#125;;
    CHAR pszPassword[INTERNET_MAX_PASSWORD_LENGTH] = &#123;0&#125;;
    CHAR pszURLPath[INTERNET_MAX_URL_LENGTH] = &#123;0&#125;;
    CHAR szURL[INTERNET_MAX_URL_LENGTH] = &#123;0&#125;;
    URL_COMPONENTSA urlComponents = &#123;0&#125;;
    urlComponents.dwStructSize = sizeof(URL_COMPONENTSA);
    urlComponents.lpszHostName = pszHostName;
    urlComponents.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH;
    urlComponents.lpszUserName = pszUserName;
    urlComponents.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH;
    urlComponents.lpszPassword = pszPassword;
    urlComponents.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH;
    urlComponents.lpszUrlPath = pszURLPath;
    urlComponents.dwUrlPathLength = INTERNET_MAX_URL_LENGTH;
 
    bRet = InternetCrackUrlA(strUrl.c_str(), 0, NULL, &urlComponents);
    bRet = (bRet && urlComponents.nScheme == INTERNET_SERVICE_HTTP);
    if (!bRet)
    &#123;
        goto _END_OF_DOWNLOADURL;
    &#125;
    
    
    hInet = InternetOpenA(DOWNHELPER_AGENTNAME, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL);
    if (!hInet)
    &#123;
        bRet = FALSE;
        goto _END_OF_DOWNLOADURL;
    &#125;
    
    
    hConnect = InternetConnectA(hInet, pszHostName, urlComponents.nPort, pszUserName, pszPassword, INTERNET_SERVICE_HTTP, 0, NULL);
    if (!hConnect)
    &#123;
        bRet = FALSE;
        goto _END_OF_DOWNLOADURL;
    &#125;
    
    
    if (urlComponents.dwUrlPathLength !=  0)
        strcpy(szURL, urlComponents.lpszUrlPath);
    else
        strcpy(szURL, "/");
    
    hRequestHead = HttpOpenRequestA(hConnect, "HEAD", szURL, "HTTP/1.1", "", NULL, INTERNET_FLAG_RELOAD, 0);
    bRet = _TryHttpSendRequest(hRequestHead, dwRequestTryTimes);
    if (!bRet)
    &#123;
        goto _END_OF_DOWNLOADURL; 
    &#125;
   
    
    dwContentLen = 0;
    dwSizeDW = sizeof(DWORD);
    bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_CONTENT_LENGTH, &dwContentLen, &dwSizeDW, NULL);
    if (bRet)
    &#123;
       
        if (dwContentLen > MAX_DOWNLOAD_BYTESIZE)
        &#123;
            bRet = FALSE;
            goto _END_OF_DOWNLOADURL;
        &#125;
    &#125;
 
    
    hRequestGet = HttpOpenRequestA(hConnect, "GET", szURL, "HTTP/1.1", "", NULL, INTERNET_FLAG_RELOAD, 0);
    bRet = _TryHttpSendRequest(hRequestGet, dwRequestTryTimes);
    if (!bRet)
    &#123;
        goto _END_OF_DOWNLOADURL; 
    &#125;
 
    
    hFileWrite = CreateFileA(strFileName.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (INVALID_HANDLE_VALUE == hFileWrite)
    &#123;
        bRet = FALSE;
        goto _END_OF_DOWNLOADURL;
    &#125;
 
    
    pBuf = new char[DOWNLOAD_BUF_SIZE]; 
    if (!pBuf)
    &#123;
        bRet = FALSE;
        goto _END_OF_DOWNLOADURL;
    &#125;
 
    
    dwDownFileTotalBytes = 0;
    while (1)
    &#123;
        dwDownBytes = 0;
        memset(pBuf, 0, DOWNLOAD_BUF_SIZE*sizeof(char));
        bRet = InternetReadFile(hRequestGet, pBuf, DOWNLOAD_BUF_SIZE, &dwDownBytes);
        if (bRet)
        &#123;
            if (dwDownBytes > 0)
            &#123;
                dwDownFileTotalBytes += dwDownBytes;
                bRet = WriteFile(hFileWrite, pBuf, dwDownBytes, &dwWriteBytes, NULL); 
                if (!bRet)
                &#123;
                    goto _END_OF_DOWNLOADURL;
                &#125;
            &#125;
            else if (0 == dwDownBytes)
            &#123;
                bRet = TRUE;
                break; 
            &#125;
        &#125;
    &#125;
    
 
_END_OF_DOWNLOADURL:
    if (INVALID_HANDLE_VALUE != hFileWrite)
        CloseHandle(hFileWrite);
    if (pBuf)
        delete [] pBuf;
    if (hRequestGet)
        InternetCloseHandle(hRequestGet);
    if (hRequestHead)
        InternetCloseHandle(hRequestHead);
    if (hConnect)
        InternetCloseHandle(hConnect);
    if (hInet)
        InternetCloseHandle(hInet);
    
    return bRet;
&#125;
 

BOOL _TryHttpSendRequest(LPVOID hRequest, int nMaxTryTimes)
&#123;
    BOOL bRet = FALSE;
    DWORD dwStatusCode = 0;
    DWORD dwSizeDW = sizeof(DWORD);
    while (hRequest && (nMaxTryTimes-- > 0)) 
    &#123;
       
        bRet = HttpSendRequestA(hRequest, NULL, 0, NULL, 0);
        if (!bRet)
        &#123;
            continue;
        &#125;
        else
        &#123;
            
            dwStatusCode = 0;
            dwSizeDW = sizeof(DWORD);
            bRet = HttpQueryInfo(hRequest, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, &dwStatusCode, &dwSizeDW, NULL);
            if (bRet)
            &#123;
                
                if (HTTP_STATUS_OK == dwStatusCode) 
                &#123;
                    break;
                &#125;
                else
                &#123;
                    bRet = FALSE;
                    continue;
                &#125;
            &#125;
        &#125;
    &#125;
 
    return bRet;
&#125;
 
 
int main(int argc, char* argv[])
&#123;
    cout<< "pls input downloadurl:";

    char str[80];
    cin.get(str,80);
    
    BOOL bR = DownloadUrl(str, "temp.png"); 
    cout << "Downloading..."<<endl;
    if (bR)
        cout << "ok" << endl;
    else
        cout << "no" << endl;
    return 0;
&#125;

文章作者: yaron
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yaron !
 上一篇
免杀 MSF Windows Payload 的方法与实践(小白视角) 免杀 MSF Windows Payload 的方法与实践(小白视角)
MSF 是当下最流行的渗透测试平台,在进行后渗透阶段往往需要我们绕过杀软等隐蔽操作,在看完余弦猥琐流打发之后,自个手动实践,然后写一个详细的演练操作,做笔记存档。
下一篇 
Windows和Active Directory备忘单和命令参考 Windows和Active Directory备忘单和命令参考
Windows和Active Directory备忘单和命令参考GeneralPowerShell AMSI Bypass修补AMSI将有助于绕过执行标记为恶意的PowerShell脚本(例如PowerView)时触发的AV警告。请勿在秘密
2021-06-08
  目录