sniffer_draft.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import socket
  2. import os
  3. import ipaddress
  4. import struct
  5. class IP:
  6. def __init__(self, buff):
  7. header = struct.unpack('<BBHHHBBH4s4s', buff)
  8. self.ver = header[0] >> 4
  9. self.ihl = header[0] & 0xF
  10. self.tos = header[1]
  11. self.len = header[2]
  12. self.id = header[3]
  13. self.offset = header[4]
  14. self.ttl = header[5]
  15. self.protocol_num = header[6]
  16. self.sum = header[7]
  17. self.src = header[8]
  18. self.dst = header[9]
  19. # IP-адруса, понятные человек
  20. self.src_address = ipaddress.ip_address(self.src)
  21. self.dst_address = ipaddress.ip_address(self.dst)
  22. # сопоставляем константы протоколов с их назначением
  23. self.protocol_map = {1: "ICMP", 6: "TCP", 17: "UDP"}
  24. class ICMP:
  25. def __init__(self, buff):
  26. header = struct.unpack('<BBHHH', buff)
  27. self.type = header[0]
  28. self.code = header[1]
  29. self.sum = header[2]
  30. self.id = header[3]
  31. self.seq = header[4]
  32. def sniffer():
  33. HOST = '192.168.31.181'
  34. # создаем сырой сокет и привязываем к общедоступному интерфейсу
  35. if os.name == 'nt':
  36. socket_protocol = socket.IPPROTO_IP
  37. else:
  38. socket_protokol = socket.IPPROTO_ICMP
  39. sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)
  40. sniffer.bind((HOST, 0))
  41. # делаем так, чтобы захватывался IP-заголовок
  42. sniffer.setsockopt(socket.IPPROTO_IP, socket.RCVALL_ON, 1)
  43. if os.name == 'nt':
  44. sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
  45. # читаем один пакет
  46. print(sniffer.recvfrom(65565))
  47. if os.name == 'nt':
  48. sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
  49. def main():
  50. sniffer()
  51. if __name__ == '__main__':
  52. main()