Внедрение необработанных TCP-пакетов с помощью Python - PullRequest
5 голосов
/ 26 мая 2010

Что может быть подходящим способом для ввода необработанного TCP-пакета с помощью Python? Например, у меня есть полезная нагрузка, состоящая из шестнадцатеричных чисел, и я хочу отправить эту последовательность шестнадцатеричных чисел сетевому демону: так что, если я решу отправить «abcdef», я также увижу «abcdef» в сети. Но не «6162636566», как в случае:

new = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
new.connect(('127.0.0.1', 9999))
new.send('abcdef')

Могу ли я использовать Python SOCK_RAW для этой цели? Если да, можете ли вы привести пример отправки необработанных TCP-пакетов с помощью SOCK_RAW (поскольку я сам не работал)

Спасибо!

Евгений

Ответы [ 4 ]

10 голосов
/ 26 мая 2010

Попробуйте scapy , мощную интерактивную программу для работы с пакетами.

Пример:

%> sudo scapy

>>> packet1 = IP(dst='127.0.0.1')/TCP(dport=9999)
>>> packet1.payload = 'abcdef'
>>> send(packet1)
.
Sent 1 packets.
>>> packet1.show()
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags= 
  frag= 0
  ttl= 64
  proto= ip
  chksum= None
  src= 127.0.0.1
  dst= 127.0.0.1
  \options\
###[ Raw ]###
     load= 'abcdef'
>>> 
1 голос
/ 26 мая 2010

Для необработанных сокетов SOCK_RAW - путь. Помните, что когда вы используете SOCK_RAW, вы не можете просто отправить полезную нагрузку. Вы должны будете также сделать формирование заголовка. После этого вы можете столкнуться с проблемами в операционной системе. При работе с Raw Sockets в Windows XP мы столкнулись с некоторыми проблемами из-за проблем безопасности.

1 голос
/ 26 мая 2010

Почему бы просто не преобразовать строку в гекс перед ее отправкой?

new = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
new.connect(('127.0.0.1', 9999))
mydata = 'abcdef'
new.send(mydata.encode('hex'))
1 голос
/ 26 мая 2010

Звучит так, как будто вы не уверены в строках символов Python. Например, попробуйте:

new.send('\x0a\x0b\x0c\x0d\x0e\x0f')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...