搜索工具-客户端篇

最近在整视频平台,整的头大,就来更新更新博客吧!劳逸结合,??

要知道,市面上的摄像机啊,录像机啊,都有自己的搜索工具,主要防止ip人为修改之后被忘记的情况,这时候搜索工具一搜,ip地址就能获取到了!类似的原理网上也很多。

贴出部分代码:

//获取所有网卡设备信息,但这个函数感觉获取的信息不全,没有GetAdaptersInfo好
pcap_if_t* GetAllNetDevice()
{
	devCount = 0;
	if(pcap_findalldevs(&alldev, errbuf) ==-1)
	{
		return NULL;
	}
	for(dev=alldev;dev;dev=dev->next)
	{
		devCount++;	
	}
	return alldev;
}

int startCap(int if_index)
{
	int i;
	int ret;
	u_int netmask;
	struct bpf_program fcode;
    u_char frame[1024];
	char mac[ETHER_LEN+1];
	char error_content[PCAP_ERRBUF_SIZE];
	struct bpf_program bpf_filter;
	char bpf_filter_string[] = "ether proto 0x8043";
    struct pcap_pkthdr *pkthdr;
	const unsigned char *packet = NULL;
	ethhdr e_header;
	SCANIP_COMMAND_HEADER cmd_header;


	//获取本机mac地址
	CString sMACAddress;
    if(FALSE == GetMACAddress(sMACAddress))
	{
		return -1;
	}

    //填充发送的帧    
    //eth_header
	memcpy(e_header.dest, MAC_BCAST_ADDR, ETH_ALEN);
	memcpy(e_header.src, sMACAddress, ETH_ALEN);
	e_header.type = htons(0x8043);//乱定义的 
    memcpy(frame, &e_header, ETHER_LEN);

	//cmd
    cmd_header.length = htonl(sizeof(SCANIP_COMMAND_HEADER));
    cmd_header.cmd = htonl(SCANIP_CMD);
    memcpy(&frame[ETHER_LEN], &cmd_header, CMDHEADER_LEN);


	//获得选中的网卡接口
    dev=alldev;
	for(count=0;count<if_index-1;count++)
	{
		dev=dev->next;
	}

	if ((adhandle= pcap_open_live(dev->name,	// 设备名
							 65536,											//捕获数据包长度																					
							 1,													// 混杂模式 (非0意味着是混杂模式)
							 1000,												// 读超时设置
							 errbuf											// 错误信息
							 )) == NULL)
	{
		pcap_freealldevs(alldev);
		return -1;
	}

	pcap_setnonblock(adhandle, 1, errbuf);

	pcap_compile(adhandle,&bpf_filter,bpf_filter_string,0,0);
	pcap_setfilter(adhandle, &bpf_filter);
	if (pcap_datalink(adhandle) != DLT_EN10MB)//表示为以太网
    {
        printf("pcap_datalink error...\n");
        return -1;
    }

	//send packet
    ret = pcap_sendpacket(adhandle, (u_char *)&frame, ETHER_LEN+CMDHEADER_LEN);//ChengliWang
    if(ret != 0)
    {
        perror("pcap_sendpacket");
        return -1;
    }

	//receive packet    
    ethhdr *pEth_header = NULL;
    SCANIP_COMMAND_HEADER *pCmd_header = NULL;
    SCANIP_NET_CFG *pNet_cfg = NULL;    
    struct in_addr ipAddr; 
	struct in6_addr ipv6;
	char ip[256];

    count = 0;
    for(i=0; i<255; i++)
	{
		ret = pcap_next_ex(adhandle, &pkthdr, &packet);
        if(0 == ret)
        {
            printf("time out...\n");
            //Sleep(10);
            continue;
        }

		pEth_header = (ethhdr *)packet;        
        pCmd_header = (SCANIP_COMMAND_HEADER *)(packet+ETHER_LEN);
        if((pEth_header->type == ntohs(0x8043)) && (pCmd_header->cmd == ntohl(SCANIP_RETCMD)))
        {
			pNet_cfg = (SCANIP_NET_CFG *)(packet + ETHER_LEN + CMDHEADER_LEN);
            ipAddr.s_addr = ntohl(pNet_cfg->ip);
            printf("ip:%s\n",(char *)inet_ntoa(ipAddr));
			ipv6=pNet_cfg->ipv6;
			if(NULL == inet_ntop(AF_INET6, ipv6.s6_addr, ip, INET6_ADDRSTRLEN))
			{
				perror("inet_ntop");
			}
			printf("ipv6 = %s\n",ip);

            //save netcfg to vector
            memcpy(&net_cfg_vector[count++], pNet_cfg, NETCFG_LEN);
		}
	}
	printf("");

}


