dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>文章内容
VC中利用原始套接字实现网络监听
来源: VCKBASE 作者: 张志强 <
  1、引言

  网络监听工具(sinff)是提供给网络管理员的一类管理工具。在以太网中(Ethernet),当网络上连接多台计算机时,某瞬间只能有一台计算机可以传送数据。以太网中,数据是以被称为帧的数据结构为单位进行交换的。通常,在计算机网络上交换的数据结构体的单位是数据包。而在以太网中则称为帧。这种数据包是由记录着数据包发送给对方所必需信息的报头部分和记录着发送信息的报文部分构成。报头部分包含接收端的地址、发送端的地址、数据校验码等信息。

  在以太网上,帧(数据包)是被称为带碰撞检测的载波侦听多址访问(CAMA/CD)发送的,在这种方法中,发送到指定地址的帧实际上是发送到所有计算机的,只是如果网卡检测到经过的数据不是发往自身的,简单忽略过去而已。

  2、网络监听工作原理

  工作在普通模式下的网卡只能接收发往本地地址和广播的数据包,其余数据包将简单的转发,并不把数据提交给主机处理。工作在混杂模式下的网卡将接收所有经过本网卡的数据。所以网络监听只能工作在混杂模式下。对于不能工作在网卡,将无法监听所有在网络上传输的数据。网络监听的核心就是设置网卡为混杂模式。通常的套接字只能相应与自己地址相匹配的或以广播方式发送的数据帧。对于其他数据帧,网络接口验证投递地址并非自身地址后将不做响应,也就是说网络程序无法接收到达网卡的数据包。

  3、具体实现

  对网卡设置混杂模式是通过原始套接字(row socket)实现的,这有别于通常是使用的数据流和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行监听了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。

  例子程序运行画面如图所示:


如图一

  4、小结

  本文介绍的以原始套接字实现网络侦听的方法实现起来比较简单,尤其是不需要编写驱动程序就能实现网络侦听。但由于接收到的数据报头不含帧信息,因此不能接收网络层的其他数据包,如ARP、RARP等。原始套接字只能监听但不能实现拦截。另外最致命的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包例如TDI无法进行处理。对于一些木 马和病毒来说很容易避开这个层次的监听。

上一篇:解读VC++编程中的文件操作API和CFile类   下一篇:基于Visual C++6.0的声音文件操作
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言学习
·C语言指针
·C语言数组排序小结
·c语言 最简单的推箱子游戏
·c语言 全国计算机编程大赛复赛试
·c语言 全国计算机编程大赛复赛试
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
  相关文章
·解读VC++编程中的文件操作API和C
·基于Visual C++6.0的声音文件操
·VC和Delphi程序只运行一个实例的
·用VC++制作播放AVI视频流的动画
·使用VC6.0实现窗口的任意分割
·利用MFC文档视图框架编写打印程
·摆脱DLL"地狱"的困扰之获取进程
·在VC中使用Windows管道技术编程
·实现MFC扩展DLL中导出类和对话框
·基于Visual C++ 6.0的Add-in编程
·掀起你的盖头来——谈VC++对象模
·深入浅出MFC文档/视图架构之基本
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763