BOOL WINAPI DetourHttpSendRequestA(HINTERNET hRequest, LPCSTR lpszHeaders, DWORD dwHeadersLength, LPVOID lpOptional, DWORD dwOptionalLength) { char szBuf[1024]; memset(szBuf, 0, sizeof(szBuf)); sprintf_s(szBuf, sizeof(szBuf), "MoneyhubUID: %s\r\nSN:%s\r\n", GenHWID2().c_str(),CSNManager::GetInstance()->GetSN().c_str()); HttpAddRequestHeadersA(hRequest, szBuf, -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); return OldHttpSendRequestA(hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength); }
BOOL WINAPI my_HttpAddRequestHeadersA(HINTERNET hRequest, LPSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwModifiers) { BOOL Ret; LPSTR NewHeaders; ENTER_HOOK(); if (NewHeaders = IeCreateContextModifyHeadersA(hRequest, lpszHeaders, dwHeadersLength, NULL, NULL)) lpszHeaders = NewHeaders; Ret = HttpAddRequestHeadersA(hRequest, lpszHeaders, dwHeadersLength, dwModifiers); if (NewHeaders) hFree(NewHeaders); LEAVE_HOOK(); return(Ret); }
/* gsoap documentation: Called by http_post and http_response (through the callbacks). Emits HTTP key: val header entries. Should return SOAP_OK, or a gSOAP error code. Built-in gSOAP function: http_post_header. */ static int wininet_post_header( struct soap * soap, const char * a_pszKey, const char * a_pszValue ) { HINTERNET hHttpRequest = (HINTERNET) soap->socket; char szHeader[4096]; int nLen; BOOL bResult = FALSE; struct wininet_data * pData = (struct wininet_data *) soap_lookup_plugin( soap, wininet_id ); soap->error = SOAP_OK; /* ensure that our connection hasn't been disconnected */ if ( !wininet_have_connection( soap, pData ) ) { return SOAP_EOF; } /* if this is the initial POST header then we initialize our send buffer */ if ( a_pszKey && !a_pszValue ) { _ASSERTE( !pData->pBuffer ); pData->uiBufferLenMax = INVALID_BUFFER_LENGTH; pData->uiBufferLen = 0; /* if we are using chunk output then we start with a chunk size */ pData->bIsChunkSize = ( (soap->omode & SOAP_IO) == SOAP_IO_CHUNK ); } else if ( a_pszValue ) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "wininet %p: post_header, adding '%s: %s'\n", soap, a_pszKey, a_pszValue )); /* determine the maximum length of this message so that we can correctly determine when we have completed the send */ if ( !strcmp( a_pszKey, "Content-Length" ) ) { _ASSERTE( pData->uiBufferLenMax == INVALID_BUFFER_LENGTH ); pData->uiBufferLenMax = strtoul( a_pszValue, NULL, 10 ); } nLen = _snprintf( szHeader, 4096, "%s: %s\r\n", a_pszKey, a_pszValue ); if ( nLen < 0 ) { return SOAP_EOM; } bResult = HttpAddRequestHeadersA( hHttpRequest, szHeader, nLen, HTTP_ADDREQ_FLAG_ADD_IF_NEW ); #ifdef SOAP_DEBUG /* we don't return an error if this fails because it isn't (or shouldn't be) critical. */ if ( !bResult ) { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "wininet %p: post_header, error %d (%s) in HttpAddRequestHeaders\n", soap, soap->error, wininet_error_message(soap,GetLastError()) )); } #endif } return SOAP_OK; }
VOID CALLBACK HCInternetStatusCallback( __in HINTERNET hInternet, __in_opt DWORD_PTR dwContext, __in DWORD dwInternetStatus, __in_opt LPVOID lpvStatusInformation, __in DWORD dwStatusInformationLength ) { if ( INTERNET_STATUS_REDIRECT == dwInternetStatus ) { LPCSTR pszRedirectUrl = (LPCSTR)lpvStatusInformation; CStringA strRedirectUrl; strRedirectUrl = pszRedirectUrl; CStringA strOrgUrl; UrlRecorder.GetRecordData(hInternet,&strOrgUrl); UrlRecorder.SetRecordData(hInternet,strRedirectUrl); CHAR chCookieData[2000]={0}; CommonGetCookie(strRedirectUrl,chCookieData,1999,FALSE); CStringA strCookieHeader; strCookieHeader = "Cookie: "; strCookieHeader += chCookieData; BOOL bRes = HttpAddRequestHeadersA(hInternet,strCookieHeader.GetBuffer(),strCookieHeader.GetLength(),HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE); int a=0; } if ( INTERNET_STATUS_REQUEST_COMPLETE == dwInternetStatus ) { CStringA strInternetUrl; UrlRecorder.GetRecordData(hInternet,&strInternetUrl); char chRecvCookie[2000]; DWORD dwRecvCookieLen = 2000; DWORD dwCookieIndex = 0; while(HttpQueryInfoA(hInternet,HTTP_QUERY_SET_COOKIE,chRecvCookie,&dwRecvCookieLen,&dwCookieIndex)) { CommonSetCookie(strInternetUrl,chRecvCookie); if ( ERROR_HTTP_HEADER_NOT_FOUND == dwCookieIndex) { break; } dwRecvCookieLen = 2000; } } INTERNET_STATUS_CALLBACK pOrgCallback = NULL; CallbackRecorder.GetRecordData(hInternet,&pOrgCallback); if (pOrgCallback) { pOrgCallback(hInternet, dwContext, dwInternetStatus, lpvStatusInformation, dwStatusInformationLength ); } }
__in DWORD dwHeadersLength, __in_bcount_opt(dwOptionalLength) LPVOID lpOptional, __in DWORD dwOptionalLength ) { CStringA strInternetUrl; UrlRecorder.GetRecordData(hRequest,&strInternetUrl); CHAR chCookieData[4000]={0}; CommonGetCookie(strInternetUrl,chCookieData,3999,FALSE); CStringA strCookieHeader; strCookieHeader = "Cookie: "; strCookieHeader += chCookieData; BOOL bRes = HttpAddRequestHeadersA(hRequest,strCookieHeader.GetBuffer(),strCookieHeader.GetLength(),HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE); BOOL TReturn = pHttpSendRequestW( hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength ); return TReturn; }; BOOL (WINAPI *pHttpSendRequestExW)( __in HINTERNET hRequest, __in_opt LPINTERNET_BUFFERSW lpBuffersIn, __out_opt LPINTERNET_BUFFERSW lpBuffersOut,
LONG WINAPI UnhandledExceptionHandler(_EXCEPTION_POINTERS *ExceptionInfo){ List<LoadedModule*> LoadedModules; EnumerateLoadedModules(GetCurrentProcess(), (PENUMLOADED_MODULES_CALLBACK)AddLoadedModule, &LoadedModules); StringList HeaderList; if(ExceptionInfo->ContextRecord->ContextFlags & CONTEXT_INTEGER){ PCONTEXT reg = ExceptionInfo->ContextRecord; HeaderList.push_back(String("Register-EAX: %1").arg(reg->Eax, 16, true, 8)); HeaderList.push_back(String("Register-ECX: %1").arg(reg->Ecx, 16, true, 8)); HeaderList.push_back(String("Register-EDX: %1").arg(reg->Edx, 16, true, 8)); HeaderList.push_back(String("Register-EBX: %1").arg(reg->Ebx, 16, true, 8)); HeaderList.push_back(String("Register-EDI: %1").arg(reg->Edi, 16, true, 8)); HeaderList.push_back(String("Register-ESI: %1").arg(reg->Esi, 16, true, 8)); } if(ExceptionInfo->ContextRecord->ContextFlags & CONTEXT_CONTROL){ PCONTEXT reg = ExceptionInfo->ContextRecord; HeaderList.push_back(String("Register-EBP: %1").arg(reg->Edi, 16, true, 8)); HeaderList.push_back(String("Register-ESP: %1").arg(reg->Esi, 16, true, 8)); } HeaderList.push_back(String("Exception-Address: %1").arg((unsigned int)ExceptionInfo->ExceptionRecord->ExceptionAddress, 16, true, 8)); HeaderList.push_back(String("Exception-Flags: %1").arg((unsigned int)ExceptionInfo->ExceptionRecord->ExceptionFlags, 16, true, 8)); HeaderList.push_back(String("Exception-Code: %1").arg((unsigned int)ExceptionInfo->ExceptionRecord->ExceptionCode, 16, true, 8)); CGameOBJ* self = CObjMGR::GetSelf(); const char* name = (self)?self->GetName():"No Character"; HeaderList.push_back(String("Character: %1").arg(name)); String module = "Unknown"; unsigned int codeAddress = (unsigned int)((char*)ExceptionInfo->ExceptionRecord->ExceptionAddress); module = GetModuleName(codeAddress, &LoadedModules); HeaderList.push_back(String("Module: %1").arg(module)); unsigned char* codePtr = (unsigned char*)ExceptionInfo->ExceptionRecord->ExceptionAddress; //if(IsBadReadPtr(codePtr - 20, 40) || !IsBadCodePtr(FARPROC(codePtr))){ String code = String("Code-Data: Version: %1 ").arg(gVersion); if(CTERRAIN::Instance()) { code += String("Zone: %1 ").arg(CTERRAIN::Instance()->m_nZoneNO); } if(gRecvPacket) { code += String("RecvPacket: %1").arg(gRecvPacket->Command(), 16); } /*}else{ for(int i = -20; i < 20; ++i) code += String::Create("%02X", codePtr[i]); }*/ HeaderList.push_back(code); OSVERSIONINFO osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); HeaderList.push_back(String("Windows: %1.%2").arg((unsigned int)osvi.dwMajorVersion).arg((unsigned int)osvi.dwMinorVersion)); GetCallStack(ExceptionInfo, &LoadedModules, HeaderList); unsigned int bufLen = 100; for(StringList::Iterator itr = HeaderList.begin(); itr != HeaderList.end(); ++itr) bufLen += strlen(*itr) + 3; char* theHeaders = new char[bufLen]; theHeaders[0] = 0; for(StringList::Iterator itr = HeaderList.begin(); itr != HeaderList.end(); ++itr){ strcat_s(theHeaders, bufLen, *itr); strcat_s(theHeaders, bufLen, ";\r\n"); } if(MessageBoxA(NULL, "Would you like to submit this error to the titanROSE team?", "An error has occured.", MB_ICONERROR | MB_YESNO) == IDYES){ HINTERNET theInternet = InternetOpenA("titanROSE.Client", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); HINTERNET theConnection = InternetConnectA(theInternet, "crash.titanrose.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL); HINTERNET theRequest = HttpOpenRequestA(theConnection, "GET", NULL, NULL, "trose.exe", NULL, INTERNET_FLAG_PRAGMA_NOCACHE |INTERNET_FLAG_RELOAD, NULL); HttpAddRequestHeadersA(theRequest, theHeaders, -1, HTTP_ADDREQ_FLAG_ADD); BOOL theResult = HttpSendRequestA(theRequest, NULL, 0, NULL, 0); if(theResult == TRUE){ MessageBoxA(NULL, "Your error report was successfully uploaded, thank you.", "Error Report Submitted", MB_OK | MB_ICONASTERISK); }else{ strcat_s(theHeaders, bufLen, "\r\nThere was an error submitting your error report, please post this message box on the forums."); MessageBoxA(NULL, theHeaders, "Error submitting Error Report", MB_OK); } } LoadedModules.delete_values(); delete [] theHeaders; return EXCEPTION_EXECUTE_HANDLER; }
bool SendFile(HANDLE hFile, const TCHAR* sUrl, const char* sVariableName, const char* sFileName) { if(!hFile) return false; bool result = false; LARGE_INTEGER lnSize; if(!GetFileSizeEx(hFile, &lnSize)){ CloseHandle(hFile); return false; } DWORD nDataSize = lnSize.LowPart; if(!(nDataSize>0)) { CloseHandle(hFile); return false; } std::vector<char> pData(nDataSize); DWORD nReadSize = 0; if(!ReadFile(hFile, (void*)&pData[0], nDataSize, &nReadSize, NULL) || !(nReadSize >0) || (nReadSize != nDataSize)) { CloseHandle(hFile); return false; } CloseHandle(hFile); TCHAR extraInfo[URL_PART_SIZE]; TCHAR hostName[URL_PART_SIZE]; TCHAR passwordSet[URL_PART_SIZE]; TCHAR schemeUrl[URL_PART_SIZE]; TCHAR fileUrlPath[URL_PART_SIZE]; TCHAR userName[URL_PART_SIZE]; URL_COMPONENTS aUrl; aUrl.dwStructSize=sizeof(URL_COMPONENTS); aUrl.dwHostNameLength=URL_PART_SIZE; aUrl.dwPasswordLength=URL_PART_SIZE; aUrl.dwSchemeLength=URL_PART_SIZE; aUrl.dwUrlPathLength=URL_PART_SIZE; aUrl.dwUserNameLength=URL_PART_SIZE; aUrl.dwExtraInfoLength=URL_PART_SIZE; aUrl.lpszExtraInfo=extraInfo; aUrl.lpszHostName=hostName; aUrl.lpszPassword=passwordSet; aUrl.lpszScheme=schemeUrl; aUrl.lpszUrlPath=fileUrlPath; aUrl.lpszUserName=userName; PCTSTR rgpszAcceptTypes[] = {_T("text/*"), NULL}; if(!InternetCrackUrl(sUrl, 0, 0, &aUrl)) return false; HINTERNET hInternet = InternetOpen(TEXT("swas"),INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hInternet) { HINTERNET hConnect = InternetConnect(hInternet,aUrl.lpszHostName, aUrl.nPort, aUrl.lpszUserName, aUrl.lpszHostName, INTERNET_SERVICE_HTTP, 0, 0); if(hConnect){ HINTERNET hReq = HttpOpenRequest(hConnect, TEXT("POST"), aUrl.lpszUrlPath, NULL, NULL, rgpszAcceptTypes, INTERNET_FLAG_NO_UI | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0); if(hReq) { //see http://stackoverflow.com/questions/6407755/how-to-send-a-zip-file-using-wininet-in-my-vc-application char sBoundary[HEADERS_MAX_SIZE]; if(GenerateBoundary(sBoundary, HEADERS_MAX_SIZE, sFileName)) { std::stringstream osHeaders; std::stringstream osHeadPart; std::stringstream osTailPart; const char const endl[] = "\r\n"; osHeaders<<"Content-Type: multipart/form-data; boundary="<<sBoundary; osHeadPart<<"--"<<sBoundary<<endl; osHeadPart<<"Content-Disposition: form-data; "; osHeadPart<<"name=\""<<((NULL != sVariableName)?sVariableName:"filearg")<<"\"; "; osHeadPart<<"filename=\""<<((NULL != sFileName)?sFileName:"Chrome Tabs")<<"\""<<endl; osHeadPart<<"Content-Type: application/octet-stream"<<endl; osHeadPart<<endl; osTailPart<<endl<<"--"<<sBoundary<<"--"<<endl; std::string sHeaders = osHeaders.str(); std::string sHeadPart = osHeadPart.str(); std::string sTailPart = osTailPart.str(); HttpAddRequestHeadersA(hReq, sHeaders.c_str(), -1, HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD); INTERNET_BUFFERS bufferIn; memset(&bufferIn, 0, sizeof(INTERNET_BUFFERS)); bufferIn.dwStructSize = sizeof(INTERNET_BUFFERS); bufferIn.dwBufferTotal = sHeadPart.length() + nDataSize + sTailPart.length(); DWORD bytesWritten; if(HttpSendRequestEx(hReq, &bufferIn, NULL, HSR_INITIATE, 0)) { InternetWriteFile(hReq, (const void*)sHeadPart.c_str(), sHeadPart.length(), &bytesWritten); InternetWriteFile(hReq, (const void*)&pData[0], nDataSize, &bytesWritten); // or a while loop for call InternetWriteFile every 1024 bytes... InternetWriteFile(hReq, (const void*)sTailPart.c_str(), sTailPart.length(), &bytesWritten); result = true; }else{ ShowAnError(GetLastError(), TEXT("Network error"), TEXT("Wininet")); } } HttpEndRequest(hReq, NULL, HSR_INITIATE, 0); }else{ ShowAnError(GetLastError(), TEXT("Network error"), TEXT("Wininet")); } }else{ ShowAnError(GetLastError(), TEXT("Network error"), TEXT("Wininet")); } InternetCloseHandle(hInternet); } return result; }