int res;
res = sendto(server_socket,sendbuff,27,0,(struct sockaddr*)&addr,addrlen);//31
perror("sendto");
printf("send to %d \n",res);
int rev;
rev = recvfrom(server_socket,recvbuff,sizeof(recvbuff),0,(struct sockaddr*)&addr,&addrlen);
perror("recv\n");
printf("recv %d ",rev);
res = sendto(server_socket,sendbuff,31,0,(struct sockaddr*)&addr,addrlen);结果还是12楼的那样
perror("sendto");
//DNSQuery.h
//查询和回应的数据位置定义
#define T_A 1 // 主机地址
#define T_NS 2 // 认证服务器
#define T_CNAME 5 // 别名
#define T_SOA 6 // 认证区域起始
#define T_PTR 12 // 域名指针
#define T_MX 15 // 邮件路由信息
//DNS 头结构
struct DNS_HEADER
{
unsigned short id; // 标识
unsigned char rd :1; // 递归查询模式
unsigned char tc :1; // 完整封包信息
unsigned char aa :1; // 认证回应
unsigned char opcode :4; // 操作码
unsigned char qr :1; // 查询/回应标志
unsigned char rcode :4; // 回应码
unsigned char cd :1; // 检查无效
unsigned char ad :1; // 认证数据
unsigned char z :1; // 预留
unsigned char ra :1; // 能否进行递归查询
unsigned short q_count; // 问题数目
unsigned short ans_count; // 回答数目
unsigned short auth_count; // 权威回答数目
unsigned short add_count; // 附加数目
};
//查询问题结构
struct QUESTION
{
unsigned short qtype; // 查询的资源类型
unsigned short qclass; // 查询网络类型
};
//查询回应结构
#pragma pack(push, 1)
struct R_DATA
{
unsigned short type; // 查询回应类型
unsigned short _class; // 查询回应的网络类型
unsigned int ttl; // 在DNS服务器的存活时间
unsigned short data_len;// 数据的长度
};
#pragma pack(pop)
//资源记录内容指针
struct RES_RECORD
{
unsigned char *name; // 资源名称
struct R_DATA *resource; // 资源数据
unsigned char *rdata; // 查询结果
};
//查询结构
typedef struct
{
unsigned char *name; // 资源名称
QUESTION *ques; // 问题
} QUERY;
class CDNSQuery
{
public:
CDNSQuery();
virtual ~CDNSQuery();
CString DNSQuery(unsigned char *host, char *dnsserver);
unsigned char* ReadName(unsigned char* reader,unsigned char* buffer,int* count);
void RetrieveDnsServersFromRegistry();
void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host);
int GetDNSServer(char* dnsserver)
{
for(int i = 0; i < 10; i++)
{
if( m_DnsServers[i][0] == '\0' )
break;
strcpy(&dnsserver[i*100], m_DnsServers[i]);
}
return i;
}
private:
//List of DNS Servers registered on the system
char m_DnsServers[10][100];
};
//DNSQuery.cpp
#include "DNSQuery.h"
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib") //Winsock Library
CDNSQuery::CDNSQuery()
{
WSADATA firstsock;
RetrieveDnsServersFromRegistry();
TRACE("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&firstsock) != 0)
{
TRACE("Failed. Error Code : %d",WSAGetLastError());
return;
}
TRACE("Initialised.");
}
CDNSQuery::~CDNSQuery()
{
WSACleanup();
}
unsigned char* CDNSQuery::ReadName(unsigned char* reader,unsigned char* buffer,int* count)
{
unsigned char *name;
unsigned int p=0,jumped=0,offset;
int i , j;
*count = 1;
name = (unsigned char*)malloc(256);
name[0]='\0';
//read the names in 3www6google3com format
while(*reader!=0)
{
if(*reader>=192)
{
offset = (*reader)*256 + *(reader+1) - 49152; //49152 = 11000000 00000000 ;)
reader = buffer + offset - 1;
jumped = 1; //we have jumped to another location so counting wont go up!
}
else
name[p++]=*reader;
reader=reader+1;
if(jumped==0) *count = *count + 1; //if we havent jumped to another location then we can count up
}
name[p]='\0'; //string complete
if(jumped==1) *count = *count + 1; //number of steps we actually moved forward in the packet
//now convert 3www6google3com0 to www.google.com
for(i=0;i<(int)strlen((const char*)name);i++)
{
p=name[i];
for(j=0;j<(int)p;j++)
{
name[i]=name[i+1];
i=i+1;
}
name[i]='.';
}
name[i-1]='\0'; //remove the last dot
return name;
}
// 从注册表读出DNS服务器
void CDNSQuery::RetrieveDnsServersFromRegistry()
{
HKEY hkey=0;
char name[256];
char *path="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces";
char *fullpath[256];
unsigned long s=sizeof(name);
int dns_count=0 , err , i , j;
HKEY inter;
unsigned long count;
//Open the registry folder
RegOpenKeyEx(HKEY_LOCAL_MACHINE , path , 0 , KEY_READ , &hkey );
//how many interfaces
RegQueryInfoKey(hkey, 0 , 0 , 0 , &count , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
for(i=0;i<(int)count;i++)
{
s=256;
//Get the interface subkey name
RegEnumKeyEx(hkey , i , (char*)name , &s , 0 , 0 , 0 , 0 );
//Make the full path
strcpy((char*)fullpath,path);
strcat((char*)fullpath,"\\");
strcat((char*)fullpath,name);
//Open the full path name
RegOpenKeyEx(HKEY_LOCAL_MACHINE , (const char*)fullpath , 0 , KEY_READ , &inter );
//Extract the value in Nameserver field
s=256;
err=RegQueryValueEx(inter , "NameServer" , 0 , 0 , (unsigned char*)name , &s );
if(err==ERROR_SUCCESS && strlen(name)>0) strcpy(m_DnsServers[dns_count++],name);
}
for(i=0;i<dns_count;i++)
{
for(j=0;j<(int)strlen(m_DnsServers[i]);j++)
{
if(m_DnsServers[i][j]==',' || m_DnsServers[i][j]==' ')
{
strcpy(m_DnsServers[dns_count++],m_DnsServers[i]+j+1);
m_DnsServers[i][j]=0;
}
}
}
TRACE("\nThe following DNS Servers were found on your system...");
for(i=0;i<dns_count;i++)
{
TRACE("\n%d) %s",i+1,m_DnsServers[i]);
}
}
//转换格式: www.google.com -> www google com ;
void CDNSQuery::ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host)
{
int lock=0 , i;
strcat((char*)host,".");
for(i=0;i<(int)strlen((char*)host);i++)
{
if(host[i]=='.')
{
*dns++=i-lock;
for(;lock<i;lock++)
{
*dns++=host[lock];
}
lock++; //or lock=i+1;
}
}
*dns++='\0';
}
CString CDNSQuery::DNSQuery(unsigned char *host, char *dnsserver)
{
unsigned char buf[65536],*qname,*reader;
int i , j , stop;
SOCKET s;
struct sockaddr_in a;
struct RES_RECORD answers[20],auth[20],addit[20]; //DNS服务器的回应
struct sockaddr_in dest;
struct DNS_HEADER *dns = NULL;
struct QUESTION *qinfo = NULL;
CString sResult = "", sTemp;
s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); //采用UDP进行DNS查询
dest.sin_family=AF_INET;
dest.sin_port=htons(53); //DNS端口
dest.sin_addr.s_addr=inet_addr(dnsserver); //DNS服务器
//设置DNS标准查询结构
dns = (struct DNS_HEADER *)&buf;
dns->id = (unsigned short) (htons((unsigned short) GetCurrentProcessId()));
dns->qr = 0; //这是一个查询
dns->opcode = 0; //这是一个标准查询
dns->aa = 0; //不用认证
dns->tc = 0; //这是一个完整封包
dns->rd = 1; //希望递归查询
dns->ra = 0;
dns->z = 0;
dns->ad = 0;
dns->cd = 0;
dns->rcode = 0;
dns->q_count = htons(1); //只有一个问题
dns->ans_count = 0;
dns->auth_count = 0;
dns->add_count = 0;
//指针指向查询部分
qname =(unsigned char*)&buf[sizeof(struct DNS_HEADER)];
//转换域名格式
ChangetoDnsNameFormat(qname,host);
qinfo =(struct QUESTION*)&buf[sizeof(struct DNS_HEADER) + (strlen((const char*)qname) + 1)]; //fill it
qinfo->qtype = htons(1); //只查询ipv4地址
qinfo->qclass = htons(1); //这是internet网络
TRACE("\nSending Packet...");
if(sendto(s,(char*)buf,sizeof(struct DNS_HEADER) + (strlen((const char*)qname)+1) + sizeof(struct QUESTION),0,(struct sockaddr*)&dest,sizeof(dest))==SOCKET_ERROR)
{
TRACE("%d error",WSAGetLastError());
}
TRACE("Sent");
i = sizeof(dest);
TRACE("\nReceiving answer...");
if(recvfrom (s,(char*)buf,65536,0,(struct sockaddr*)&dest,&i)==SOCKET_ERROR)
{
TRACE("Failed. Error Code : %d",WSAGetLastError());
}
TRACE("Received.");
dns=(struct DNS_HEADER*)buf;
//指针越过DNS包头和查询问题部分
reader=&buf[sizeof(struct DNS_HEADER) + (strlen((const char*)qname)+1) + sizeof(struct QUESTION)];
sTemp.Format("The response contains : ");
sResult += sTemp;
sTemp.Format("\r\n %d Questions.",ntohs(dns->q_count));
sResult += sTemp;
sTemp.Format("\r\n %d Answers.",ntohs(dns->ans_count));
sResult += sTemp;
sTemp.Format("\r\n %d Authoritative Servers.",ntohs(dns->auth_count));
sResult += sTemp;
sTemp.Format("\r\n %d Additional records.\r\n",ntohs(dns->add_count));
sResult += sTemp;
//读问题回答
stop=0;
for(i=0;i<ntohs(dns->ans_count);i++)
{
answers[i].name=ReadName(reader,buf,&stop);
reader = reader + stop;
answers[i].resource = (struct R_DATA*)(reader);
reader = reader + sizeof(struct R_DATA);
if(ntohs(answers[i].resource->type) == 1) //if its an ipv4 address
{
answers[i].rdata = (unsigned char*)malloc(ntohs(answers[i].resource->data_len));
for(j=0 ; j<ntohs(answers[i].resource->data_len) ; j++)
answers[i].rdata[j]=reader[j];
answers[i].rdata[ntohs(answers[i].resource->data_len)] = '\0';
reader = reader + ntohs(answers[i].resource->data_len);
}
else
{
answers[i].rdata = ReadName(reader,buf,&stop);
reader = reader + stop;
}
}
//读认证回应
for(i=0;i<ntohs(dns->auth_count);i++)
{
auth[i].name=ReadName(reader,buf,&stop);
reader+=stop;
auth[i].resource=(struct R_DATA*)(reader);
reader+=sizeof(struct R_DATA);
auth[i].rdata=ReadName(reader,buf,&stop);
reader+=stop;
}
//读附加资源数据
for(i=0;i<ntohs(dns->add_count);i++)
{
addit[i].name=ReadName(reader,buf,&stop);
reader+=stop;
addit[i].resource=(struct R_DATA*)(reader);
reader+=sizeof(struct R_DATA);
if(ntohs(addit[i].resource->type)==1)
{
addit[i].rdata = (unsigned char*)malloc(ntohs(addit[i].resource->data_len));
for(j=0;j<ntohs(addit[i].resource->data_len);j++)
addit[i].rdata[j]=reader[j];
addit[i].rdata[ntohs(addit[i].resource->data_len)]='\0';
reader+=ntohs(addit[i].resource->data_len);
}
else
{
addit[i].rdata=ReadName(reader,buf,&stop);
reader+=stop;
}
}
//输出回答,即查询结果
for(i=0;i<ntohs(dns->ans_count);i++)
{
sTemp.Format("Name : %s ",answers[i].name);
sResult += sTemp;
if(ntohs(answers[i].resource->type)==1) //IPv4地址
{
long *p;
p=(long*)answers[i].rdata;
a.sin_addr.s_addr=(*p);
sTemp.Format("has \r\nIPv4 address : %s",inet_ntoa(a.sin_addr));
sResult += sTemp;
}
if(ntohs(answers[i].resource->type)==5) //别名
{
sTemp.Format("has alias name : %s",answers[i].rdata);
sResult += sTemp;
}
sTemp.Format("\r\n");
sResult += sTemp;
}
//输出认证信息
for(i=0;i<ntohs(dns->auth_count);i++)
{
sTemp.Format("Name : %s ",auth[i].name);
sResult += sTemp;
if(ntohs(auth[i].resource->type)==2)
{
sTemp.Format("has authoritative nameserver : %s",auth[i].rdata);
sResult += sTemp;
}
sTemp.Format("\r\n");
sResult += sTemp;
}
//输出附加资源数据
for(i=0;i<ntohs(dns->add_count);i++)
{
sTemp.Format("Name : %s ",addit[i].name);
sResult += sTemp;
if(ntohs(addit[i].resource->type)==1)
{
long *p;
p=(long*)addit[i].rdata;
a.sin_addr.s_addr=(*p);
sTemp.Format("has \r\nIPv4 address : %s",inet_ntoa(a.sin_addr));
sResult += sTemp;
}
sTemp.Format("\r\n");
sResult += sTemp;
}
return sResult;
}
//查询
void OnQuery()
{
CDNSQuery m_query;
char szDNS_Server[100];
sprintf(szDNS_Server, "%d.%d.%d.%d", 192, 168, 1, 1);//你的DNS服务器IP
unsigned char szName[100];
strcpy((char*)szName, "www.baidu.com");//查询的域名
CString strResult = m_query.DNSQuery(&szName[0], szServer);
}
一.准备工作 系统是Windows 8.1Pro 分析工具是WireShark1.10.8 Stable Version 使用系统Ping命令发送ICMP报文. ...启动Wireshark,选择一个有效网卡,启动抓包. 在控制台回车执行完毕后停止监控.
DNS域名解析 术语解释: 根域,就是所谓的“.”,其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),一般我们在浏览器里输入时会省略后面的点,而这也已经成为了习惯。根域服务器我们知道...
本文简单介绍了DNS协议理论知识,给出URL解析步骤,详细讲述了DNS报文各个字段含义,并从Wireshark俘获分组中选取DNS相关报文进行分析。 一、概述 1.1 DNS 识别主机有两种方式:主机名、IP地址。前者便于...
一、DNS协议理论知识 1、域名结构 域名是群体中所有人都在用的,必须要保持唯一性。为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法。每一个域名(本文只讨论英文域名)都是一个标号序列...
域名解析的DNS协议 DNS协议也是一种应用层协议。因为用户通常使用主机名或域名来访问对方的计算机,而不是通过IP地址问(比如说访问www.baidu.com就是通过域名) 背景最初一开始使用hosts文件来描述主机名和IP地址...
From: http://blog.csdn.net/wangyifei0822/archive/2008/04/23/2316857.aspx DNS报文格式:该报文12字节的首部和4个长度可变的字段组成。标识字段由客户程序设置并有服务器返回结果。16bit的标志字段 如下:QR:0...
域名解析总体可分为两大步骤,第一个步骤是本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;第二个步骤是本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址或者别名等。从...
2.DNS基础 3.DNS报文 3.1 查询报文 3.1.1 Flags 3.1.2 Queries 3.2 应答报文 3.2.1 Flags 3.2.2 Answers 3.2.3 Authoritative nameservers 3.2.4 Additional records 4.域名的解析过程 4.1 递归查询 ...
本文主要分为两个部分:一部分是网络爬虫的概述,帮助大家详细了解网络爬虫;另一部分是HTTP请求的Python实现,帮助大家了解Python中实现HTTP请求的各种方式,以...
DNS协议详解及报文格式分析 Posted on 2017-06-18 by Jocent — No Comments ↓ 目录 一. DNS协议理论知识 1.1. 域名结构1.2. 域名服务器1.3. 域名解析过程二. DNS协议报文格式 2.1 头部2.2 正文三. ...
这几天在实验室敲了几天代码,开始一直不知道怎么捕获DNS包,参考了许多的资料,终于弄明白了,现在和还不明白的朋友分享一下。。。 1.关于适配器那一块就跳过了,网上程序写的很清楚。 2.如何获得IP?port? 这个...
DNS在Wireshark下的抓包分析 DNS报文格式(借了个图): ###1. 标识(Trunsaction ID):DNS的ID标识。用来区分DNS应答报文对应的请求报文。该字段,在请求报文和相应的应答报文是一致的。 ###2. 标志(Flag) :DNS...
众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。 DNS查询和应答报文的格式如下: 16位标识字段用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应 16位标志字段用于协商具体...
(一)DNS报文格式 (1)公共报文头格式其中header报文头是必须有的,其他的有没有在报文头里有定义: 标识ID: 请求客户端设置的16位标示,服务器给出应答的时候会带相同的标示字段回来,这样请求客户端就可以...
通常我们在应用程序中使用库函数gethostbyname()和gethostbyaddr()来完成两者之间的转换。但是为了更深入的学习网络底层知识,有必要从源代码级别来分析和实现 RFC 1034说明了DNS的概念和功能,RFC 1035详细说明...
我们简单理解DNS功能是把域名转成IP地址,我们先发送一个NDS请求数据包到本地域名服务器去找,找不到我们就去根域名服务器去找,根域名找不到我们再把顶级域名服务器地址回复给本地域名服务器,然后本地域名服务器到...
简单来说就是应用程序向最近的DNS服务器查询即可。该DNS服务器就会返回该服务器的IP地址。 向DNS服务器发送查询,然后接受服务器返回的响应消息,换句话说,对于DNS服务器,我们的计算机上有相应的DNS客户端,相当...
这就需要使用域名查询服务,域名查询服务有很多种实现方式,比如NIS(Network Information Service,网络信息服务)、DNS和本地静态文件等。 DNS是一套分布式的域名服务系统,每个DNS服务器上都存放着
使用tshark 和 shell脚本分析 DNS pcap包1、使用tshark过滤dns cap包中源ip、目的ip、request请求tshark -r test.cap -T fields -e frame.time -e ip.src -e ip.dst -e dns.qry.name -R 'udp.dstport==53 || dns'2、...
域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了...
DNS基本概念 域名如在浏览器地址栏输入的www.baidu.com,www.hao123.com等我们称之为域名,域名即网站名称。如果说互联网的本质是连接一切,域名则为“一切”提供了身份标识功能,而IP为“一切”提供了寻址功能。...
Linux面试题: 1.Linux常用系统安全命令 sudo // 超级用户 su // 用于切换当前用户身份到其他身份,变更时需... chmod // 用来变更文件或目录的权限 setfacl // 设置文件访问控制列表 2.Linux常用进程管理命令 ... top ...
试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种方法更为适合。...
1. http协议基础(1) HTTP名词解释Web 使用一种名为 HTTP(HyperText Transfer Protocol, 超文本传输协议)的协议作为规范, 完成从客户端到服务器端等一系列运作流程。 而协议是指规则的约定。...
《Linux高性能服务器编程》阅读笔记:1....常见的域名查询服务有NIS(Network Information Service, 网络信息服务)、本地静态文件和DNS。 DNS是一套分布式的域名服务系统,即有多个DNS服务器遍布于世界。每个
本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
突然发现进不了Oculus的官方网站,后面发现是电脑网络设置中的DNS在作妖。最近几天正好看计算机网络的方面的书,就抽时间把DNS总结一下。DNS的作用TCP/IP网络中要求每一个互连的计算机都具有其唯一的IP地址,并基于...
1、 什么是DNS协议?<1>DNS协议就是用来将域名解析到IP地址的一种协议,当然,也可以将IP地址转换为域名的一种协议。 <2>DNS协议基于UDP和TCP协议的,端口号53,用户到服务器采用UDP,DNS服务器通信采用TCP 大型...
本文主要介绍利用 DNS 查询流量来封装 TCP 流量 , 达到绕过防火墙的目的,搭建DNS隧道,绕过网络认证,实现上网。
1、 host指令 host指令的man 手册是这样描述的 ... 名称是可以被解析的域名,也可以是点分十进制的IPV4的地址或冒号分隔的IPV6的地址,默认地,也可以行使一个反向解析的功能,DNS服务器既有