biophreak
14.02.2008, 14:36
Для упрощения себе жизни сделал сортировщик и чекер листов соксов:
1. Определяет тип прокси (SOCKS4/SOCKS5)
2. Пытается проломится на него в гугл, принтит, если прокси валидный( читайте публичный), при остальных "ошибках"(таких как запрос авторизации, идента, GSSAPI авторизация итд) не принтит прокси.
Юзать: ./socks.pl list.txt (можно еще некоторые параметры указать, для списка - просто запустите скрипт без параметров), где list.txt - файл с соксами в формате ип:порт.
UPDATE: Таки выдалось немного времени - прикрутил треды и еще немножко удобностей :)
Знаю что немного пизд*цкое распределение проксей между потоками, но что сделаешь - мозгов пока что хватило только на это :)
Сделал нормальные таймауты...
Скрипт не требует никаких дополнительных модулей )
ЗЫЖ Адекватные отзывы и предложения приветствуются
#!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;
}
Скачать (http://phreak.nkoort.ru/sockschecker.txt)
1. Определяет тип прокси (SOCKS4/SOCKS5)
2. Пытается проломится на него в гугл, принтит, если прокси валидный( читайте публичный), при остальных "ошибках"(таких как запрос авторизации, идента, GSSAPI авторизация итд) не принтит прокси.
Юзать: ./socks.pl list.txt (можно еще некоторые параметры указать, для списка - просто запустите скрипт без параметров), где list.txt - файл с соксами в формате ип:порт.
UPDATE: Таки выдалось немного времени - прикрутил треды и еще немножко удобностей :)
Знаю что немного пизд*цкое распределение проксей между потоками, но что сделаешь - мозгов пока что хватило только на это :)
Сделал нормальные таймауты...
Скрипт не требует никаких дополнительных модулей )
ЗЫЖ Адекватные отзывы и предложения приветствуются
#!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;
}
Скачать (http://phreak.nkoort.ru/sockschecker.txt)