SOCKS4/5 Sorter + checker

Discussion in 'PHP' started by biophreak, 14 Feb 2008.

  1. biophreak

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

    Joined:
    3 Aug 2007
    Messages:
    348
    Likes Received:
    63
    Reputations:
    15
    [PERL] SOCKS4/5 Sorter + checker

    Для упрощения себе жизни сделал сортировщик и чекер листов соксов:
    1. Определяет тип прокси (SOCKS4/SOCKS5)
    2. Пытается проломится на него в гугл, принтит, если прокси валидный( читайте публичный), при остальных "ошибках"(таких как запрос авторизации, идента, GSSAPI авторизация итд) не принтит прокси.
    Юзать: ./socks.pl list.txt (можно еще некоторые параметры указать, для списка - просто запустите скрипт без параметров), где list.txt - файл с соксами в формате ип:порт.

    UPDATE: Таки выдалось немного времени - прикрутил треды и еще немножко удобностей :)
    Знаю что немного пизд*цкое распределение проксей между потоками, но что сделаешь - мозгов пока что хватило только на это :)
    Сделал нормальные таймауты...

    Скрипт не требует никаких дополнительных модулей )
    ЗЫЖ Адекватные отзывы и предложения приветствуются
    PHP:
    #!perl -s
    # SOCKS4/4a/5 Checker v1.1
    # (C) by biophreak
    # Thnx: KSURi, nekd0 for help.
    # Yeah, i know about ugly proxy distribution between threads :)
    use warnings 'all'; 
    use 
    strict;
    use 
    diagnostics;
    use 
    Socket;
    use 
    Fcntl;
    use 
    Errno;
    use 
    threads;
    $| = 
    1;

    my %SOCKS4_CONNECT_RESPONSES = (
        
    90 => "request granted",
        
    91 => "request rejected or failed",
        
    92 => "request rejected, ident required",
        
    93 => "request rejected, ident mismatch"
    );
    my %SOCKS5_METHODS = (
        
    0 => "no authentication required",
        
    1 => "GSSAPI",
        
    2 => "username/password",
        
    255 => "no acceptable methods"
    );
    my %SOCKS5_CONNECT_RESPONSES = (
        
    0 => "succeeded",
        
    1 => "general SOCKS server failure",
        
    2 => "connection not allowed by ruleset",
        
    3 => "Network unreachable",
        
    4 => "Host unreachable",
        
    5 => "Connection refused",
        
    6 => "TTL expired",
        
    7 => "Command not supported",
        
    8 => "Address type not supported",
        
    90 => "Protocol mismatch",
        
    112 => "Protocol mismatch"
    );
    my $sockslist = shift || exit print "[ERROR] Specify sockslist!\n$0 <socks list> [threads num](default: 50) [connection timeout](default: 10) [socks4 sorted list](default: socks4.txt) [socks5 sorted list](default: socks5.txt)\n";
    my $threads = shift || 50;
    my $timeout = shift || 10;
    my $s4l = shift || 'socks4.txt';
    my $s5l = shift || 'socks5.txt';
    open my $S, '<', $sockslist or die "Cannot open file $sockslist ($!)\n";
    my @socks = <$S> and close $S;
    open my $S4,'>>', $s4l or die "Cant open/create SOCKS4 file ($!)\n";
    open my $S5,'>>', $s5l or die "Cant open/create SOCKS4 file ($!)\n";
    my($answer,@thr,%spl_socks);
    my $proxyperthr = (scalar(@socks) / $threads);

    (print 
    "Threads are more then proxys =)\nSetting threads to ".scalar@socks."\n" and $threads = scalar@socks) if($threads > scalar@socks);

    for(
    my $i = 1;$i <= $threads;$i++) 
    {
        
    last if scalar @socks <= 0;
        
    push(@{$spl_socks{"sock".$i}},shift @socks) for(1..$proxyperthr);
        
    push(@{$spl_socks{"sock".$i}},shift @socks) if(scalar @socks > 0 and scalar @socks > 2*$proxyperthr);
        
    push(@{$spl_socks{"sock".$i}}, @socks) if($i == $threads and scalar @socks > 0);
    }
    foreach 
    my $sck(%spl_socks)
    {
        
    threads->create(\&ch,@{$spl_socks{$sck}}) if exists $spl_socks{$sck};
    }
    $_->join foreach(threads->list);
    close $S5;
    close $S4;
    undef %spl_socks;

    sub ch
    {
        
    my @soc = @_;
        
    CHECK:
        for(
    0..$#soc) 
        
    { 
            if(
    $soc[$_])
            {
                
    my ($server, $port) = split ':', shift @soc; 
                
    $server =~ s/\r+|\n+|\s+//go;
                    
    $port =~ s/\r+|\n+|\s+//go;
                    
    checkSocks($server,$port);
              }
        }
    }

    sub checkSocks
    {
        
    my($server,$port) = @_;
        
    socket(SOCK, AF_INET, SOCK_STREAM, 6) or ret("[ERROR] Cannot open socket ($!)\n"); 
        
    fcntl(SOCK, F_SETFL, O_NONBLOCK) or ret("[ERROR]:[FCNTL] ($!)\n");
        
    unless (connect(SOCK, sockaddr_in($port, inet_aton($server)))) 
        {
            
    Errno::EINPROGRESS == $! or Errno::EWOULDBLOCK or ret("[ERROR] Cannot connect to $server:$port ($!)\n");
            
    vec(my $win = '', fileno(SOCK), 1) = 1;
            
    ret("[ERROR] $server:$port : timed out\n") unless (select(undef, $win, undef, $timeout));
            if (
    defined (my $ret = getsockopt(SOCK, SOL_SOCKET, SO_ERROR))) 
            {
                
    ret("[ERROR] Connection to $server:$port failed ($!)\n") if $! = unpack('i', $ret);
            } 
    elsif (!getpeername(SOCK)) 
            {
                (goto 
    CHECK and close SOCK);
            
    ret("[ERROR] Connection to $server:$port failed ($!)\n");
            }
         }
        
    fcntl(SOCK, F_SETFL, 0);
        
    select((select(SOCK), local $| = 1)[0]);
        print 
    SOCK pack("CCC",5,1,0); 
        
    sysread(SOCK,$answer,32) or (ret("[ERROR] Cannot read from socket ($server:$port) ($!)\n")); 
        
    close SOCK;
        if(
    unpack('C',$answer) eq 5 or $answer eq pack('C',5) or $answer eq pack('C',05)) { checkSocks5($server,$port) }
        
    elsif(unpack('C', $answer) eq 0 or $answer eq pack('C',0) or $answer eq pack('C',00)) { checkSocks4($server,$port) }
        else {
    ret("[WARN] $server:$port is not a SOCKS4/SOCKS4a/SOCKS5\n") }
    }

    sub checkSocks5
    { 
        
    my($server,$port) = @_;
        
    my($mssg, $repcode);
        
    socket(SOCK, AF_INET, SOCK_STREAM, 6) or ret("[ERROR] Cannot open socket ($!)\n");
        
    connect(SOCK, sockaddr_in($port, inet_aton($server))) or ret("[ERROR] Cannot connect to $server:$port ($!)\n");
        
    select((select(SOCK), local $| = 1)[0]);
        print 
    SOCK pack("CCC", 5, 1, 0) or ret("[ERROR] Cannot send to socket ($server:$port) ($!)\n");
        
    sysread(SOCK,$mssg,32) or ret("[ERROR] Cannot read from socket ($server:$port) ($!)\n");
        
    $repcode = (unpack("C*", $mssg))[1]; 
        
    ret("[WARN] $server:$port is SOCKS5 proxy,but is not usable ($repcode - $SOCKS5_METHODS{$repcode})\n") unless($repcode == 0); 
        print 
    SOCK pack("CCCCa4n", 5, 1, 0, 1, inet_aton('64.233.167.99'), 80) or ret("[ERROR] Cannot send to socket ($server:$port) ($!)\n");
        
    sysread(SOCK,$mssg,32) or ret("[ERROR] Cannot read from socket ($server:$port) ($!)\n");
        
    $repcode = (unpack("C*", $mssg))[1];
        
    ret("[WARN] $server:$port is SOCKS5 proxy,but is not usable ($repcode - $SOCKS5_CONNECT_RESPONSES{$repcode})\n") unless($repcode == 0); 
        print 
    "[+] $server:$port is good SOCKS5 proxy\n";
        print 
    $S5 $server.':'.$port."\n";
        
    close SOCK; 
    } 

    sub checkSocks4 
    { 
        
    my($server,$port) = @_;
        
    my($mssg, $repcode);
        
    socket(SOCK, AF_INET, SOCK_STREAM, 6) or ret("[ERROR] Cannot open socket ($!)\n");
        
    connect(SOCK, sockaddr_in($port, inet_aton($server))) or ret("[ERROR] Cannot connect to $server:$port ($!)\n");
        
    select((select(SOCK), local $| = 1)[0]);
        print 
    SOCK pack("CCnA4x", 4, 1, 80, inet_aton('64.233.167.99')); 
        
    sysread(SOCK,$mssg,32) or ret("[ERROR] Cannot send to socket ($server:$port) ($!)\n");
        
    $repcode = (unpack("C*", $mssg))[1]; 
        
    ret("[WARN] $server:$port is SOCKS4/4a proxy,but is not usable ($repcode - $SOCKS4_CONNECT_RESPONSES{$repcode})\n") unless ($repcode == 90); 
        print 
    "[+] $server:$port is good SOCKS4/SOCKS4a proxy\n";
        print 
    $S4 $server.':'.$port."\n";
        
    close SOCK; 
    }

    sub ret
    {
        print @
    _;
        
    close SOCK;
        goto 
    CHECK;
    }
    Скачать
     
    #1 biophreak, 14 Feb 2008
    Last edited: 21 Jul 2008
    1 person likes this.
  2. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    >> # Todo: print results to text files, use threads

    ну так сразу б уже и сделал, там делов на 10 минут.. )

    заместо
    Code:
    ...
    for (my $i=0; $i < scalar @socks; $i++) 
    { 
        my ($server, $port) = split(/:/, $socks[$i]);
    ...
    лучше использовать нечто вроде
    Code:
    ...
    while (scalar @socks) {
     my ($server, $port) = split(/:/, shift @socks);
    ...
    особенно если треды заюзаешь..
     
  3. biophreak

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

    Joined:
    3 Aug 2007
    Messages:
    348
    Likes Received:
    63
    Reputations:
    15
    Обновил чекер, что именно - в первом посте, тред ап! :)
     
  4. mff

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

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    Замечательно!
     
  5. Dragon_X

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

    Joined:
    12 Nov 2007
    Messages:
    0
    Likes Received:
    2
    Reputations:
    5
    молодец)