数据包工具--Scapy基础篇

article/2025/9/6 4:34:50

数据包工具--Scapy基础篇

  • 零、前言
  • 一、Scapy是什么?
  • 二、Scapy基础
    • 1 利用pip安装库
    • 2 基本使用
      • 2.1 conf变量
      • 2.2 lsc()方法
      • 2.3 ls()方法
    • 3 发送数据
      • 3.1 创建数据
      • 3.2 发送数据
      • 3.3 fuzz()方法
      • 3.4 发送与接收数据
  • 三、结尾


零、前言

学习过程中用到Scapy这个工具,用了一些小功能之后发现效果挺好的,自由度高,比其他的很多工具的可自定义程度要高太多了,所以写一篇Scapy基础篇分享给各位,希望能对各位有用。


一、Scapy是什么?

咱们看看官方文档怎么介绍Scapy工具的:

Scapy is a Python program that enables the user to send, sniff and dissect and forge network packets. This capability allows construction of tools that can probe, scan or attack networks.

Scapy 是一个 Python 程序,它使用户能够发送、嗅探、剖析和伪造网络数据包。此功能允许构建可以探测、扫描或攻击网络的工具。

In other words, Scapy is a powerful interactive packet manipulation program. It is able to forge or decode packets of a wide number of protocols, send them on the wire, capture them, match requests and replies, and much more. Scapy can easily handle most classical tasks like scanning, tracerouting, probing, unit tests, attacks or network discovery. It can replace hping, arpspoof, arp-sk, arping, p0f and even some parts of Nmap, tcpdump, and tshark.

换句话说,Scapy 是一个强大的交互式数据包操作程序。它能够伪造或解码多种协议的数据包,通过网络发送它们,捕获它们,匹配请求和回复等等。Scapy 可以轻松处理大多数经典任务,例如扫描、跟踪路由、探测、单元测试、攻击或网络发现。它可以替代 hping、arpspoof、arp-sk、arping、p0f 甚至 Nmap、tcpdump 和 tshark 的某些部分。

Scapy also performs very well on a lot of other specific tasks that most other tools can’t handle, like sending invalid frames, injecting your own 802.11 frames, combining techniques (VLAN hopping+ARP cache poisoning, VOIP decoding on WEP encrypted channel, …), etc.

Scapy 在大多数其他工具无法处理的许多其他特定任务上也表现出色,例如发送无效帧、注入您自己的 802.11 帧、组合技术(VLAN 跳跃 + ARP 缓存中毒、WEP 加密通道上的 VoIP 解码等), 等等。

scapy介绍

二、Scapy基础

1 利用pip安装库

类型包含内容Pip命令
默认版Only Scapypip install scapy
基础版Scapy & IPython. Highly recommendedpip install --pre scapy[basic]
完整版Scapy & all its main dependenciespip install --pre scapy[complete]
如果只需要安装scapy库的话,直接使用pip安装以下命令就行了
pip install scapy

但对于想要完整体验Scapy强大功能的兄弟姐妹们而言,官方还是推荐至少使用以下命令安装基础版Scapy

pip install --pre scapy basic

完全体的Scapy直接敲!!!!!!!

pip install --pre scapy complete

Windows环境下除了安装Python环境之外还需要安装Npcap或Wincap,官方推荐使用Npcap

关于系统安装使用Scapy的命令行界面可以参考官方的下载与安装文档:Scapy的下载与安装

当以上安装环节全部完成之后不如终端上敲个“scapy”试试,然后就能看到Scapy的欢迎界面了(虽然没有GUI来的美观):
Scapy安装完成后

2 基本使用

起手引个包(Scapy v2 )

from scapy.all import *

2.1 conf变量

咱们可以通过conf变量来查看scapy的配置参数,然后根据咱们的需求来修改参数

print(conf)

放一些局部参数出来感受感受
conf结果
对于使用命令行的兄弟们来说,修改命令行的主题色必定是使用命令行界面前的第一件事,咱们可以通过以下命令来修改命令行颜色:

