如何使用Scapy将魔法数据包发送给我的无人机?

2024-04-18 02:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试启动一个视频数据流从我的无人机到我的计算机。无人机运行一个wifi接入点,通过移动应用程序进行视频和照片控制(飞行控制器使用单独的2.4ghz信号)。我在电脑上的Android仿真器上运行该应用程序,并嗅出以下流量:

drone_app_handshake 请注意,成功连接后:

  • 无人机发送一个包含20字节数据的PSH,ACK包,如下所示:

无人机到客户端数据-示例1:

Data (20 bytes)
    Data: 637d00000180ffffd188d5ca3586d5ca00020000
    Text: c}
    [Length: 20]

无人机到客户端数据-示例2:

^{pr2}$

无人机到客户端数据-示例3:

Data (20 bytes)
    Data: 1e9a00000164ffff46bdb26265bbb26200020000
    Text: \036\357\277\275
    [Length: 20]
  • 客户机将ACK数增加20
  • 客户机发送一个PSH,ACK包,其中包含12个字节的数据

我用Scapy编写了一个TCP连接脚本,我可以从客户机到服务器(drone)获得最远的PSH,ACK包。然后,无人机立即发送FIN包。我正在使用netcat监听6666端口,该端口始终是无人机尝试将UDP包作为碎片IPv4包发送到的端口。在

在这里编写了捕获脚本:

drone_script_handshake

这是我的剧本:

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个字节。在

以下是我发送的12个字节,如Wireshark中所观察到的:

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]

客户端到无人机数据-捕获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]

客户端到无人机数据-捕获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脚本是否正确,问题在于客户端配置,即目标端口的可用性?在


Tags: 数据端口textip客户端data字节bytes