当前位置:编程学习 > 网站相关 >>

编程实现希网动态域名自动更新

文/图 天涯浪人随着网络技术的发展,远程控制类程序早已由主动连接发展到反弹自动上线,但由于多数宽带用户都是动态IP,这样服务端的上线对于很多人就是个问题。解决的方法出现了很多种,其中比较流行的就是用动态域名解析来更新IP,保证服务端正常上线。
对于木马爱好者来说,希网网络提供的3322.org的动态域名解析是木马自动上线的一个比较好的方式。希网动态域名解析提供了一个基于Web的域名管理系统,也提供了一个运行于客户端的管理程序,使更新IP 地址很方便。希网网络提供了域名解析的相关协议,网上也有一些个人开发的希网3322域名更新小程序,这里我再给大家简单实现一个更新3322动态域名的工具。
我们先看一下希网动态域名客户端编程规范里的动态域名相关协议。Client的请求应该使用HTTP/1.0以上协议,Server的相应一定为HTTP/1.0,支持HTTP和基于SSL的HTTPS协议,需要事务处理。Client发送完整的请求,并且解析服务器端的响应,保证域名更新成功。
这里我们只看一下和动态域名有关的部分。

dyndns, statdns
GET /dyndns/update?system=statdns&hostname=yourhost.ourdomain.ext
&myip=ipaddress&wildcard=OFF&mx=mail.exchanger.ext&backmx=NO
&offline=NO HTTP/1.1
Host: members.3322.org
Authorization: Basic username:pass
(note: username:pass must be encoded in base64)
User-Agent: myclient/1.0 me@null.net

下面是对各个参数含义的解释。
username:password System:All Optional: No:用户名和密码,用来登录。
system=dyndns|statdns|webhop|subdom System:All Optional: Yes:只能使用二者之一,否则出错。如果没有这个参数,缺省是dyndns。webhop和subdomain只能使用Web更新,而用户自己的域名(3322.org的custom方式)可以归并到现有的四种方式。
hostname=host.3322.org System:All Optional: No:需要更新的域名。
myip=ipaddr System:All Optional: Yes:域名对应的IP。如果不指定,则服务器将选择最佳的IP。一些Proxy会传递客户端的IP,这会被服务器检测到。如果传递的地址格式错误,则忽略这个参数,而用服务器检测到的IP。
wildcard=ON|OFF System:DynDNS, StatDNS Optional: Yes:是否支持通配符,缺省为OFF。ON意味着*.host.3322.org等同于host.3322.org。
mx=mailexchanger System:DynDNS, StatDNS Optional: Yes:指明Mail eXchanger。必须能够解析到一个IP,否则被忽略。如果不提供该参数或者不能解析到一个IP,mx记录会被删除。
以上就是动态域名更新的请求响应了。按照上面的协议格式构造请求数据,客户端只要发送完整的请求数据,根据服务器返回的响应信息,我们就能知道IP是否更新成功了。这里有一点要注意的就是,Authorization这里的用户名和密码在用冒号连接起来以后,要用base64进行编码,否则就会提示出错而无法更新。
由于协议的过程非常简单,为了验证一下实际过程是不是这样的,我们对希网提供的客户端程序的通信数据抓包分析一下。以下是一次更新IP过程中实际抓取到的数据,抓包工具为:wkiller1.0。

//发送
GET /dyndns/getip HTTP/1.1
Host: www.3322.org
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
User-Agent: Cn99CIP/1.1.0

//接收
GET /dyndns/getip HTTP/1.1
Host: www.3322.org
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
User-Agent: Cn99CIP/1.1.0

//发送
GET /dyndns/update?system=dyndns&hostname=fgd.3322.org&myip=68.29.23.103
&wildcard=OFF&mx=&backmx=NO HTTP/1.1
Host: members.3322.org
Authorization: Basic ZYJlYXo6NjI4NTAw
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
User-Agent: Cn99CIP/1.1.0

  这里我们发现,实际程序的工作过程和希网提供的协议并不完全一样,第一次的“GET /dyndns/getip HTTP/1.1”经测试后发现是返回客户端的IP地址,由于未经过深入分析,还不知道希网为什么要先得到客户端IP地址。对比上面的协议格式可以知道,在hostname部分实际的协议也和网上提供的有出入。域名后面的.ext在实际上却没有,不知道希网网站上的为什么要加上(后来经过测试,加上.ext后域名无法更新)。
知道了上面这些,我们就可以编写程序来更新我们的动态域名对应的IP了,还是看代码吧。

//先定义要用到的用户名密码和IP:
char ipaddr[20] ="222.185.245.252";
//www.3322.org的IP地址
char username[20] ="werfw";
//测试用的注册账号
char passwd[20] ="qq6354365"; //密码
char dyndns_hostname[30] ="tcvv.3322.org";  //动态域名地址
char myip[20] ="68.29.23.103"; //要更新的IP 地址

下面就是一般的网络编程了,代码如下。

WSADATA ws;
SOCKET s;
WSAStartup(MAKEWORD(2,2),&ws);
s=WSASocket(PF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(80);  //连接80端口
server.sin_addr.s_addr=inet_addr(ipaddr);
        connect(s,(struct sockaddr *)&server,sizeof(server) );

再按照用户名与密码的格式构造字符串,并对其进行Base64编码。

strcpy(temp,username);
strcat(temp,":");
strcat(temp,passwd);
Base64Encode(base_ncode, (const unsigned char *)temp, strlen(temp));
//编码后的字符串放在base_ncode里

接下来就是最重要的部分了,按协议格式构造数据,并发往服务器。

BOOL SendToServer(SOCKET s, char *Basic)
{
int ret =0;
char buffer[MAX_DATA] ={0};
char Buffer[MAX_DATA] ={0};
sprintf(buffer,"GET /dyndns/update?system=dyndns&hostname=%s&myip=%s&wildcard=OFF&mx=&backmx=NO HTTP/1.1 "
"Host: members.3322.org "
"Authorization: Basic %s "
"Content-Type: application/x-www-form-urlencoded "
"Cache-Control: no-cache "
"User-Agent: Cn99CIP/1.1.0 ",
dyndns_hostname,
myip,
Basic);
send(s, buffer, strlen(buffer), 0); //发送到服务器,更新IP
printf(buffer);
ret = recv(s, Buffer, sizeof(Buffer), 0); //接收返回的数据
return true; //接收返回的数据,
/若成功更新,则会返回 good +IP
}

图1是以上代码编译后,程序执行的截图。

图1
到这里,我们自动更新3322域名的程序就写完了,很简单吧?如果想要实现更多的功能,就要大家自己动下手了哦,相关的协议希网都提供了。最后,希望支持3322动态域名上线的远程控制软件也加上自动更新IP的功能,免得每次上线都要去3322网站输账号密码,不仅麻烦而且还不安全
补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,