int GetMACAddress(CString &sMACAddress)
{
	PIP_ADAPTER_INFO pAdapterInfo;
	DWORD AdapterInfoSize;   
	TCHAR szMac[32]  =  {0};
	DWORD Err;
	AdapterInfoSize  =  0;

    Err  =  GetAdaptersInfo(NULL,  &AdapterInfoSize);
    if((Err  !=  0)  &&  (Err  !=  ERROR_BUFFER_OVERFLOW))
    {   
 	    TRACE("获得网卡信息失败!");
		return  FALSE;
    }

    //  分配网卡信息内存
    pAdapterInfo  =  (PIP_ADAPTER_INFO)  GlobalAlloc(GPTR,  AdapterInfoSize);

    if(pAdapterInfo  ==  NULL)
	{ 
         TRACE("分配网卡信息内存失败"); 
         return  FALSE;
    } 
    if(GetAdaptersInfo(pAdapterInfo,  &AdapterInfoSize)  !=  0)
	{ 
	     TRACE(_T("获得网卡信息失败!\n"));
		 GlobalFree(pAdapterInfo);
		 return  FALSE; 
    }

    sMACAddress.Format(_T("%02X%02X%02X%02X%02X%02X"),
		 pAdapterInfo->Address[0],
		 pAdapterInfo->Address[1],
         pAdapterInfo->Address[2],
		 pAdapterInfo->Address[3],
		 pAdapterInfo->Address[4],
		 pAdapterInfo->Address[5]);
    GlobalFree(pAdapterInfo);
      return  TRUE;
}

/*分析链路层*/
int analyze_frame(const u_char * pkt,struct datapkt * data,struct pktcount *npacket)
{
		int i;
		struct ethhdr *ethh = (struct ethhdr*)pkt;
		data->ethh = (struct ethhdr*)malloc(sizeof(struct ethhdr));
		if(NULL == data->ethh)
			return -1;
	
		for(i=0;i<6;i++)
		{
			data->ethh->dest[i] = ethh->dest[i];
			data->ethh->src[i] = ethh->src[i];
		}
	
		npacket->n_sum++;

		/*由于网络字节顺序原因,需要对*/
		data->ethh->type = ntohs(ethh->type);

		//处理ARP还是IP包?
		switch(data->ethh->type)
		{
			case 0x0806:
				return analyze_arp((u_char*)pkt+14,data,npacket);      //mac 头大小为14
				break;
			case 0x0800:				
				return analyze_ip((u_char*)pkt+14,data,npacket);
				break;
			case 0x86dd:		
				return analyze_ip6((u_char*)pkt+14,data,npacket);			
				return -1;
				break;
			default:
				npacket->n_other++;
				return -1;
				break;
		}
		return 1;
}

/*分析网络层:ARP*/
int analyze_arp(const u_char* pkt,datapkt *data,struct pktcount *npacket)
{
	int i;
	struct arphdr *arph = (struct arphdr*)pkt;
	data->arph = (struct arphdr*)malloc(sizeof(struct arphdr));
	
	if(NULL == data->arph )
		return -1;
	
	//复制IP及MAC
	for(i=0;i<6;i++)
	{
		if(i<4)
		{
			data->arph->ar_destip[i] = arph->ar_destip[i];
			data->arph->ar_srcip[i] = arph->ar_srcip[i];
		}
		data->arph->ar_destmac[i] = arph->ar_destmac[i];
		data->arph->ar_srcmac[i]= arph->ar_srcmac[i];
	}

	data->arph->ar_hln = arph->ar_hln;
	data->arph->ar_hrd = ntohs(arph->ar_hrd);
	data->arph->ar_op = ntohs(arph->ar_op);
	data->arph->ar_pln = arph->ar_pln;
	data->arph->ar_pro = ntohs(arph->ar_pro);

	strcpy(data->pktType,"ARP");
	npacket->n_arp++;
	return 1;
}

