Простой сниффер на Python с применением сокетов прямого доступа (SOCK_RAW).

Совсем простецкий сниффер на python-е демонстрирующий работу сокетов прямого доступа. :)
Сниффет только TCP пакеты. Чтобы посниффить udp пакеты надо указать socket.IPPROTO_UDP, аналогично и для ICMP: socket.IPPROTO_ICMP
Для запуска сниффера нужны права суперпользователя!


sudo python simple_sniffer.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
Created on 11.06.2010
Copyright (C) 2010 Alexander S. Razzhivin ( site http://httpbots.com )

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
'''

import socket

FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)])

def dump(src, length=8):
N=0; result=''
while src:
s,src = src[:length],src[length:]
hexa = ' '.join(["%02X"%ord(x) for x in s])
s = s.translate(FILTER)
result += "%04X %-*s %s\n" % (N, length*3, hexa, s)
N+=length
return result

def main():
"""
Пример использования сокетов прямого доступа (SOCK_RAW).
Сниффет только TCP пакеты. Чтобы посниффить udp пакеты надо указать socket.IPPROTO_UDP,
аналогично и для ICMP: socket.IPPROTO_ICMP
Для запуска сниффера нужны права суперпользователя!
"""

num_of_packets = 3
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
for i in range(0, num_of_packets):
packet = s.recv(16000)
print "Got a %d byte packet\n" % len(packet)
print dump(packet)

if __name__ == '__main__':
main()
poleg 01.11.11 22:12 #
попробывал запустить под Windows и получил ошибку:

raceback (most recent call last):
File "C:/Python27/sniffer.py", line 51, in
main()
File "C:/Python27/sniffer.py", line 46, in main
packet = s.recv(16000)
error: [Errno 10022]

ranux 12.11.11 08:25 #
Это потому, что задействованы api функции, которые есть только в linux.
Логин Регистрация

Логин

Облако тэгов

count count all django django admin feedparser libxml2dom linux mysql parser payway python pyunit pyvkapi qiwi return sniffer sockets ssh ssh tunnel sublime text tdd tehtv templatetags ubuntu unittest webmoney X11 аргументы биллинг видео видеоурок видео уроки вконтакте возврат диаграмма диаграмма стека заметки инструкция комментарии композиция логические операторы мышка образование обучение операторы параметры функции парсинг переменная переменные питон платежи поток выполнения преобразование типов программирование проекты процессинг разработка разработкаразработка рекурсия сеть скрипт сниффер сокеты стек стоки тестирование тип тип данных типы урок уроки условия функция
free counters