''' 
包含以下几种主题
DefaultTheme, BrightTheme, RastaTheme, ColorOnBlackTheme, BlackAndWhite, HTMLTheme, LatexTheme
'''
conf.color_theme = BrightTheme()  # 使用明亮色主题,默认是没有主题,即<NoTheme>

2.2 lsc()方法

lsc()方法用来查看Scapy支持的所有命令

lsc()

部分命令截图如下:
lsc()结果
然后悄咪咪地看了以下lsc()的实现代码:

def lsc():# type: () -> None"""Displays Scapy's default commands"""print(repr(conf.commands))

哦,原来就是之前conf中的commands,那没事了

2.3 ls()方法

ls()方法的使用分两种情况

  • 无参数的情况下,用来查看可以实现的所有的网络协议
  • 带参数的情况下,用来查看参数(网络协议)的字段详情
ls()  # 不带参数情况下输出所有支持的网络协议

ls()结果

'''
ls(网络协议类)
'''
ls(UDP())  # 带参数情况下输出协议相关参数

UDP字段
嗯?你们说知道这些字段有什么用?我都不好意思拆穿你们,不知道有什么用你还会搜到这篇文章吗?

3 发送数据

3.1 创建数据

咱们这里先用IP数据包举例吧:

'''
实例化一个IP数据包
调用"data.show"方法查看数据包的默认字段
'''
data = IP()
data.show()

IP字段
啥?一个包不够?OK,满足你们的需要,咱们直接按IP+掩码来构建一组IP数据可以吧?不多说,直接上代码:

'''
构建了一组数据,目标地址为www.slashdot.org的IP,且掩码为30的所有IP地址
'''
data=IP(dst="www.slashdot.org/30")
data.show()

IP数据包集
是不是发现原来咱们设置的dst为127.0.0.1的显示结果不一样?咱们这就已经根据一个网段生成一组数据包了。除此之外,咱们还能构建一个指定多层字段的数据包,比如指定IP协议之后再指定ICMP协议字段,就可以修改成以下方式:

'''
指定IP目的地址并使用上层的ICMP协议
'''
data = IP(dst="1.2.3.4")/ICMP()

多层数据包

3.2 发送数据

1、send()方法在第三层(网络层)发工作,处理路由数据与第二层数据:

'''
处理第三层数据,构建数据发送即可,设置return_packets=True可接收返回的数据包
'''
send(IP(dst="1.2.3.4")/ICMP())
resp = send(IP(dst="1.2.3.4")/ICMP(), return_packets=True)

2、sendp()方法在第二层(数据链路层)工作,需要指定正确的接口与数据链路层协议:

'''
处理第二层数据,需要指定接口与链路层协议,设置return_packets=True可接收返回的数据包
'''
sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")
resp = sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), return_packets=True, iface="eth1")

3.3 fuzz()方法

fuzz()方法是用来创建随机的合理参数的数据包,比如下面这个:

'''
loop字段代表循环发送
fuzz(随机的协议类)
这里咱们就构建了一个除了目标地址与NTP版本为4之外的一个随机数据包
(如果您在 IP 层使用 fuzz(),则 src 和 dst 参数不会是随机的,如果需要的话,请使用 RandIP())
'''
send(IP(dst="127.0.0.1")/fuzz(UDP()/NTP(version=4)),loop=1)

构建的随机数据包

3.4 发送与接收数据

1、sr()方法发送数据包与接收数据,返回值为两个,一个是应答返回的数据包,一个是未应答的数据包

'''
ans为返回的应答数据包
unans为发送的未应答的数据包
调用ans.summary()与unans.summary()查看简单的数据包信息,比".show"的信息要少
'''
ans, unans = sr(IP(dst="192.168.3.1")/TCP(dport=[21,22,23]))
ans.summary()
unans.summary()

发送数据包

