Guest User

Untitled

a guest
Jul 16th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.18 KB | None | 0 0
  1. use strict;
  2. use threads;
  3. use threads::shared;
  4. use IO::Socket;
  5. use IO::Socket::Socks ':constants';
  6. use IO::Select;
  7.  
  8. my ($listenaddr, $listenport) = ("localhost", "12593");
  9. my $filename = "proxies.txt";
  10. my $useproxy :shared = 1;
  11. my @proxylist :shared;
  12.  
  13. sub readlist {
  14.     lock @proxylist;
  15.     open F, "<$filename";
  16.     chomp(@proxylist = <F>);
  17.     close F;
  18. }
  19.  
  20. &readlist;
  21.  
  22. threads->create(sub {
  23.     sleep(5);
  24.     \&readlist;
  25. });
  26.  
  27. my $sc_srv = IO::Socket::Socks->new(ProxyAddr => $listenaddr,
  28.                                     ProxyPort => $listenport,
  29.                                     Listen => 1,
  30.                                     SocksResolve => 1,
  31.                                     SocksVersion => 4);
  32. my $sel_srv = IO::Select->new($sc_srv);
  33. my $ss;
  34.  
  35. while(1) {
  36.     if ($sel_srv->can_read()) {
  37.         $ss = $sc_srv->accept();
  38.         if (!defined($ss)) {
  39.             next;
  40.         }
  41.         threads->create(\&do_client, $ss);
  42.     }
  43. }
  44.  
  45. sub do_client {
  46.     my $sc_in = shift;
  47.     my $sc_out;
  48.     my ($command, $remoteaddr, $remoteport, $type) = @{$sc_in->command()};
  49.     my ($proxyaddr, $proxyport);
  50.    
  51.     if($useproxy) {
  52.         lock @proxylist;
  53.         my $proxystr = shift @proxylist;
  54.         ($proxyaddr, $proxyport) = split(':', $proxystr);
  55.         push @proxylist, $proxystr;
  56.     }
  57.    
  58.     if ($command != CMD_CONNECT) {
  59.         $sc_in->command_reply(REQUEST_FAILED, $remoteaddr, $remoteport);
  60.         $sc_in->close;
  61.         return;
  62.     }
  63.    
  64.     print "connecting to $remoteaddr:$remoteport...\n";
  65.    
  66.     if(!$useproxy) {
  67.         $sc_out = IO::Socket::INET->new(PeerAddr => $remoteaddr,
  68.                                     PeerPort => $remoteport,
  69.                                     Proto => 'tcp');
  70.     }
  71.     else {
  72.         print "using proxy $proxyaddr:$proxyport\n";
  73.         $sc_out = IO::Socket::Socks->new(ProxyAddr => $proxyaddr,
  74.                                     ProxyPort => $proxyport,
  75.                                     ConnectAddr => $remoteaddr,
  76.                                     ConnectPort => $remoteport,
  77.                                     Timeout => 10);
  78.     }
  79.    
  80.     if(!$sc_out) {
  81.         $sc_in->command_reply(REQUEST_FAILED, $remoteaddr, $remoteport);
  82.         $sc_in->close;
  83.         return;
  84.     }
  85.    
  86.     $sc_in->command_reply(REQUEST_GRANTED, $remoteaddr, $remoteport);
  87.    
  88.     print "connected!\n";
  89.    
  90.     my $data;
  91.     my $size = 2048;
  92.     my $f = 1;
  93.    
  94.     while($f != 0) {
  95.         my ($sel_in, $sel_out) = (IO::Select->new($sc_in),IO::Select->new($sc_out));
  96.        
  97.         while($f && $sel_in->can_read(0.01)) {
  98.             $data = '';
  99.             $sc_in->recv($data, $size);
  100.             if(!$data) {
  101.                 $f = 0;
  102.             }
  103.             else {
  104.                 $sc_out->send($data);
  105.             }
  106.         }
  107.    
  108.         while($f && $sel_out->can_read(0.01)) {
  109.             $data = '';
  110.             $sc_out->recv($data, $size);
  111.             if(!$data) {
  112.                 $f = 0;
  113.             }
  114.             else {
  115.                 $sc_in->send($data);
  116.             }
  117.         }
  118.     }
  119.    
  120.     print "disconnected\n";
  121.    
  122.     $sc_out->close;
  123.     $sc_in->close;
  124. }
Add Comment
Please, Sign In to add comment