绝大部分操作系统在处理UDP闭合端口时,存在一种共性行为,我们可以通过这种行为来确定某个IP地址上是否有主机存活。当你发送一个UDP数据包到主机的某个关闭的UDP端口上时,目标主机通常会返回一个ICMP包指示目标端口不可达。这样的ICMP信息意味着目标主机是存活的,因为我们可以假设如果没有接收到发送的UDP数据的任何响应,目标主机应该不存在。挑选一个不太可能被使用的UDP端口来确保这种方式的有效性是必要的,为了达到最大范围的覆盖度,我们可以查探多个端口以避免正好将数据发送到活动的UDP服务上。

在Windows和Linux上访问原始套接字有些许不同,但我们更中意于在多平台部署同样的嗅探器以实现更大的灵活性。我们将先创建套接字对象,然后再判断程序在哪个平台上运行。在Windows平台上,我们需要通过套接字输入/输出控制(IOCTL)1设置一些额外的标志,它允许在网络接口上启用混杂模式。在第一个例子中,我们只需设置原始套接字嗅探器,读取一个数据包,然后退出即可。

代码如下:

import socket
import os
#监听的主机
host="127.0.0.1"if os.name == "nt":#os.name——判断现在正在实用的平台,Windows 返回 ‘nt', Linux 返回’posix'。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))
#设置在捕获的数据包中包含IP头
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
#在windows平台上,我们需要设置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)

网络编程员们可以以端口号0来作为连接参数。这样的话操作系统就会从动态端口号范围内搜索接下来可以使用的端口号。

os.name——判断现在正在实用的平台,Windows 返回 ‘nt', Linux 返回’posix'。

ioctl(int fd, int request, void * arg)   设备驱动程序中对设备的I/O通道进行管理的函数。

  • int  fd      文件句柄. 用于socket时, 是socket套接字.
  •        int  request 函数定义的所有操作. 关于socket的操作, 定义在文件中.
  •        void *arg    指针的类型依赖于request参数.

以管理员身份运行该python文件,并打开另一个终端ping某个主机,比如:ping baidu.com

标题经典的IPv4头结构

解析IP层

import socket
import os
import struct
#ctypes模块创建类似于C的结构体,这允许我们以友好的方式处理和显示IP头和其中的组成部分。
from ctypes import *
#监听的主机
host="10.60.17.46"
#IP头定义
class IP(Structure):_fields_=[("ih1",c_ubyte,4),("version",c_ubyte,4),("tos",c_ubyte),("1en",c_ushort),("id",c_ushort),("offset",c_ushort),("tt1",c_ubyte),("protocol_num",c_ubyte),("sum",c_ushort),("src",c_ulong),("dst",c_ulong)]def __new__(self,socket_buffer=None):#from_buffer_copy方法在__new__方法将收到的数据生成一个IP class的实例return self.from_buffer_copy(socket_buffer)def __init__(self,socket_buffer=None):#协议字段与协议名称对应self.protocol_map={1:"ICMP",6:"TCP",17:"UDP"}#可读性更强的IP地址#inet_ntoa()把IP数据转换成字符串。self.src_address = socket.inet_ntoa(struct.pack("<I", self.src))self.dst_address = socket.inet_ntoa(struct.pack("<I", self.dst))#协议类型try:self.protocol=self.protocol_map[self.protocol_num]except:self.protocol=str(self.protocol_map)#创建原始套接字,然后绑定在公开接口上。
if os.name == "nt":#os.name——判断现在正在实用的平台,Windows 返回 ‘nt', Linux 返回’posix'。socket_protocol =socket.IPPROTO_IP
else:socket_protocol=socket.IPPROTO_ICMP
# protocol:协议类型
# 传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP
# 网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)
sniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol)
sniffer.bind((host,0))#网络编程员们可以以端口号0来作为连接参数。这样的话操作系统就会从动态端口号范围内搜索接下来可以使用的端口号。网络编程员们可以以端口号0来作为连接参数。这样的话操作系统就会从动态端口号范围内搜索接下来可以使用的端口号。
#设置在捕获的数据包中包含IP头
#IP_HDRINCL在数据包中包含IP首部    
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
#在windows平台上,我们需要设置IOCTL以启动混在模式
if os.name=='nt':sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
try:while True:#读取数据包rwa_buffer = sniffer.recvfrom(65565)[0]#将缓冲区的前20个字节按IP头进行解析ip_header=IP(rwa_buffer[0:20])print("Protocol:%s %s ---> %s"%(ip_header.protocol,ip_header.src_address,ip_header.dst_address))
except KeyboardInterrupt:#如果在windows下运行,关闭混杂模式。if os.name == 'nt':sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

