Форум сайта python.su
Кажется, только у вас не получается.
Может, потому что считаете от конца ответа - а нужно таки content-length начиная со старта тела. Или перехватываете только первый пакет из ответа, забывая обработать хвост.
Офлайн
import pcapy, gzip, StringIO, re
from impacket.ImpactDecoder import *
def getParam(typ, data):
d=re.compile(typ+'(.*?)\n')
res=re.findall(d, data)
return res[0]
max_bytes = 10000000
promiscuous = False
read_timeout = 1000
pc = pcapy.open_live("wlan0", max_bytes, promiscuous, read_timeout)
pc.setfilter('tcp')
def recv_pkts(hdr, data):
packet = EthDecoder().decode(data)
packet=packet.get_data_as_string()
Size=int(getParam('Content-Length: ', packet))
if "Content-Encoding: gzip" in packet:
query=gzip.GzipFile('', 'rb', 9, StringIO.StringIO(packet))
print query.read()
packet_limit = -1
pc.loop(packet_limit, recv_pkts)
Андрей СветловПробовал даже циклически перебирать всевозможные варианты оступов от начала и конца - все равно, ошибка.
Может, потому что считаете от конца ответа - а нужно таки content-length начиная со старта тела.
Андрей СветловА pcapy и impacket не делают этого автоматом? Приведите, пожалуйста, рабочий пример. Заранее спасибо.
Или перехватываете только первый пакет из ответа, забывая обработать хвост.
Отредактировано (Окт. 17, 2010 17:57:08)
Офлайн
Нет, все правильно, Content-Length - это длина тела БЕЗ учета длины заголовков.
Раскодируете вы все правильно, скорей всего дело в том что нужно соединять все пакеты, а не только первый.
akolesnikovpcapy точно не делает, но проверить не сложно: надо запросить чтонибудь большое и посмотреть - есть ли пакеты с длиной больше чем 1500 байт. Если есть - то значит делает, а если нет - занчит придется вручную.
А pcapy и impacket не делают этого автоматом?
Офлайн
Спасибо. А каким образом лучше склеивать пакеты, как отслеживать пакеты в пределах одного запроса? Вроде какой-то служебный байт байт tcp обозначает это? Нет ли каких-то готовых решений?
Офлайн
Фрагментация происходит на уровне IP. Формат пакета описан например тут http://www.netroutepro.com/index.php/the-news/76–i-
Кроме этого фрагментация также происходит на уровне TCP http://rfc.com.ru/rfc793.htm
Задча довольно нетривиальная - собрать все назад.
Может имеет смысл воспользоваться прокси-сервером (можно и прозрачным) на предмет анализа - если интересует только HTTP трафик.
Про готовые решения не знаю, надо копать.
Отредактировано (Окт. 17, 2010 21:45:37)
Офлайн
Спасибо. Нашел http://aldeid.com/index.php/Pyhttpxtract такую штуку, вроде она работает с gzip'ом, буду разбираться. По результатам отпишусь. Честно говоря, был удивлен отсутствием какой-либо конкретики по данной теме, конкретно по pcapy.
Офлайн
Понимаете ли, я с pcapy немного работал, но тогда меня не интересовали TCP потоки.
Писать работающий пример с pcapy было лень - но я знаю, как работает http и как он кодируется на tcp уровне.
К тому же вы уперлись в довольно простую проблему.
При это не приложили воспроизводимого примера (берем файл такой-то, запускаем его и набираем раз-два-три).
В тех заголовках, что я увидел в начале темы присутствует keepalive - и его тоже нужно корректно отрабатывать.
Часто куда легче взять готовое и его немного поправить, чем писать с нуля. Экономьте свое и наше время - отвечать будут охотней.
Офлайн
Вот почитал я эту тему… И что-то не понял. Задача вроде банальна - создать свою http-проксю, которая будет заниматься модерацией. Фактически прокся это http-сервер и http-клиент в одном флаконе. Так может стоит начать с готовых решений в этой области (urllib2, httplib, какие-нить готовые сервера) а не лезть в детали того, как это все работает и пытаться ручками собирать tcp сессию (можно же начать с ethernet фрэймов - это же еще интереснее :) )… Т е начать с уровня выше. Или еще проще - поискать готовую проксю и попытаться встроить туда свою модерацию.
Офлайн
Спасибо за ответы.
Воспроизводимый пример я прикладывал - два варианта. Это просто пробные запуски, интересовало декодирование gzip.
Андрей СветловСобственно, так я и хотел сделать, однако нигде не нашел. Только элементарнейшие примеры работы с pcapy/impacket.
Часто куда легче взять готовое и его немного поправить, чем писать с нуля.
Офлайн
Выше я советовал тоже самое
zheromoМожно еще взять готовый прокси который позволяет фильтровать контент, типа safesquid например.
Может имеет смысл воспользоваться прокси-сервером (можно и прозрачным) на предмет анализа - если интересует только HTTP трафик.
Офлайн