python - 我应该如何使用 Scapy 将魔术包发送到我的无人机?
问题描述
我正在尝试启动从我的无人机到我的计算机的视频数据流。无人机通过移动应用程序运行 wifi 接入点,用于视频和照片控制(飞行控制器使用单独的 2.4 GHz 信号)。我在计算机上的 Android 模拟器上运行该应用程序,并嗅探了以下流量:
- 无人机发送一个
PSH,ACK
包含 20 字节数据的数据包,如下所示:
无人机到客户数据 - 示例 1:
Data (20 bytes)
Data: 637d00000180ffffd188d5ca3586d5ca00020000
Text: c}
[Length: 20]
无人机到客户数据 - 示例 2:
Data (20 bytes)
Data: 569500000168ffffaaac8c4c01aa8c4c00020000
Text: V\357\277\275
[Length: 20]
无人机到客户数据 - 示例 3:
Data (20 bytes)
Data: 1e9a00000164ffff46bdb26265bbb26200020000
Text: \036\357\277\275
[Length: 20]
- 客户端将
ACK
数字增加 20 - 客户端发送一个
PSH,ACK
包含 12 字节数据的数据包
我用 Scapy 编写了一个 TCP 连接脚本,我可以到达从客户端到服务器(无人机)的最后一个 PSH、ACK 数据包。然后,无人机立即发送一个FIN
数据包。我正在使用 netcat 侦听端口 6666,该端口始终是无人机尝试将 UDP 数据包发送到的端口,作为分段的 IPv4 数据包。
这是脚本连接的捕获:
这是我的 Scapy 脚本:
from scapy.all import *
#SYN
ip = IP(src="172.16.10.139",dst="172.16.10.1")
SYN = TCP(sport=39921,dport=8888,flags="S",seq=2091127182,options=[('MSS', 1460), ('SAckOK', b''), ('NOP', None), ('WScale', 6)])
SYNACK=sr1(ip/SYN)
#ACK
ACK=TCP(sport=39921,dport=8888,flags="A",seq=SYNACK.ack, ack=SYNACK.seq +1)
PSHACK=sr1(ip/ACK)
#ACK2
ACK2=TCP(sport=39921,dport=8888,flags="A",seq=PSHACK.ack, ack=PSHACK.seq +20)
send(ip/ACK2)
#PSHACK2
PSHACK2=TCP(sport=39921,dport=8888,flags="PA",seq=PSHACK.ack, ack=PSHACK.seq +20)
send(ip/PSHACK2/'\001\357\277\275\357\277\27')
请注意,我最初将值\275
作为字符串的最后四个字符,但后来 Wireshark 将数据长度显示为 13 个字节。我省略了最后一个5
,然后 Wireshark 报告数据长度为 12 个字节。我不确定这个数字的意义是什么,5
或者我是否发送了正确的 12 个字节。
正如在 Wireshark 中观察到的,这些是我发送的 12 个字节:
Data (12 bytes)
Data: 01c3afc2bfc2bdc3afc2bf17
Text: \001\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\027
[Length: 12]
我使用模拟器捕获了几个成功的连接,我注意到捕获的数据以以下方式变化:
客户端到无人机数据 - 捕获 1
Data (12 bytes)
Data: 0174b21607b6c6fc082a7913
Text: \001t\357\277\275\026\a\357\277\275\357\277\275\357\277\275\b*y\023
[Length: 12]
客户端到无人机数据 - 捕获 2
Data (12 bytes)
Data: 01f8d7142452257d254afd91
Text: \001\357\277\275\357\277\275\024$R%}%J\357\277\275\357\277\275
[Length: 12]
客户端到无人机数据 - Capture 3
Data (12 bytes)
Data: 0128e514ba003ceabb2821ff
Text: \001(\357\277\275\024\357\277\275
[Expert Info (Warning/Undecoded): Trailing stray characters]
[Trailing stray characters]
[Severity level: Warning]
客户端到无人机数据 - Capture 4
Data (12 bytes)
Data: 01c0cf16a1c4d009a284a020
Text: \001\357\277\275\357\277\275\026\357\277\275\357\277\275\357\277\275\t\357\277\275\357\277\275\357\277\275
[Length: 12]
我需要了解如何使用 Scapy 发送相同的 12 字节数据。我相信PSH,ACK
客户端发送给无人机的数据包是魔术包,12字节的数据是魔术字。
Android 应用程序包含一组 C++ 共享对象,这些对象显然处理我试图模拟的连接。
我应该如何将必要的 12 字节数据添加到我的 Scapy 脚本中,以将分段的 IPv4 数据包流启动到客户端上的 UDP 端口?或者,看起来 Scapy 脚本是否正确并且问题出在客户端配置上,即目标端口的可用性?
解决方案
推荐阅读
- dynamics-365 - 在 Dynamics 365 中哪里可以找到业务中心 API 的环境名称
- javascript - 你如何让球弹到 Y 位置
- powershell - PowerShell 哈希表引用返回 null
- session - 通过 google-apps-script 获取 errorCode":"E0000005","errorSummary":"Invalid session"
- amazon-web-services - Sagemaker 上的自定义训练 Tensorflow:警告 keras.py:603 在使用 tf.function 前向传递期间无法保存层值
- python - Discord bot 命令有时有效
- angular - Angular on icon click 切换类名或类名的一部分
- windows - 有没有办法使用cmder过滤Windows中的命令历史记录?
- excel - 同一个工作簿中的两张工作表调试错误?
- c++ - 与在网络编程中使用 Qthread 类相关的错误