use strict; use Getopt::Long; use IO::Socket::Socks; $IO::Socket::Socks::SOCKS4_RESOLVE = 1; sub incmm { my ($p, $m)= @_; my $i=0 ; while ($i<@$p) { last if ($p->[$i]!=$m->[$i]); $p->[$i]= 0; $i++; } if ($i<@$p) { $p->[$i]++; return 1; } return undef; } sub expandrange { my $x= shift; if ($x =~ /^\d+$/) { return ($x); } elsif ($x =~ /^(\d+)-(\d+)$/) { return ($1 .. $2); } else { die "invalid list spec: $x\n"; } } sub expandlist { my @l; for my $r (split /,/, shift) { push @l, expandrange($r); } return @l; } sub expandip { my $ip= shift; return ($ip) if ($ip !~ /^[0-9,-]+\.[0-9,-]+\.[0-9,-]+\.[0-9,-]+$/) ; my @n; for my $x (split /\./, $ip) { push @n, [expandlist($x)]; } my @l; my @m= map { $#$_ } @n; my @p= map { 0 } @n; do { push @l, join(".", map { $n[$_][$p[$_]] } 0..$#p); } while (incmm(\@p, \@m)); return @l; } sub check { my ($ip, $port)= @_; printf("connecting $ip $port\n"); my $s= IO::Socket::Socks->new(SocksResolve=>1, ProxyAddr=>'127.0.0.1', ProxyPort=>9050, Timeout=>5, ConnectAddr=>$ip, ConnectPort=>$port); return unless $s; printf("connected\n"); $s->print("GET /ssssssss HTTP/1.0\r\nHost: localhost\r\n\r\n"); my $buf; $s->read($buf, 1024); print "====== $ip $port\n"; print $buf; print "\n"; } my $ports; GetOptions("p=s" => \$ports); for my $p (expandlist($ports)) { for my $ipstr (@ARGV) { for my $ip (expandip($ipstr)) { eval { check($ip, $p); } } } }