Я пытаюсь инициировать поток видеоданных с моего дрона на мой компьютер. Дрон запускает точку доступа Wi-Fi для управления видео и фото через мобильное приложение (контроллер полета использует отдельный сигнал 2,4 ГГц). Я запустил приложение на эмуляторе 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 байтами данных
Я написал сценарий TCP-соединения со Scapy, и я могу добраться до последнего пакета 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 байтов.
Это 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]
Мне нужно понять, как отправить те же 12 байтов данных с помощью Scapy. Я считаю, что пакет PSH,ACK
, который клиент посылает дрону, является магическим пакетом, а 12 байтов данных - волшебным словом.
Приложение Android содержит набор общих объектов C ++, которые, очевидно, обрабатывают соединение, которое я пытаюсь эмулировать.
Как мне добавить необходимые 12 байтов данных в мой скрипт Scapy, чтобы инициировать поток фрагментированных пакетов IPv4 на порт UDP на клиенте? Или, похоже, что скрипт Scapy правильный и проблема в конфигурации клиента, то есть доступности порта назначения?