中利用原始套接字实现网络监听
1、引言
络监听工具(sinff)是提供给络管理员的一类管理工具。在以太中(Ethernet),当络上连接多台计算机时,某瞬间只能有一台计算机可以传送数据。以太中,数据是以被称为帧的数据结构为单位进行交换的。通常,在计算机络上交换的数据结构体的单位是数据包。而在以太中则称为帧。这种数据包是由记录着数据包发送给对方所必需信息的报头部分和记录着发送信息的报文部分构成。报头部分包含接收端的地址、发送端的地址、数据校验码等信息。
在以太上,帧(数据包)是被称为带碰撞检测的载波侦听多址访问(CAMA/CD)发送的,在这种方法中,发送到指定地址的帧实际上是发送到所有计算机的,只是如果卡检测到经过的数据不是发往自身的,简单忽略过去而已。
2、络监听工作原理
工作在普通模式下的卡只能接收发往本地地址和广播的数据包,其余数据包将简单的转发,并不把数据提交给主机处理。工作在混杂模式下的卡将接收所有经过本卡的数据。所以络监听程序只能工作在混杂模式下。对于不能工作在卡,将无法监听所有在络上传输的数据。络监听的核心就是设置卡为混杂模式。通常的套接字只能相应与自己硬件地址相匹配的或以广播方式发送的数据帧。对于其他数据帧,络接口验证投递地址并非自身地址后将不做响应,也就是说络程序无法接收到达卡的数据包。
3、具体实现
对卡设置混杂模式是通过原始套接字(row socket)实现的,这有别于通常是使用的数据流和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对络数据包进行监听了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关络的一些信息。由于这些数据经过了络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。
例子程序运行画面如图所示:
如图一
4、小结
轮胎的胎壁是整个轮胎中最脆弱的部分 本文介绍的以原始套接字实现络侦听的方法实现起来比较简单,尤其是不需要编写驱动程序就能实现络侦听。但由于接收到的数据报头不含帧信息,因此不能接收络层的其他数据包,如ARP、RARP等。原始套接字只能监听但不能实现拦截。另外最致命的缺点就是只能在Winsock层次上进行,而对于络协议栈中底层协议的数据包例如TDI无法进行处理。对于一些木 马和病毒来说很容易避开这个层次的监听。查看本文来源
孩子消化不良怎么调理拉萨治疗卵巢炎哪家好
怎么预防高血糖
- 他们有在听吗?用这3个技巧,抓住听众的焦虑
- 刘亦菲、李易峰的流量转型路:道阻且长
- 片场长大的杨幂“知世俗而不世俗”,你喜欢她演过的哪部经典作品呢?
- 【文中红包】A股为何全线大跌?添富火线解读
- 国际刑警组织丨曼陀罗误当蔬菜吃,宁夏一对母子中毒!
- 腌制咸鸭蛋,只加盐是“外行”!多加4种料,10天腌制好,流油又起沙
- 安卓手机也将玩游戏“空间音频”,您会期待吗?
- 宝马计划与韩国供应商合作生产线固态电池
- 8岁女童连不吃大量荔枝引起中毒?荔枝虽美味,但5类人也不能多不吃
- 中乙山西龙晋退出职业联赛:无法在规定小时交60万参赛保证金
- 如何在dota2中都激怒玩家?只需一招,无论是队友还是对手都会红温
- 岗位中无论心结有多大,弄明白这五个道理,混得越来越顺利