花生壳是国内动态IP上网用户常用的一款架站软件之一,据称目前有一百多万用户
在使用,是一款不错的动态域名解析软件,遗憾的是该软件目前只提供了Windows版,
广大Linux\FreeBSD用户无缘享受这一服务,其实只要对该软件略作抓包分析,是
不难搞清楚它所用协议的,由此也很容易设计出Unix版的客户端。
花生壳客户端启动后,首先以TCP方式登录PH002.ORAY.NET服务器,端口号5050,
连接过程记录如下(方括号内容是加上去的,以区分是哪一方发送的数据):
[SERVER]220 oray.net DHRP Server Ready
[CLIENT]auth cram-md5
[SERVER]334 239QBbj4H3nXQkoE7i9xJQ==
[CLIENT]S04STkVUIIBqzS5XbP/NwNchq5g62wI=
[SERVER]250 Authentication passed
[SERVER]sample.vicp.net
[SERVER]
[CLIENT]regi a sample.vicp.net
[SERVER]cnfm
[SERVER]250 Register successfully
[SERVER]250 1382418101 887031714
[CLIENT]Quit
[SERVER]221 Good bye
从上面的记录可以看出,花生壳的登录认证采用的是CRAM-MD5方式,即服务器发一个
KEY给客户端,客户端用这个KEY用MD5加密登录口令,然后以“用户名+空格+
加密后的登录口令”的格式发送登录数据给服务器。注意:服务器发来的KEY是用
base64编码的,使用前要先用base64解码还原,同样客户端发过去的登录数据也要
先用base64编码。
服务器收到客户端发来的登录数据后,先用base64解码还原,分解出用户名和密码,
核对用户名和密码都正确后,发250通知客户端认证通过,同时发此用户注册的域名。
客户端发regi命令选择使用其中一个域名,然后服务器发来两个整数数字,供客户端
以后刷新IP地址时使用。
以上就完成了TCP登录过程,以后客户端每分钟发送一个20字节的UDP数据包给服务器,
以便保持在线状态和刷新IP地址,UDP端口号5050,数据格式如下:
struct UDP_DATA
{
unsigned int LoginId;
unsigned int DataType; //0x0A或者0x0B,表示在线或者注销
unsigned int Sequence; //每发一次加1
unsigned int Data1; //Data1=-(Seq+DataType)
unsigned int Data2; //Data2=0
}
其中LoginId,Sequence就是TCP登录时收到的那两个整数,DataType+Sequence+
+Data1+Data2必须等于0。发送前用Blowfish加密方式对DataType以下的16字节进行
加密,所用的KEY就是在TCP登录中收到的那个KEY。
服务器收到后,会应答一个20字节的UPD包,格式同上,表示动态域名解析正常。
客户端接收、解码,核对LoginId和Sequence,如果不对或者5分钟以上收不到应答包,
就会重新进行TCP登录,重发UDP包,以保持在线状态。