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

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++...

    LWP-UserAgent-ProxyAny-1.02.tar.gz

    5. 最后,使用`make install`将模块安装到Perl的搜索路径中,以便在其他脚本中使用。 在标签中提到的"linux"意味着这个模块主要适用于Linux操作系统,因为Perl和相关工具在该平台上广泛使用。"perl"标签确认这是...

    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的可选授权

    Apache2.2.chm.rar

    7. **代理功能**:mod_proxy模块在Apache 2.2中得到加强,支持HTTP、FTP、SOCKS等协议的代理服务,可以用于负载均衡和缓存。 8. **FastCGI支持**:与PHP、Perl等脚本语言的集成更加顺畅,特别是对FastCGI的支持,...

    curl-libcurl

    6. **代理支持**:支持通过HTTP、SOCKS等代理进行网络访问。 7. **认证机制**:支持多种认证机制,如Basic、Digest、NTLM、Kerberos等。 8. **非阻塞I/O**:支持异步非阻塞I/O,提高程序运行效率。 9. **广泛的错误...

    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 ...

    常用Python爬虫库汇总.pdf

    - **PySocks**: 为Python提供SOCKS代理支持。 - **treq/aiohttp**: 异步HTTP客户端,基于Tornado和asyncio,用于处理并发请求。 2. **Python 网络爬虫框架**: - **Scrapy**: 功能齐全的爬虫框架,提供中间件、...

    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 ...

Global site tag (gtag.js) - Google Analytics