2、sr1()方法是sr()的特殊用法,仅仅返回一个参数,就是所收到的应答的数据包

'''
resp为返回的应答数据包
'''
resp = sr1(IP(dst="www.slashdot.org")/ICMP())

3、srp()方法与srp1()方法是针对二层数据的发送方法,区别也就是sr()与sr1()的区别,即返回参数是否包含未应答的发送数据。

三、结尾

差不多Scapy的基础使用就到这里了吧,至于一些高级应用,就暂时不讲了,等之后对这方面的应用需求更高的时候,再整理一些Scapy的“骚”操作吧,Scapy这个几乎“万能”的数据构造库可不仅仅这么一些功能。建议各位还是参照官方文档来玩一些“技巧”。

Scapy官方文档


http://chatgpt.dhexx.cn/article/hO8nurtE.shtml

相关文章

SCAPY官方教程一

一、Scapy简介 Scapy是一个强大的基于Python的交互式数据包操作程序和库。Scapy 使用 Python 解释器作为命令板,这意味着您可以直接使用 Python 语言(分配变量、使用循环、定义函数等) Scapy 是一个 Python 程序,它使用户能够发送、嗅探、剖析和伪造网络数据包。这种能力…

Python中Scapy使用方法,模块中的常用函数,简单的端口扫描编写

目录 scapy是什么 scapy的使用 IP() src()和dst() Ether() 采用分层的方式来构造数据包 raw()和hexdump() summary()和show() 如何在scapy中发送和接收数据包 send()和sendp() sr()、sr1()和srp() 简单的端口扫描 sniff() 使用scapy编写简单的端口扫描 scapy是什…

斯特林公式、沃利斯公式

目录 一&#xff0c;斯特林公式 1&#xff0c;公式 2&#xff0c;证明 3&#xff0c;更多项 4&#xff0c;变形 二&#xff0c;沃利斯公式 1&#xff0c;公式 2&#xff0c;变形 一&#xff0c;斯特林公式 1&#xff0c;公式 2&#xff0c;证明 3&#xff0c;更多项 …

在谈天津2023年高考压轴题:斯特林公式数列极限

证明单调性&#xff0c;转化为数列极限问题&#xff0c;利用斯特林公式求极限

斯特林公式应用

51nod1058 这题让求n的阶乘长度&#xff0c;n范围到1e6&#xff0c;很明显会爆long long&#xff0c;那么就需要一个公式直接算出结果–斯特林公式&#xff0c;这个公式的作用就是求n阶乘的近似值。 我们知道求一个十进制数x的位数&#xff0c;log10(x) 1&#xff0c; 用斯特…

【高等数学】伽马函数与斯特林公式

伽马函数的背景 1728年&#xff0c;哥德巴赫在考虑数列插值的问题&#xff0c;通俗的说就是把数列的通项公式定义从整数集合延拓到实数集合&#xff0c;例如数列1,4,9,16…可以用通项公式n自然的表达&#xff0c;即便 n 为实数的时候&#xff0c;这个通项公式也是良好定义的。直…

数论 斯特林公式

斯特林公式是一条用来取n阶乘近似值的数学公式。一般来说&#xff0c;当n很大的时候&#xff0c;n阶乘的计算量十分大&#xff0c;所以斯特灵公式十分好用。从图中可以看出&#xff0c;即使在n很小的时候&#xff0c;斯特灵公式的取值已经十分准确。 公式为&#xff1a; 从图…

求N的阶乘长度(斯特林公式)

输入N求N的阶乘的10进制表示的长度。例如6! 720&#xff0c;长度为3。 求N的阶乘长度 计算n!的公式是斯特林公式: 计算一个数的长度为 log10&#xff08;n&#xff09; 1 AC代码&#xff1a; /***  ┏┓   ┏┓ * ┏┛┻━━━┛┻┓ * ┃       ┃  * ┃…

阶乘问题——斯特林公式

