Народ, интересует как реализовать механизм подключения к серверу Counter-strike 1.6, из результатов снифера, понял, что там передаются специальные пакеты, а как это реализовать . Может кто подскажет?
(а вдруг ти перл знаеш?)) сорс для парсинга сервера, может тебе поможет..: 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.. может єто с протокол связано.. разбирайся)
через 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
скажи плз каким ты снифером пользовался? я вот тоже хочу проследить действия с инетом опр. программы,а не знаю чем, попадаются только LAN сниферы ((
с помощью всего вышеописанного можно только подключиться. Описания же, как отправить мессагу (для рекламы по сервакам), как передаются пинги, координаты итп нигде нет. + можно заметить что длина пакетов непостоянна. Я над этим делом уже достаточно долго работаю. ComradeBot тому пример.
Может я конечно бред говорю, но не проще заходить через саму КС? ПРосто реализовать, что бы прога вбивала в консоль игры по очереди "Connect XXXXXXXXXXXX", где ХХХ - ИП, которые будет браться из Текстового файлика( ну к примеру пока так пусть будет), затем тайм аут на секунд 30, затем через консоль "say YYYYYYYYYYYYY", где игрик - реклама... Вот принципе и все, дело за малым...
Так делать не эффективно. Намного лучше написать программу, которая будет протокол использовать. Твой вариант подойдет в том случае, если написать нужно быстро. Но тогда все работать будет намного медленней.