python上的包嗅探相关推荐

  1. python 进行抓包嗅探

    一.绪论 最近一直想弄一个代理,并且对数据包进行解读,从而完成来往流量的嗅探.于是今天学习了一下如何使用Python抓包并进行解包. 首先要用到两个模块 dpkt(我这边ubuntu16.04 LTS ...

  2. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第三章 网络工程-原始套接字与嗅探(1)主机发现工具与包嗅探

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第三章 网络工程-原始套接字与嗅探(1)主机发现工具 文章目录 黑帽python第二版(Black Ha ...

  3. python使用fpdf2包和pdfrw包在已有的PDF页面上添加新的页

    python使用fpdf2包和pdfrw包在已有的PDF页面上添加新的页 目录 python使用fpdf2包和pdfrw包在已有的PDF页面上添加新的页 #包安装 #新内容添加到已有的PDF页面上 # ...

  4. python以下导入包的格式错误的是_ICMP python上的错误数据包

    如何创建帧icmp 我在python上标记格式错误的包导入套接字,结构,uuid,子进程,fcntl,time,random 列表项 from binascii import hexlify,unex ...

  5. 2018年7月份,python上传自己的包库到pypi官网的方法

    最近pypi官网进行了更新,老的上传网址作废了.记录下上传到pypi的方法 0.去pypi官网注册账号,没账号是不可能上传的,想想也是那不乱套了吗,注册后会收到一个邮件需要点击然后重新登录 1.目录就 ...

  6. python导入同级包_python小课堂15 - 史上最详细的包和模块import讲解篇

    python小课堂15 - 史上最详细的包和模块import讲解篇 前言 在大量的代码设计中,我们不可能将所有代码都写在一个.py文件,所以有了包.模块,而为了代码可以重复利用(复用性),就有了类.函 ...

  7. python 运维包_python运维常用模块

    1.psutil是一个跨平台库(https://github.com/giampaolo/psutil) 能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和 ...

  8. python构造数据包库_scapy构造数据包

    一.进入scapy交互界面 在终端下输入:scapy ,进入交互界面: 二.查看scapy已经实现的网络协议 ls() 列出scapy中已实现的网络协议 ls(协议类型) 查看某个协议头部字段格式 l ...

  9. python导入外部包_您会喜欢的10个外部Python软件包

    python导入外部包 by Adam Goldschmidt 亚当·戈德施密特(Adam Goldschmidt) 您会喜欢的10个外部Python软件包 (10 External Python p ...

  10. Python的常用包有哪些,分别有什么作用?

    [每日一问] Python的常用包有哪些,分别有什么作用? 来自Datawhale优秀回答者:追风者 Python常用包 1.Numpy(数值运算库) 2.Scipy(科学计算库) 3.Matplot ...

最新文章

  1. 快速删除c/c++语言中的注释
  2. Centos7.X通过rpm包安装Docker
  3. Nacos源码处理心跳请求
  4. python的作者为什么要创造python_为什么要学习Python?老男孩Python开发
  5. Visual Studio Code 显示隐藏的.git文件和目录
  6. cisco设备vlan,trunk,以太网通道管理
  7. 023 -uniApp
  8. 关于mail-notification和apt-get
  9. 解决IIS安装的问题:要求输入用户名和密码
  10. mysql timeout expired处理
  11. Android中类似Linux下ldd分析可执行文件和动态库对库的依赖
  12. 【数位dp】模版总结
  13. 《算法笔记》胡凡 配套刷题网站
  14. Fiddler证书过期解决
  15. ubuntu18.04声音dummy output的问题
  16. 【设计】二极管-稳压管稳压电路
  17. 哪个dns服务器延迟最低,可以立即测出延迟最小的DNS
  18. catia曲面扫掠命令详解_4.3.3.15-扫掠曲面之二次曲线_两条引导线扫略
  19. python2 assert判断字典的包含关系
  20. 未来的计算机辅助教学是什么样的,计算机辅助教学cat是什么软件

热门文章

  1. python 同步记事本_如何使用Python同步文件夹
  2. 江西计算机竞赛有哪些,江西自主招生认可的竞赛有哪些
  3. Latex 操作(3) beamer(PPT)
  4. 基于WEMOS的智能WiFi避障小车
  5. 如何禁用win10的水果输入法
  6. Git:rebase 是什么
  7. 人工智能会议等级列表
  8. hdu 4622 Reincarnation(后缀树组求子串个数)
  9. 【Python爬虫实战】【天天基金网】想要低风险+心动收益?5分钟学会筛选优质债券基金
  10. Xcode debug时如何看crash的call stack