嗅探工具的主要目标是基于UDP发现目标网络中的存活主机,选择UDP的原因是UDP访问过程开销小。
由于很多的操作系统在处理UDP端口的闭合时都会存在一个共性,我们也正是利用这个共性来开展确定此IP上是否有存活主机。
当我们发送一个数据包给主机上的一个以关闭的UDP接口时,如果此接口返回一个ICMP的话,就表示目标主机存活,如果无返回,说明目标主机不存在 。
#coding = utf-8 import os import socket #目标主机,视情况而定 host = "192.168.1.1 "" #创建原始套接字,然后绑定在公开接口上 if os.name == "nt": socket_protocol = socket.IPPROTO_IP else: socket_protocol = socket.IPPROTO_ICMP sniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol) sniffer.bind((host,0)) #设置在捕获的I数据包中包含IP头 sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1) #在windos平台上,需要设置IOCTL以启用会混杂模式 if os.name == "nt": sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON) #读取单个数据包 print(sniffer.recvfrom(65565)) #然后关闭混杂模式 if os.name == "nt": sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)
IOCTL(输入/输出控制):是用户隔离模式下与内核模式下组件进行通信的方式的组件进行通信的方式.
混杂模式:是指一台机器能够接收所有经过它的数据流,而不论其目的地址是否是他。可供管理员进行网络诊断,在这里我们利用其特性.