2014-03-14 1 views
0

У меня есть приложение, которое захватывает и отображает сетевые пакеты. Пакеты представлены в двух формах в TableView и как TreeView. Я использую scapy для захвата сетевых пакетов.Обнаружение протоколов уровня приложения, python?

Я хочу отобразить самый высокий уровень протокола для пакета (наивысший уровень приложения для любого пакета), проблема, с которой я сталкиваюсь, заключается в том, что некоторые пакеты имеют конечную полезную нагрузку, названную как сам протокол (например, полезная нагрузка DNS называется DNS), но некоторые полезные ресурсы называются только Raw (например, полезная нагрузка HTTP называется Raw).

Так что я задавался вопросом, каким образом я могу обнаружить эти протоколы в python.

Это выход для пакета DNS.

enter image description here

Это выход для пакета HTTP.

enter image description here

Вот код, который генерирует дерево.

def packet2Tree(self,pkt): 
    if len(pkt.fields.keys()) == 0 or pkt.name == "": 
     return 
    self.rootNode = Node(pkt.name , self.RootNode) 
    field = pkt.fields_desc 
    for xfield in field: 
     self.childNode = Node(xfield.name , self.rootNode , str(pkt.getfieldval(xfield.name))) 
    self.packet2Tree(pkt.payload) 
    return self.RootNode 

Любой угадать, как решить эту проблему

+1

Я не уверен, если есть встроенный способ сделать это, но вы могли бы посмотреть номера портов и угадать? Scapy, похоже, понимает номера портов для большинства TCP-пакетов (т. Е. Когда вы вызываете 'repr (layer)'), так что, возможно, посмотрите на источник? –

+0

@PeterGibson: Поместите свой комментарий в качестве ответа. – TheCreator232

+0

Вы нашли в источнике scapy, где он сопоставляет номера портов именам? –

ответ

1

я не уверен, если есть встроенный способ сделать это, но вы можете посмотреть на номера портов и сделать предположение? Scapy, похоже, понимает номера портов для большинства TCP-пакетов (т. Е. Когда вы вызываете rep (layer)), поэтому, возможно, посмотрите на источник?

EDIT Этот вопрос объясняет, что socket модуля может сделать это для вас:

python-scapy: how to translate port numbers to service names?

>>> import socket 
>>> socket.getservbyport(80) 
'http' 
>>> socket.getservbyport(21) 
'ftp' 
>>> socket.getservbyport(53, 'udp') 
'domain'