Scapy: поиск самодельных слоев

Скажем, я создал собственный слой в scapy, например

class MyProtocol(Packet):

    name = "MyProtocol"
    fields_desc = [ IntField("layerLength", 8), # always the same
                    ShortField("numberA", 4),
                    ShortField("numberB", 2),
                    IntField("numberC", 2) ]

Если бы у меня было два устройства, одно отправляло пакеты, содержащие этот самодельный слой наверху, а другое - прослушивало сетевой трафик - как могло бы второе устройство определить, содержит ли один из прослушанных пакетов этот специальный уровень или нет? Scapy уже распознает множество слоев, но как мне заставить его распознавать мой собственный слой?

Я знаю, что могу просто взять необработанную часть каждого пакета, проанализировать ее на уровне байтов и, например, проверить, действительно ли поле "layerLength" содержит общую длину слоя, или добавить какое-то специальное уникальное поле, но это кажется слишком сложно, потому что Скапи уже знает некоторые слои. Так есть ли способ заставить Скапи распознавать определенный слой?


person vicco    schedule 20.07.2015    source источник


Ответы (1)


Scapy использует так называемую привязку уровня, чтобы указать, когда должен применяться конкретный пакетный анализатор. Вы можете увидеть примеры scapy исходного кода в каждом модуле слоя.

Например. Если вы используете свой протокол через TCP-порт 2222, вы можете добавить в свой модуль следующую строку:

bind_layers( TCP, MyProtocol, dport=2222)

Scapy попытается использовать MyProtocol для анализа полезной нагрузки TCP как MyProtocol.

person Eriks Dobelis    schedule 20.07.2015
comment
Рад, что это помогло. Если вы используете python3, ознакомьтесь с моей scapy-вилкой с поддержкой pcapng и другими улучшениями github.com/phaethon/scapy - person Eriks Dobelis; 21.07.2015
comment
Спасибо. Хотя в настоящее время я не использую python3, я посмотрю на него. - person vicco; 21.07.2015