cs server monitoring

Discussion in 'PHP' started by eLWAux, 9 Jan 2009.

  1. eLWAux

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

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    мониторинг КС сервера
    version 0.2

    language: perl
    $host = хост
    $port = порт

    [+] добавил: проверка на LAC защиту

    perl source:
    PHP:
    use IO::Socket;

    system('cls');
    ##########################################################################
    #####] (c)oDeD 6y eLWAux [################################################
    ##########################################################################

    ##########################################################################
    ##########################################################################
    ##########################################################################

     
    sub parce_info_2 {
          
    my $x $_[0];
          
    $x =~ /\xFF\xFF\xFF\xFF\x6D(.*)/;
          
    $x = $1;
         
    my @l=split(/\x00/,$x);
         print 
    ' Server Address   = '.@l[0]."\n";
         print 
    ' Host Name        = '.$l[1]."\n";
         print 
    ' Map Name         = '.$l[2]."\n";
         print 
    ' Game Directory   = '.$l[3]."\n";
         print 
    ' Game Description = '.$l[4]."\n";    
         print 
    ' Player Count     = '.hex(unpack('H2',substr($l[5],0,1)))."\n";
         print 
    ' Max Players      = '.hex(unpack('H2',substr($l[5],1,1)))."\n";
         print 
    ' Protocol Version = '.hex(unpack('H2',substr($l[5],2,1)))."\n";
         print 
    ' Server Type      = '.substr($l[5],3,1)."\n";
         print 
    ' Server OS        = '.substr($l[5],4,1)."\n";
         print 
    ' Modded           = '.hex(unpack('H2',substr($l[6],0,1)))."\n";
         print 
    ' Mod Website      = '.substr($l[6],1,length($l[6]))."\n";
     }
     
    ##########################################################################
    ##########################################################################
    ##########################################################################
     
     
    while (1==1){
     
     
    system('cls');
     print 
    "\n";

     print 
    " ==-=-=-=-=-=-=-==-=-==-=-==-=-= \n";
     
    $host 'game.arbital.ru';
     
    $port '27018';

     print 
    ' = '.$host.':'.$port." = \n";



     
    #=-====-==-=-
     #= CONNECT =-
     #=-=-==-===-=-=======-==-=-=-=-=--=-=
     
     
    my $sock = new IO::Socket::INET(
            
    PeerAddr=>$host,
            
    PeerPort=>$port,
            
    Proto=>'udp') || die "[-] No Server!";

     
    $cmd="\xFF\xFF\xFF\xFFTSource Engine Query\x00";
     
    syswrite $sock$cmd;
     
    sysread $sock,$x,65535
     
    parce_info_2($x);
     
     
     
    #=-===-=-
     #= LAC =-
     #=-=-==-===-=-=======-==-=-=-=-=--=-=
     
     
    $cmd="\x66\x66\x66\x66\x66\x66\x66\x66\xFF";
     
    syswrite $sock$cmd;
     
    sysread $sock,$x,65535
     if (
    $x =~/true/) {
         print 
    " [+] LAC protected!\n";
         } 
     
     
     
    #=-====-==
     #= PING =-
     #=-=-==-===-=-=======-==-=-=-=-=--=-=
     
     
    $cmd="\xFF\xFF\xFF\xFF"."ping\x00";
     
    syswrite $sock$cmd;
     
    sysread $sock,$x,65535
     
    $x =~ /\xFF\xFF\xFF\xFF(.*)\x00/;
     
    $ping hex(unpack('H2',$1));
     print 
    ' Ping             = '.$ping."\n";


     
    #=-====-==-=-
     #= CONNECT =-
     #=-=-==-===-=-=======-==-=-=-=-=--=-=
     
     
    $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;
        }
        
     
    #=-====-===-==-=
     #= GET COOKIE =-
     #=-=-==-===-=-=======-==-=-=-=-=--=-=
     
     
    $x=~/A00000000 (\d{10})\x20/;
     
    $Cookie = $1;
     print 
    ' ==-=-= You Can Connect! =-===-='."\n";
     print 
    ' Cookie           = '.$Cookie."\n";

     
    close $sock;
     print 
    " ==-=-=-=-=-=-=-==-=-==-=-==-=-= \n";
     
    sleep(5);
     }

    ##########################################################################
    ##########################################################################
    ##########################################################################
     
    #1 eLWAux, 9 Jan 2009
    Last edited: 9 Jan 2009
    3 people like this.
  2. geforse

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

    Joined:
    2 Mar 2008
    Messages:
    617
    Likes Received:
    290
    Reputations:
    1
    Полезная весч ... но можно и этим например ;)
     
  3. eLWAux

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

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    а на gametracker.com ти где сорси увидел?)))
    плюс мои на perl (что гарантирует бистроту рототи) =P
     
    1 person likes this.
  4. Jer1cho

    Jer1cho Member

    Joined:
    6 Jun 2008
    Messages:
    209
    Likes Received:
    65
    Reputations:
    10
    Странный пакет он отправляет на запрос инфы сервера, давно снифил отправлял такое:

    \xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00


    Попробуй этим заменить $cmd="\xFF\xFF\xFF\xFF"."TSource Engine Query\x00";
     
  5. oRb

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

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    581
    Reputations:
    256
    Скрипт под 47 протокол, в 48 другая структура.
    Вот наваял на php, держит оба протокола. Думаю ТС разберется и у себя подправит на перле.
    PHP:
    <?
    $server['ip'] = "game.arbital.ru";$server['port'] = 27018;
    //$server['ip'] = "csdm.ru";$server['port'] = 27015;
    $fp fsockopen('udp://'.$server['ip'], $server['port']);
    stream_set_timeout($fp2);
    if(
    $fp)
    {
        
    fwrite($fp,"\xFF\xFF\xFF\xFFTSource Engine Query\x00\r");
        
    $temp fread($fp5);
        
    $status socket_get_status($fp);
        if(
    $status['unread_bytes']<1)
            continue;
        
    $temp fread($fp$status['unread_bytes']);
        
    $array = array();
        
    $pos 0;
        while(
    $pos !== false)
        {
            
    $pos2 strpos($temp"\0"$pos+1);
            
    $array[] = substr($temp$pos+1$pos2-$pos)."\n";
            
    $pos $pos2;
        }
        if(
    trim($array[2]) == 'cstrike')
        {
            
    $server['players']    = ord($array[5][0]);
            
    $server['maxplayers']    = ord($array[5][1]);
            
    $server['name']    = trim($array[0]);
            
    $server['map']    = trim($array[1]);
        }
        else
        {
            
    $server['players']    = ord($array[5][0]);
            
    $server['maxplayers']    = ord($array[5][1]);
            
    $server['name']    = trim($array[1]);
            
    $server['map']    = trim($array[2]);
        }
    }
    print_r($server);
    ?>
     
  6. eLWAux

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

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    oRb, спасибо, ТС розобрался), и щас себе подправит скрипт.. ;)
     
  7. eLWAux

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

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    UP

    обновил скрипт
    [+] добавил проверку на LAC защиту
     
  8. MaTpOc

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

    Joined:
    5 May 2008
    Messages:
    633
    Likes Received:
    475
    Reputations:
    25
    А куда ложить этот скрипт чтоб он заработал а то я совсес в этом деле новичек(?
     
  9. eLWAux

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

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    качаеш перл: http://www.perl.org/get.html
    или activeperl: http://www.activestate.com/activeperl/?psbx=1
    инстал..

    и сохраняеш мой скрипт как: cs_server.pl
    и запускаеш