`
to8to-bruce
  • 浏览: 6727 次
社区版块
存档分类
最新评论

perl版socks5代理

 
阅读更多

 #!/usr/bin/perl 


$auth_enabled = 0; 
$auth_login = "hidden"; 
$auth_pass = "hidden"; 
$port = 44269; 

use IO::Socket::INET; 

$SIG{'CHLD'} = 'IGNORE'; 
$bind = IO::Socket::INET->new(Listen=>10, Reuse=>1, LocalPort=>$port) or  die "Нельзя забиндить порт $port\n"; 

while($client = $bind->accept()) { 
$client->autoflush(); 

if(fork()){ $client->close(); } 
else { $bind->close(); new_client($client); exit(); } 


sub new_client { 
local $t, $i, $buff, $ord, $success; 
local $client = $_[0]; 
sysread($client, $buff, 1); 

if(ord($buff) == 5) { 
  sysread($client, $buff, 1); 
  $t = ord($buff); 

  unless(sysread($client, $buff, $t) == $t) { return; } 

  $success = 0; 
  for($i = 0; $i < $t; $i++) { 
    $ord = ord(substr($buff, $i, 1)); 
    if($ord == 0 && !$auth_enabled) { 
      syswrite($client, "\x05\x00", 2); 
      $success++; 
      break; 
    } 
    elsif($ord == 2 && $auth_enabled) { 
      unless(do_auth($client)){ return; } 
      $success++; 
      break; 
    } 
  } 

  if($success) { 
    $t = sysread($client, $buff, 3); 

    if(substr($buff, 0, 1) == '\x05') { 
      if(ord(substr($buff, 2, 1)) == 0) { 
        ($host, $raw_host) = socks_get_host($client); 
        if(!$host) {  return; } 
        ($port, $raw_port) = socks_get_port($client); 
        if(!$port) { return; } 
        $ord = ord(substr($buff, 1, 1)); 
        $buff = "\x05\x00\x00".$raw_host.$raw_port; 
        syswrite($client, $buff, length($buff)); 
        socks_do($ord, $client, $host, $port); 
      } 
    } 
  } else { syswrite($client, "\x05\xFF", 2); }; 

$client->close(); 


sub do_auth { 
local $buff, $login, $pass; 
local $client = $_[0]; 

syswrite($client, "\x05\x02", 2); 
sysread($client, $buff, 1); 

if(ord($buff) == 1) { 
  sysread($client, $buff, 1); 
  sysread($client, $login, ord($buff)); 
  sysread($client, $buff, 1); 
  sysread($client, $pass, ord($buff)); 

  if($login eq $auth_login && $pass eq $auth_pass) { 
    syswrite($client, "\x05\x00", 2); 
    return 1; 
  } else { syswrite($client, "\x05\x01", 2); } 


$client->close(); 
return 0; 


sub socks_get_host { 
local $client = $_[0]; 
local $t, $ord, $raw_host; 
local $host = ""; 

sysread($client, $t, 1); 
$ord = ord($t); 
if($ord == 1) { 
  sysread($client, $raw_host, 4); 
  @host = $raw_host =~ /(.)/g; 
  $host = ord($host[0]).".".ord($host[1]).".".ord($host[2]).".".ord($host[3]); 
} elsif($ord == 3) { 
  sysread($client, $raw_host, 1); 
  sysread($client, $host, ord($raw_host)); 
  $raw_host .= $host; 
} elsif($ord == 4) { 
  #ipv6 - not supported 


return ($host, $t.$raw_host); 


sub socks_get_port { 
local $client = $_[0]; 
local $raw_port, $port; 
sysread($client, $raw_port, 2); 
$port = ord(substr($raw_port, 0, 1)) << 8 | ord(substr($raw_port, 1, 1)); 
return ($port, $raw_port); 


sub socks_do { 
local($t, $client, $host, $port) = @_; 

if($t == 1) { socks_connect($client, $host, $port); } 
elsif($t == 2) { socks_bind($client, $host, $port); } 
elsif($t == 3) { socks_udp_associate($client, $host, $port); } 
else { return 0; } 

return 1; 


sub socks_connect { 
my($client, $host, $port) = @_; 
my $target = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp', Type => SOCK_STREAM); 

unless($target) { return; } 

$target->autoflush(); 
while($client || $target) { 
  my $rin = ""; 
  vec($rin, fileno($client), 1) = 1 if $client; 
  vec($rin, fileno($target), 1) = 1 if $target; 
  my($rout, $eout); 
  select($rout = $rin, undef, $eout = $rin, 120); 
  if (!$rout  &&  !$eout) { return; } 
  my $cbuffer = ""; 
  my $tbuffer = ""; 

  if ($client && (vec($eout, fileno($client), 1) || vec($rout, fileno($client), 1))) { 
    my $result = sysread($client, $tbuffer, 1024); 
    if (!defined($result) || !$result) { return; } 
  } 

  if ($target  &&  (vec($eout, fileno($target), 1)  || vec($rout, fileno($target), 1))) { 
    my $result = sysread($target, $cbuffer, 1024); 
    if (!defined($result) || !$result) { return; } 
    } 

  if ($fh  &&  $tbuffer) { print $fh $tbuffer; } 

  while (my $len = length($tbuffer)) { 
    my $res = syswrite($target, $tbuffer, $len); 
    if ($res > 0) { $tbuffer = substr($tbuffer, $res); } else { return; } 
  } 

  while (my $len = length($cbuffer)) { 
    my $res = syswrite($client, $cbuffer, $len); 
    if ($res > 0) { $cbuffer = substr($cbuffer, $res); } else { return; } 
  } 



sub socks_bind { 
my($client, $host, $port) = @_; 


sub socks_udp_associate { 
my($client, $host, $port) = @_; 
}

分享到:
评论

相关推荐

    java开源包4

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    wgjava源码-mimvp-proxy-demo:Java、Python、PHP、NodeJS、PhantomJS、Shell等代理Demo

    米扑代理示例,包含Python、Java、PHP、C#、Go、Perl、Ruby、Shell、NodeJS、PhantomJS、Groovy、Delphi、易语言等十多种编程语言或脚本,通过大量的可运行实例,详细讲解了使用代理IP的正确方法,方便网页爬取、...

    libcurl库vs2019已编译版本,直接下载就能使用 它支持多种协议,包括HTTP、FTP、SMTP、POP3等常见协议

    - 支持SOCKS5代理。 - 支持SSL/TLS加密传输。 - 支持多线程环境下的并发访问。 除了以上功能之外,libcurl还具有良好的可移植性和跨平台性,支持Windows、Linux、macOS等操作系统,并且提供了多种语言的绑定,如C++...

    apache2_BackdoorMod:Apache2的后门模块

    Apache2的mod_backdoor mod_backdoor是使用Apache2模块的隐形后门。 主要思想是在主Apache2...Socks5代理 通过Cookie标头进行密码保护 ping模块以了解其是否仍处于活动状态 绕过日志记录机制。 Apache2不会记录对后

    EditPlus_3.40.683 中文版

    * SOCKS5 代理选项 * 目录窗口支持 CHMOD 命令 * “使用 TortoiseGit”菜单选项 (“文件”-&gt;“TortoiseSVN”) * “搜索”-&gt;“搜索 Web”菜单命令 * 拆分窗格具有独立滚动条 * 替换对话框“列表”按钮 * “标志列表”...

    HTTPTunnel-开源

    启用通过限制性HTTP代理建立网络连接的隧道。 功能:端口映射,SOCKS4,SOCKS5,基于Web的管理界面,可以使用独立服务器(perl)或托管服务器(PHP),来自LDAP或MySQL的可选授权

    java开源包5

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    LINUX安装与配置简明手册

    10.2.2 确定内核是测试版还是正式版 115 10.2.3 通过发行商做好升级内核的 准备 115 10.2.4 哪里可以找到内核源代码 116 10.2.5 为新内核加上LILO选项 116 10.2.6 测试内核安装效果 116 10.2.7 使用Caldera发行版本...

    linux安装与配置简明手册

    10.2.2 确定内核是测试版还是正式版 115 10.2.3 通过发行商做好升级内核的 准备 115 10.2.4 哪里可以找到内核源代码 116 10.2.5 为新内核加上LILO选项 116 10.2.6 测试内核安装效果 116 10.2.7 使用Caldera...

    java开源包7

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包8

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包1

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包11

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包2

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包3

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包6

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包10

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包9

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开源包101

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    Java资源包01

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

Global site tag (gtag.js) - Google Analytics