Извлечение сетевого пакета из набора байт

Стороннее API присылает мне сырые пакеты, но они обернуты какими-то байтами. Например вот:

0000   00 00 29 00 ee 48 00 a0 a0 08 00 a0 a0 08 00 00
0010   10 0c 1c 16 40 01 b6 00 18 00 00 00 00 1a 18 00
0020   00 06 00 00 01 00 00 00 02 80 00 00 00 ff ff ff
0030   ff ff ff 78 24 af e4 ea bc 78 24 af e4 ea bc b0
0040   2b 56 d0 9f 6b f6 00 00 00 64 00 11 11 00 0c 43
0050   6f 6c 69 62 72 69 5f 32 5f 35 47 01 08 8c 12 98
0060   24 b0 48 60 6c 05 04 02 03 00 00 07 34 44 45 20
0070   24 01 17 28 01 17 2c 01 17 30 01 17 34 01 17 38
0080   01 17 3c 01 17 40 01 17 64 01 1e 68 01 1e 6c 01
0090   1e 70 01 1e 74 01 1e 84 01 1e 88 01 1e 8c 01 1e
00a0   00 20 01 00 23 02 17 00 30 14 01 00 00 0f ac 04
00b0   01 00 00 0f ac 04 01 00 00 0f ac 02 0c 00 0b 05
00c0   00 00 01 00 00 2d 1a ef 09 17 ff ff ff 00 00 00
00d0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00e0   00 3d 16 64 0d 00 00 00 00 00 00 00 00 00 00 00
00f0   00 00 00 00 00 00 00 00 00 7f 08 04 00 08 00 00
0100   00 00 40 bf 0c b2 59 82 0f ea ff 00 00 ea ff 00
0110   00 c0 05 01 6a 00 00 00 c3 04 02 02 02 02 dd 2f
0120   f8 32 e4 01 01 01 02 01 00 03 14 60 f6 00 93 e2
0130   64 4f a7 43 ac 8c b9 7a b3 5a 62 5a ed 3b 92 07
0140   04 5a ed 3b 92 12 02 b8 bc 13 01 01 15 01 00 dd
0150   36 00 50 f2 04 10 4a 00 01 10 10 44 00 01 02 10
0160   57 00 01 01 10 47 00 10 c8 1c 5f d8 ca 8d 25 dd
0170   26 fc cb 74 e9 f8 ec 01 10 3c 00 01 03 10 49 00
0180   06 00 37 2a 00 01 20 dd 09 00 10 18 02 00 00 9c
0190   00 00 dd 18 00 50 f2 02 01 01 84 00 03 a4 00 00
01a0   27 a4 00 00 42 43 5e 00 62 32 2f 00 46 05 30 00
01b0   00 00 00 2b 2e 38 e8

Видно, что первые 41 байт - это какая-то икапсуляция или без понятия, что это. А дальше уже идет осмысленный пакет. Я попробовал просто убирать первые 41 байт, но просматривая в Wireshark результаты, всё равно вижу поврежденные (malformed) пакеты. Например вот .pcap файл: https://dropmefiles.com/tqiJX

Каким образом можно извлечь сырой пакет из подобного рода набора байт?


Ответы (1 шт):

Автор решения: gleb_work

Разобрался. Первые 41 байт - это Radiotap Header, который возникает при захвате сетевых пакетов. Кроме хедера есть ещё последние 4 байта, которые тоже являются частью инкапсуляции.

Пример удаления:

int remove_header(unsigned char *arr, int len)
{
    std::memmove(arr, arr + 41, len);
    return len - 41 - 4;
}
→ Ссылка