本文章将介绍如何使用RawSocket(原始套接字)开发网络嗅探器:
首先我们得了解什么是套接字,这个我就不多说,自己百度,百度百科比我说的好。
那么什么又是原始套接字呢,常用的套接字分为 SOCK_STREAM(流套接字) 用于TCPXY通讯。 SOCK_DGRAM(数据报套接字) 同于UDPXY通讯。
那么原始呢,他则是和名字一样原始套接字;举例:要想用流套接字进行一次TCP的发包,那么直接连接上对方服务器然后用Send就可以发送指定的内容,但其实发送的数据并不止你的那些内容,有一些东西是流套接字会给你自动补上的。TCP是属于IPXY的一个子XY,那么要发送一个TCP数据包就得加上(以太网XY报头这个先不提),IPXY的报头,和TCPXY报头,这些东西流套接字都会帮你处理,而原始套接字则不会(当然也可以设置让原始套接字构造IP报头)。原始套接字他有更多的用途,但相对来说也比流套接字或数据报套接字麻烦。 原始套接字还可以设置成允许接收本地所有的套接字数据。那么我们就利用这个功能来做嗅探器!
首先:1.使用 WSAStartup (合并短整数 (2, 2), WSADATA) 来初始化Winsocket服务 其参数有2个 第一个 (短整数型/双字节型):wVersionRequired 这个参数表明使用的winsock版本号,高位指定修订版本号,低位指定主版本号。第二个参数 WSADATA类型 用于接收Winsocket细节东西,咱不用管它。
//下面就不说那么详细了,源码里面全是注释,自己看。
2.然后使用socket (#AF_INET, #SOCK_RAW, #IPPROTO_IP) 来创建一个套接字 第一个参数应该是表明Internet地址格式反正只能固定这个,仅仅支持这个 参数2:表明要创建的是一个原始套接字,参数3:指定IPXY IPXY包括其子XY TCP UDP 等。成功返回套接字句柄
3. bind (s, addr, sizeof (addr)) 将套接字绑定至指定网卡,参数1=套接字句柄 参数2为一个addr结构的值,该值表明要绑定的网卡IP及端口号
4. ioctlsocket (Socket, 2550136833, 1) 将套接字的模式改变为允许接收所有数据
顺利完成上面的操作后咱就可以用Recv来接收数据包了,只要不断的调用Recv就OK。