#include "client.hpp" #include "server.hpp" /* std::vector< byte > server::c_client::receive_message( ) { std::vector< uint8_t > ret; char buffer[ BUFFER_SIZE ]{ }; int received = 0; while( true ) { received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); if( received < 0 ) break; for( int i{ }; i < received; ++i ) ret.push_back( buffer[ i ] ); if( received < BUFFER_SIZE ) break; } if( ret.size( ) ) { decode_buffer( ret.data( ), ret.size( ) ); ret.push_back( 0 ); ret.erase( ret.begin( ) ); } return ret; } */ void server::c_client::kill( ) { closesocket( m_socket ); printf( "%s disconnected\n", get_ip( ) ); } std::string server::c_client::get_msg( ) { std::string ret{ }; char buffer[ BUFFER_SIZE ]{ }; int received = 0; while ( true ) { received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); if ( received < 0 ) break; for ( int i{ }; i < received; ++i ) ret.push_back( buffer[ i ] ); if ( received < BUFFER_SIZE ) break; } if ( ret.size( ) ) { decode_buffer( ( uint8_t* )ret.data( ), ret.size( ) ); // ret.push_back( 0 ); somehow broke things :/ ret.erase( ret.begin( ) ); } return ret; } bool server::c_client::send_msg( byte* msg, size_t length ) { auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); uint8_t key = util::random_number( 0, 255 ) & 0xff; buffer[ 0 ] = key; memcpy( buffer.get( ) + 1, msg, length ); for( size_t i = 1; i <= length; ++i ) { buffer[ i ] ^= key; } int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); if( result == -1 ) { #if WIN64 printf( "error sending message to %s: %d\n", get_ip( ), WSAGetLastError( ) ); #else printf( "error sending message to %s\n", get_ip( ) ); #endif return false; } return true; } bool server::c_client::send_msg( const char* msg ) { auto length = strlen( msg ); auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); uint8_t key = util::random_number( 0, 255 ) & 0xff; memset( buffer.get( ), 0, length+1 ); buffer[ 0 ] = key; memcpy( buffer.get( ) + 1, msg, length ); for ( size_t i = 1; i <= length; ++i ) { buffer[ i ] ^= key; } int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); if ( result == -1 ) { #if WIN64 printf( "error sending message to %s: %d\n", get_ip( ), WSAGetLastError( ) ); #else printf( "error sending message to %s\n", get_ip( ) ); #endif return false; } return true; } bool server::c_client::handle( ) { /* ALL TEST CODE BELOW. */ auto hello_msg = get_msg( ); printf( "%s\n", hello_msg.c_str( ) ); if ( hello_msg != "hello" ) return false; auto username = get_msg( ); if ( username != "friendly" ) return false; printf( "correct username\n" ); send_msg( "correct username" ); auto password = get_msg( ); if ( password != "nigger" ) return false; printf( "correct password\n" ); send_msg( "correct password" ); const char* games_list = R"(games: 1: CSGO 2: CSGO (test) 3: Garry's Mod )"; send_msg( games_list ); auto game_id = get_msg( ); if ( game_id== "1" ) { printf( "csgo\n" ); send_msg( "csgo.exe" ); } else if ( game_id == "2" ) { printf( "csgo test\n" ); send_msg( "csgo.exe" ); } else if ( game_id == "3" ) { printf( "gmod\n" ); send_msg( "hl2.exe" ); } else { printf( "invalid\n" ); return false; } auto found = get_msg( ); if ( found != "found" ) return false; printf( "process found\n" ); if ( game_id == "3" ) { // test. make sure the file is in ur directory auto file = std::ifstream( "gmod.dll", std::ifstream::binary ); if ( file.is_open( ) ) { file.seekg( 0, file.end ); auto size = ( int )file.tellg( ); auto buffer = std::make_unique< char[ ] >( size ); memset( buffer.get( ), 0, size ); file.seekg( 0, file.beg ); file.read( buffer.get( ), size ); send_msg( ( uint8_t* )buffer.get( ), size ); file.close( ); } } return true; }