花生壳是国内动态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包,以保持在线状态。
|