/*分析网络层:IP*/
int analyze_ip(const u_char* pkt,datapkt *data,struct pktcount *npacket)
{
	int i;
	struct iphdr *iph = (struct iphdr*)pkt;
	data->iph = (struct iphdr*)malloc(sizeof(struct iphdr));
	
	if(NULL == data->iph)
		return -1;
	data->iph->check = iph->check;
	npacket->n_ip++;
	
	/*for(i = 0;i<4;i++)
	{
		data->iph->daddr[i] = iph->daddr[i];
		data->iph->saddr[i] = iph->saddr[i];
	}*/
	data->iph->saddr = iph->saddr;
	data->iph->daddr = iph->daddr;

	data->iph->frag_off = iph->frag_off;
	data->iph->id = iph->id;
	data->iph->proto = iph->proto;
	data->iph->tlen = ntohs(iph->tlen);
	data->iph->tos = iph->tos;
	data->iph->ttl = iph->ttl;
	data->iph->ihl = iph->ihl;
	data->iph->version = iph->version;
	//data->iph->ver_ihl= iph->ver_ihl;
	data->iph->op_pad = iph->op_pad;

	int iplen = iph->ihl*4;							//ip头长度
	switch(iph->proto)
	{
		case PROTO_ICMP:
			return analyze_icmp((u_char*)iph+iplen,data,npacket);
			break;
		case PROTO_TCP:
			return analyze_tcp((u_char*)iph+iplen,data,npacket);
			break;
		case PROTO_UDP:
			return analyze_udp((u_char*)iph+iplen,data,npacket);
			break;
		default :
			return-1;
			break;
	}
	return 1;
}

/*分析网络层:IPV6*/
int analyze_ip6(const u_char* pkt,datapkt *data,struct pktcount *npacket)
{
	int i;
	struct iphdr6 *iph6 = (struct iphdr6*)pkt;
	data->iph6 = (struct iphdr6*)malloc(sizeof(struct iphdr6));
	
	if(NULL == data->iph6)
		return -1;

	npacket->n_ip6++;
	
	data->iph6->version = iph6->version;
	data->iph6->flowtype = iph6->flowtype;
	data->iph6->flowid = iph6->flowid;
	data->iph6->plen = ntohs(iph6->plen);
	data->iph6->nh = iph6->nh;
	data->iph6->hlim =iph6->hlim;

	for(i=0;i<16;i++)
	{
		data->iph6->saddr[i] = iph6->saddr[i];
		data->iph6->daddr[i] = iph6->daddr[i];
	}
	
	switch(iph6->nh)
	{
		case 0x3a:					
			return analyze_icmp6((u_char*)iph6+40,data,npacket);
			break;
		case 0x06:
			return analyze_tcp((u_char*)iph6+40,data,npacket);
			break;
		case 0x11:
			return analyze_udp((u_char*)iph6+40,data,npacket);
			break;
		default :
			return-1;
			break;
	}
	//npacket->n_ip6++;
	//strcpy(data->pktType,"IPV6");
	return 1;
}
	
/*分析传输层:ICMP*/
int analyze_icmp(const u_char* pkt,datapkt *data,struct pktcount *npacket)
{
	struct icmphdr* icmph = (struct icmphdr*)pkt;
	data->icmph = (struct icmphdr*)malloc(sizeof(struct icmphdr));
	
	if(NULL == data->icmph)
		return -1;

	data->icmph->chksum = icmph->chksum;
	data->icmph->code = icmph->code;
	data->icmph->seq =icmph->seq;
	data->icmph->type = icmph->type;
	strcpy(data->pktType,"ICMP");
	npacket->n_icmp++;
	return 1;
}

