最近很长一段时间内又捡起了大学时丢下的网络协议,开始回顾网络协议编程,因而linux系统成了首选,它让我感到了无比的自由,能够很通透的游走于协议的各层。linux
最初写了个ARP欺骗程序,很成功的欺骗了win7与虚机内的windows 2003之间的通信,感受linux系统在网络接口这一块确实很自由,后来基于ARP原理继续写了个ARP扫描器,感受也还不错。同时对于网络编程来讲,编写一个嗅探程序也是必不可少的,它一样式在linux下完成的,能够很好的监听虚机构成的局域网。编程
在完成主机扫描后,接下来步入端口扫描领域,我的偏好SYN扫描,为了扫描主机所在的局域网,开始在win7下编写SYN扫描器代码,很快一个小巧的扫描器完成,接下来却遇到一个花了很多时间还没解决的问题。在用SYN扫描器作虚机内网测试时,发现监听程序不管如何也没办法捕获到扫描器构造的TCP包,首先开始怀疑是否是构造的TCP包不规范,致使被网卡丢弃了,调试代码,没有发现问题,并且sento成功的返回了发送出去的字节数,同时用winHex打开发送数据文件,对比TCP/IP协议,也未能找到值得怀疑的地方。在花了很多时间派出扫描器程序的问题,不得不怀疑是否是监听程序存在缺陷,因而更换Wireshark,从新监听网卡,也不能捕获到SYN扫描器构造的TCP包。接下来花了大量的时间在不停的作出问题判断并测试验证,仍是未能找出缘由。windows
直到又写了一个基于TCP链接原理的扫描器,发现它能够很好的工做,监听程序也能很好的捕获到TCP包,此时再次关注sento,开始怀疑raw socket及socket与操做系统有关系,前面测试得出结论,在win7下,socket能够很好的工做,而raw socket则不能。为了验证这个问题,把SYN扫描器搬到windows 2003上运行,当看到给出扫描结果的cmd窗口时,直接傻眼了,竟然真的是与操做系统有关系。网络
最后去msdn上查找raw socket时,找到了下面的描述(http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548%28v=vs.85%29.aspx):app
On Windows 7, Windows Vista, Windows XP with Service Pack 2 (SP2), and Windows XP with Service Pack 3 (SP3), the ability to send traffic over raw sockets has been restricted in several ways:socket
Note The bind function with a raw socket is allowed for other protocols (IPPROTO_IP, IPPROTO_UDP, or IPPROTO_SCTP, for example).tcp
These above restrictions do not apply to Windows Server 2008 R2, Windows Server 2008 , Windows Server 2003, or to versions of the operating system earlier than Windows XP with SP2.测试
总算是弄明白了,然来raw socket真的不能在win7下发送tcp数据包。不过相信,这种限制确定也是能够突破的,只是等待去挖掘而已。操作系统
就是这么一个路人皆知的常识,确实实在在的消耗了我很多的时间和精力,只能说没文化,真可怕!此外还有一点点怀念xp系统,至少他不会阻拦个人raw socket。调试
探索的过程是让人很兴奋的,在攻克一个个知识盲点以后,总能找到新的高度,立足于此,因而有了下一个征程……端口入侵……漏洞扫描……