Counter Strike

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ronald, 4 Dec 2008.

  1. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    42
    Reputations:
    6
    Народ, интересует как реализовать механизм подключения к серверу Counter-strike 1.6, из результатов снифера, понял, что там передаются специальные пакеты, а как это реализовать :confused: . Может кто подскажет?
     
    1 person likes this.
  2. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    передать такие же пакеты.
     
  3. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    (а вдруг ти перл знаеш?))

    сорс для парсинга сервера, может тебе поможет..:
    Code:
    use IO::Socket;
    
    system('cls');
    ##########################################################################
    #####] (c)oDeD 6y eLWAux [################################################
    ##########################################################################
    
    ##########################################################################
    ##########################################################################
    ##########################################################################
    
     sub readFile {
     	open myFILE, "<$_[0]" or die $!;
     	while (<myFILE>) { chomp; $res.=$_; }
     	return $res;
     	close myFILE;
    	}
    
     sub saveFile {
    	open(myFILE,">$_[0]") || die "error: $!";
    	print myFILE $_[1];
    	close(myFILE);
    	} 
    
     sub p { print '>'.$_[0]."<\n" }
    
     sub parce_info_1 {
    	 my $x = $_[0];
    
    	 $x =~ /\xFF\xFF\xFF\xFFm$host.$port\x00(\D+)/;
    	 $Host_Name = $1.substr($',0,(index $',"\x00"));
    
    	 $x = substr($x, 8+length($host.$port.$Host_Name),999);
    	 $Map_Name = substr($x,0,(index $x,"\x00"));
    
    	 $x = substr($x, length($Map_Name)+1, 999);
    	 $Game_Dir = substr($x,0,(index $x,"\x00"));
    
    	 $x = substr($x, length($Game_Dir)+1, 999);
    	 $Game_Desc = substr($x,0,(index $x,"\x00"));
    	
    	 $x = substr($x, length($Game_Desc)+1, 999);
    	 $Now_Players = hex(unpack('h',substr($x,0,1)));
    	 $Max_Players = hex(unpack('H2',substr($x,1,1))); #???
    	 $Protocol = hex(unpack('H2',substr($x,2,1)));
    	 $S_type = substr($x,3,1);
    		if ($S_type eq 'l') {$S_type='listen'}
    		elsif ($S_type eq 'd') {$S_type='dedicated'}
    	 $S_OS = substr($x,4,1);
    		if ($S_OS eq 'l') {$S_OS='linux'}
    		elsif ($S_OS eq 'w') {$S_OS='windows'}
    	 $Passw = hex(unpack('H2',substr($x,5,1)));
    		if ($Passw==0) {$Passw='no'} else {$Passw='yes'}
    	 $Modded = hex(unpack('H2',substr($x,6,1)));
    		if ($Modded==0) {$Modded='no'} else {$Modded='yes'}
    
    	 $x = substr($x,7,999);
    	 $Mod_url = substr($x,0,(index $x,"\x00"));
    
    	 $x = substr($x,length($Mod_url)+1,999);
    	 $Mod_dwn = substr($x,0,(index $x,"\x00"));
    
    	 $x = substr($x,length($Mod_dwn)+1,999);
    
    	 $x = substr($x,length($x)-2,1);
    		if ($x==0) {$Secure = 'no'} else {$Secure = 'yes'}
    	 
    	 p('Secure         : '.$Secure      );
    	 p('Mod_dwn        : '.$Mod_dwn     );
    	 p('Mod_url        : '.$Mod_url     );
    	 p('Modded         : '.$Modded      );
    	 p('Passw          : '.$Passw       );
    	 p('S_OS           : '.$S_OS        );
    	 p('S_type         : '.$S_type      );
    	 p('Protocol       : '.$Protocol    );
    	 p('NowPlayers     : '.$Now_Players );
    	 p('MaxPlayers     : '.$Max_Players );
    	 p('HostName       : '.$Host_Name   );
    	 p('MapName        : '.$Map_Name    );
    	 p('GameDirectory  : '.$Game_Dir    );
    	 p('GameDescription: '.$Game_Desc   );
    	}
    ##########################################################################
    ##########################################################################
    ##########################################################################
     
     system('cls');
    
     $host = '85.214.34.55';
     $port = '27018';
    
     print '[i] '.$host.':'.$port."\n";
    
     my $sock = new IO::Socket::INET(
    		PeerAddr=>$host,
    		PeerPort=>$port,
    		Proto=>'udp') || die "[-] No Server!";
    
     $cmd="\xFF\xFF\xFF\xFF"."TSource Engine Query\x00";
     syswrite $sock, $cmd;
     sysread $sock,$x,65535; 
     #saveFile('f1.txt',$x);
     parce_info_1($x);
    
    
     $cmd="\xFF\xFF\xFF\xFF"."ping\x00";
     syswrite $sock, $cmd;
     sysread $sock,$x,65535; 
     #saveFile('ping.txt',$x);
    
    
     $cmd="\xFF\xFF\xFF\xFF"."getchallenge\x00";
     syswrite $sock, $cmd;
     sysread $sock,$x,65535;
     if ($x =~ /SERVERISFULL/) {
    	print "[-] Server is full!\n";
    	exit;
    	}
     elsif ($x =~ /BADPASSWORD/) {
    	print "[-] Bad password!\n";
    	exit;
    	}
     $x=~/A00000000 (\d{10})\x20/;
     $Cookie = $1;
     p('Cookie         : '.$Cookie);
     #saveFile('f2.txt',$x);
    
     close $sock; 
    
    ##########################################################################
    ##########################################################################
    ##########################################################################
    кстате, на форуме я уже поднимал похожий вопрос:
    https://forum.antichat.ru/thread93517.html

    и там мне дали линки:
    http://dev.int64.org/docs/gamestat-protocols/halflife.html
    http://developer.valvesoftware.com/wiki/Server_Queries
    http://developer.valvesoftware.com/wiki/Special:Search?search=protocol&go=Go
    http://dump.ru/file/1249347 php class для работи с cs протоколом

    вот что я сам нашел: http://www.securitylab.ru/analytics/216301.php лучшее!

    и.. у меня возникли проблеми с отправкой пакетов "players" и "inforstring".. х3.. может єто с протокол связано..

    разбирайся)
     
    #3 eLWAux, 4 Dec 2008
    Last edited: 4 Dec 2008
    1 person likes this.
  4. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    через Delphi тебе надо сделать подключения через socket'и и отправлять некоторые пакети на серв.. ищи доки.. вот несколько:
    http://www.example-code.com/delphi/socket.asp
    http://forum.telenet.ru/index.php?showtopic=64203&st=0&p=1053520&#entry1053520
    вот ирка: http://forum.sources.ru/index.php?showtopic=53816
    http://faqs.org.ru/progr/pascal/delphi_internet2.htm
    поищи на delphisources.ru примери..

    описания пакетов тут: http://dev.int64.org/docs/gamestat-protocols/halflife.html
     
    1 person likes this.
  5. cylaaaan

    cylaaaan Elder - Старейшина

    Joined:
    31 Aug 2006
    Messages:
    0
    Likes Received:
    44
    Reputations:
    8
    скажи плз каким ты снифером пользовался?
    я вот тоже хочу проследить действия с инетом опр. программы,а не знаю чем, попадаются только LAN сниферы ((
     
  6. vikseriq

    vikseriq Elder - Старейшина

    Joined:
    31 Jul 2008
    Messages:
    118
    Likes Received:
    44
    Reputations:
    2
    Wireshark, Iris
     
  7. ronald

    ronald Elder - Старейшина

    Joined:
    27 Mar 2008
    Messages:
    252
    Likes Received:
    42
    Reputations:
    6
    EtherDetect, ток у меня демка на 30 дней, аднако ломается простой переставкой системного времени
     
  8. th13fnano

    th13fnano New Member

    Joined:
    8 Dec 2008
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    MultiSniffer - сниферитт все tcp пакеты - есть еще на фикипедии опенсорс сниффер погугли
     
  9. vvs777

    vvs777 Elder - Старейшина

    Joined:
    16 Nov 2004
    Messages:
    394
    Likes Received:
    213
    Reputations:
    4
    с помощью всего вышеописанного можно только подключиться.
    Описания же, как отправить мессагу (для рекламы по сервакам), как передаются пинги, координаты итп нигде нет. + можно заметить что длина пакетов непостоянна.
    Я над этим делом уже достаточно долго работаю.

    ComradeBot тому пример.
     
  10. A_V

    A_V Elder - Старейшина

    Joined:
    18 Feb 2008
    Messages:
    106
    Likes Received:
    34
    Reputations:
    0
    Может я конечно бред говорю, но не проще заходить через саму КС?
    ПРосто реализовать, что бы прога вбивала в консоль игры по очереди "Connect XXXXXXXXXXXX", где ХХХ - ИП, которые будет браться из Текстового файлика( ну к примеру пока так пусть будет), затем тайм аут на секунд 30, затем через консоль "say YYYYYYYYYYYYY", где игрик - реклама...

    Вот принципе и все, дело за малым...
     
  11. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Так делать не эффективно. Намного лучше написать программу, которая будет протокол использовать. Твой вариант подойдет в том случае, если написать нужно быстро. Но тогда все работать будет намного медленней.
     
  12. x59

    x59 New Member

    Joined:
    5 Jan 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    на valve.developer написано что весь траф жмется Bzip2, так ли это?