- 论坛徽章:
- 1
|
参考@coolend兄的帖子:http://bbs.chinaunix.net/thread-1825007-1-1.html
修正了64位系统下Perl的兼容性问题
修正了最后没有confirm的问题(花生壳协议更新)
修正了一定几率提交失败的问题(花生壳的文档里加密串ror没有提到的一个暗雷)
打算用它结合树莓派搭建一个git服务器
有花生壳的朋友可以试试。- #!/usr/bin/perl
- use strict;
- use IO::Socket::INET;
- use MIME::Base64 qw(encode_base64 decode_base64);
- use Digest::HMAC_MD5 qw(hmac_md5);
- my $serverip = "ph051.oray.net";
- my $port = '6060';
- ### 登录用户名和密码
- my $user = '花生壳账户';
- my $pass = '密码';
- my $domain ='花生壳域名.xicp.net';
- my $sock = IO::Socket::INET->new(
- PeerAddr => $serverip,
- PeerPort => $port,
- Proto => 'tcp',
- ) or die "ERR: unable to connect to server $! \n";
- my $msg;
- $sock->recv($msg,128);
- die "ERR: server not response ! \n" if (! $msg);
- print $msg;
- ## 发送验证请求
- print $sock "auth router6\n";
- $sock->recv($msg,128);
- print $msg;
- ## BASE64 解码
- $msg =~ s/^\d+\s+//;
- my $reply = decode_base64($msg);
- print "Reply message content is: ",unpack("H*",$reply),"\n";
- ## 服务器时间是挑战串的第六字节后的4个字节
- my $stime = substr($reply,6,4);
- my $tm_stime = unpack("H*",$stime);
- $tm_stime =~ s/^(\w{2})(\w{2})(\w{2})(\w{2})$/$4$3$2$1/;
- $tm_stime = hex($tm_stime);
- ## 打印下服务器的时间,便于调试
- print "Server time is $tm_stime, ",&timenow($tm_stime),"\n";
- ### 以下信息从 “笑行天下” 的 DDNS代码中借用的
- my $client_ID = "0x26A0"; # 客户端ID
- my $client_VER = "0x9899"; # 客户端版本
- my $auth_KEY = "0x1E0808B7"; # 嵌入认证密码
- ### 客户端信息为客户端ID+版本号,共4字节
- my $client_info = ((hex($client_ID) & 0xFFFF) << 16) | (hex($client_VER) & 0xFFFF);
- ## 转换为16进制
- $client_info = sprintf ("%x",$client_info);
- $client_info =~ s/^(\w{2})(\w{2})(\w{2})(\w{2})$/$4$3$2$1/;
- print "Client INFO: $client_info\n";
- my $auth_key = hex($auth_KEY);
- ## 嵌入认证码与时间的取反进行或运算后循环右移
- $tm_stime = $tm_stime | (~$auth_key)&0xFFFFFFFF;
- printf ("%032b \n",$tm_stime);
- print "Positive: $tm_stime\n";
- ### 右移位数是用服务器时间整除30后的余数
- my $mv = $tm_stime % 30;
- print "Original Movebit: $mv\n";
- $mv+=2 if $mv>16; ####暗雷
- print "Adjusted Movebit: $mv\n";
- my $auth_enc=ror($tm_stime,($mv),32);
- $auth_enc &= 0xFFFFFFFF;
- printf ("%032b\n",$auth_enc);
- $auth_enc &= 0xFFFFFFFF;
- $auth_enc = sprintf ("%x",$auth_enc);
- $auth_enc =~ s/^(\w{2})(\w{2})(\w{2})(\w{2})$/$2$1$4$3/;
- print "AUTH_ENC: $auth_enc\n";
- ## 加密串
- my $enc_str = unpack("H*",hmac_md5($pass, $reply));
- print "ENC STR: $enc_str\n";
- my $header = pack("H*","$auth_enc$client_info$enc_str");
- print "HEADER: " . unpack("H*",$header) , " LEN: " , length($header),"\n";
- ## 生成回应串用BASE64编码
- my $lines = join('',$user,' ',$header);
- my $base64 = encode_base64 $lines;
- print "Send BASE64: $base64\n";
- ### 发送给服务端
- print $sock "$base64\n";
- $sock->recv($msg,128);
- print $msg;
- ### 注册域名
- print $sock "regi a $domain\n";
- $sock->recv($msg,128);
- print $msg;
- ### 确认
- print $sock "cnfm\n";
- $sock->recv($msg,128);
- print $msg;
- ## 退出
- print $sock "quit\n";
- $sock->shutdown(1);
- $sock->close();
- sub rol { return ($_[0]<<$_[1] | $_[0]>>($_[2]-$_[1])) & (2**$_[2]-1); }
- sub ror { return ($_[0]>>$_[1] | $_[0]<<($_[2]-$_[1])) & (2**$_[2]-1); }
- sub timenow {
- my $tm = time();
- my ($sec,$min,$hur,$day,$mon,$year) = (localtime($tm))[0,1,2,3,4,5];
- $year += 1900; ++ $mon ;
- return sprintf ("%02u-%02u-%02u %02u:%02u:%02u",$year,$mon,$day,$hur,$min,$sec);
- }
复制代码 |
评分
-
查看全部评分
|