列表 1 use strict; use Math::VecStat qw(sum); use Crypt::CBC; use IO::Socket::INET; use Getopt::Std; use vars qw($opt_i $opt_r $opt_p $opt_t); getopts("i:r:p:t:"); use constant PORTMIN => 745; use constant KEY => "knock"; # 加密密钥 use constant CIPHER => "Blowfish"; # 加密算法 $opt_i || die "请指定本地IP"; $opt_r || die "请指定远程IP"; $opt_p || die "请指定远程端口"; defined $opt_t || die "请指定时间标志"; my $cipher = Crypt::CBC->new({key=>KEY,cipher=>CIPHER, iv=>"01234567",prepend_iv => 0}); # 要加密的数据将是我们的IP地址 + 端口 + 时间 + 校验和 my @data = (split(/\./,$opt_i),$opt_p,$opt_t); # 计算校验和并将其推入数据数组 push(@data,sum(@data) % 255); print "正在加密数据 ",join(" ",@data),"\n"; # 加密打包的数据 my $ciphertext = $cipher->encrypt(pack("C*",@data)); # 将加密的数据解包为无符号字符值 0-255 my @cipherpack = unpack("C*",$ciphertext); # 通过映射到端口 PORTMIN-PORTMIN+255 创建敲门序列 my @knocks = map {PORTMIN+$_} @cipherpack; print "敲门序列 ",int(@cipherpack)," 次敲门 ",join(" ",@knocks),"\n"; # 为序列中的每个端口创建 TCP 连接 for my $port (@knocks) { my $sock = IO::Socket::INET->new(PeerAddr => $opt_r, PeerPort => $port, Timeout => 0.5, Proto => 'tcp'); print " 已敲击 $opt_r:$port\n"; } exit 0; ### 列表 1 结束
© . All rights reserved.