/*分析传输层:ICMPv6*/
int analyze_icmp6(const u_char* pkt,datapkt *data,struct pktcount *npacket)
{
	int i;
	struct icmphdr6* icmph6 = (struct icmphdr6*)pkt;
	data->icmph6 = (struct icmphdr6*)malloc(sizeof(struct icmphdr6));
	
	if(NULL == data->icmph6)
		return -1;

	data->icmph6->chksum = icmph6->chksum;
	data->icmph6->code = icmph6->code;
	data->icmph6->seq =icmph6->seq;
	data->icmph6->type = icmph6->type;
	data->icmph6->op_len = icmph6->op_len;
	data->icmph6->op_type = icmph6->op_type;
	for(i=0;i<6;i++)
	{
		data->icmph6->op_ethaddr[i] = icmph6->op_ethaddr[i];
	}
	strcpy(data->pktType,"ICMPv6");
	npacket->n_icmp6++;
	return 1;
}

/*分析传输层:TCP*/
int analyze_tcp(const u_char* pkt,datapkt *data,struct pktcount *npacket)
{
	struct tcphdr *tcph = (struct tcphdr*)pkt;
	data->tcph = (struct tcphdr*)malloc(sizeof(struct tcphdr));
	if(NULL == data->tcph)
		return -1;
	
	data->tcph->ack_seq = tcph->ack_seq;
	data->tcph->check = tcph->check;
	
	data->tcph->doff = tcph->doff;
	data->tcph->res1 = tcph->res1;
	data->tcph->cwr = tcph->cwr;
	data->tcph->ece = tcph->ece;
	data->tcph->urg = tcph->urg;
	data->tcph->ack = tcph->ack;
	data->tcph->psh = tcph->psh;
	data->tcph->rst = tcph->rst;
	data->tcph->syn = tcph->syn;
	data->tcph->fin = tcph->fin;
	//data->tcph->doff_flag = tcph->doff_flag;

	data->tcph->dport = ntohs(tcph->dport);
	data->tcph->seq = tcph->seq;
	data->tcph->sport = ntohs(tcph->sport);
	data->tcph->urg_ptr = tcph->urg_ptr;
	data->tcph->window= tcph->window;
	data->tcph->opt = tcph->opt;
	
	/*不要忘记http分支*/
	if(ntohs(tcph->dport) == 80 || ntohs(tcph->sport)==80)
	{
		npacket->n_http++;
		strcpy(data->pktType,"HTTP");
	}
	else{
		npacket->n_tcp++;
		strcpy(data->pktType,"TCP");	
	}
	return 1;
}

/*分析传输层:UDP*/
int analyze_udp(const u_char* pkt,datapkt *data,struct pktcount *npacket)
{
	struct udphdr* udph = (struct udphdr*)pkt;
	data->udph = (struct udphdr*)malloc(sizeof(struct udphdr));
	if(NULL == data->udph )
		return -1;

	data->udph->check = udph->check;
	data->udph->dport = ntohs(udph->dport);
	data->udph->len = ntohs(udph->len);
	data->udph->sport = ntohs(udph->sport);

	strcpy(data->pktType,"UDP");
	npacket->n_udp++;
	return 1;
}

//将数据包以十六进制方式打印出来
void print_packet_hex(const u_char* pkt,int size_pkt,CString *buf)
{
	int i=0,j = 0,rowcount;
	 u_char ch;

	 char tempbuf[256];
	 memset(tempbuf,0,256);

	for(i = 0;i<size_pkt;i+=16)
	{
		buf->AppendFormat(_T("%04x:  "),(u_int)i);
		rowcount = (size_pkt-i) > 16 ? 16 : (size_pkt-i);			

		for (j = 0; j < rowcount; j++)		
			buf->AppendFormat(_T("%02x  "),(u_int)pkt[i+j]);	

		//不足16,用空格补足
		if(rowcount <16)
			for(j=rowcount;j<16;j++)
					buf->AppendFormat(_T("    "));	


		for (j = 0; j < rowcount; j++) 
		{
             ch = pkt[i+j];
             ch = isprint(ch) ? ch : '.';
			 buf->AppendFormat(_T("%c"),ch);
		}

		buf->Append(_T("\r\n"));

		if(rowcount<16)
			return;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值