1、计算n&#xff01;的位数 2、估计lg(n&#xff01;)的大小 斯特林公式&#xff1a;&#xff08;n越大越精确&#xff09; 更加精确地&#xff1a; 或者&#xff1a; 相关题目&#xff1a;假的数学游戏 1、计算n&#xff01;的位数 对于整数x&#xff0c;我们知道其位…

斯特林公式的证明

斯特林公式的证明 0.引言 斯特林公式&#xff08;Stirling’s approximation&#xff09;是一条用来取n的阶乘的近似值的数学公式。一般来说&#xff0c;阶乘的计算复杂度为线性。当要为某些极大大的n求阶乘时&#xff0c;常见的方法复杂度不可接受。斯特林公式能够将求解阶乘…

斯特林公式(Stirling's approximation)

斯特林公式&#xff08;Stirlings approximation&#xff09;是一条用来取n的阶乘的近似值的数学公式。一般来说&#xff0c;当n很大的时候&#xff0c;n阶乘的计算量十分大&#xff0c;所以斯特林公式十分好用&#xff0c;而且&#xff0c;即使在n很小的时候&#xff0c;斯特林…

斯特林公式

斯特林公式 定义&#xff1a; 斯特林公式是用来求N的阶乘近似值的公式&#xff1a; 公式为&#xff1a; n ! 2 π n ( n e ) n n!\sqrt{2\pi n}(\frac{n}{e})^n n!2πn ​(en​)n 公式的应用&#xff1a;求n&#xff01;的位数 大家都知道&#xff0c;求一个十进制数n的位…

斯特林公式 ——Stirling公式(取N阶乘近似值)

斯特灵公式是一条用来取n阶乘近似值的数学公式。一般来说&#xff0c;当n很大的时候&#xff0c;n阶乘的计算量十分大&#xff0c;所以斯特灵公式十分好用。从图中可以看出&#xff0c;即使在n很小的时候&#xff0c;斯特灵公式的取值已经十分准确。 公式为&#xff1a; 从图…

popwindow的封装

popwindow使用中还是遇到几个问题&#xff0c;记录一下 1、popwindow弹出位置&#xff0c;还未解决弹出在控件上方的办法&#xff08;目前高度写死&#xff09; 2、popwindow弹出时背景变灰&#xff08;类似dialog的效果&#xff09; 3、popwindow与Listview使用时&#xff…

Andorid PopWindow使用总结

popwindow 经常使用的一个底部弹框 简单的几行代码实现 public class InflateActivity extends AppCompatActivity {private PopupWindow popupWindow;Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentV…

android自定义popwindow,Android应用开发Android 自定义PopWindow的简单使用

本文将带你了解Android应用开发Android 自定义PopWindow的简单使用,希望本文对大家学Android有所帮助。 下面用一个简单的自定义布局来讲解PopWindow的使用 先看效果图: 1.popwidow的类实现: import android.content.Context; import android.graphics.drawable.BitmapDrawa…

popwindow详解

我上一篇文章讲解截安卓动画的最基本的东西&#xff0c;而怎么实现它们是要一个载体的。我这篇文章讲的就是其中一中实现方 式:popwindow. popwindow直译过来就是突然出现的弹框&#xff0c;比如我们在任何一款app当中基本都有个头像&#xff0c;你点击它就会出现个弹框让你选…

popWindow的使用方法

popWindow的使用方式 今天说的是比较简单的popwindow,弹出框&#xff0c;这个其实挺简单的主要是有个地方比较可能会出问题就是点击事件 [java] view plain copy private void initPopWindow(final TextView tview) { final String[] name { "份", "斤",…

自定义popwindow

自定义popwindow 前言&#xff1a;很普通的popwindow&#xff0c;温故下。 1. PopupWindow是一个以弹窗方式呈现的控件&#xff0c;可以用来显示任意视图(View)&#xff0c;而且会浮动在当前活动(activity)的顶部。 2. 基本属性&#xff1a; 设置宽的值&#xff0c;可以是W…