import socket import os import struct from ctypes import *
class IP(Structure): _fields_ = [ ("ihl", c_ubyte, 4), ("version", c_ubyte, 4), ("tos", c_ubyte), ("len", c_ushort), ("id", c_ushort), ("offset", c_ushort), ("ttl", c_ubyte), ("protocol_num", c_ubyte), ("sum", c_ushort), ("src", c_ulong), ("dst", c_ulong) ] def __new__(self,socket_buffer=None): return self.from_buffer_copy(socket_buffer)
def __init__(self, socket_buffer=None): self.protocol_map = {1:"ICMP", 6:"TCP", 17:"UDP"}
self.src_address = socket.inet_ntoa(struct.pack("<L",self.src)) self.dst_address = socket.inet_ntoa(struct.pack("<L",self.dst)) self.this_ttl = self.ttl
try: self.protocol = self.protocol_map[self.protocol_num] except: self.protocol = str(self.protocol_num)
class ICMP(Structure): _fields_ = [ ("type", c_ubyte), ("code", c_ubyte), ("checksum", c_ushort), ("unused", c_ushort), ("next_hop_mtu", c_ushort) ]
def __new__(self,socket_buffer=None): return self.from_buffer_copy(socket_buffer)
def __init__(self, socket_buffer=None): self.icmp_type = self.type self.icmp_code = self.code self.icmp_checksum = self.checksum
def GetHostAddress(): try: sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) sock.connect(('8.8.8.8',80)) address =sock.getsockname()[0] finally: return address address.close()
def SnifferIPAddress(address):
if os.name == "nt": socket_protocol = socket.IPPROTO_IP else: socket_protocol = socket.IPPROTO_ICMP
sniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocol) sniffer.bind((address,0)) sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
if os.name == "nt": sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
try: while True: raw_buffer = sniffer.recvfrom(65565)[0]
ip_header = IP(raw_buffer[0:20])
if ip_header.protocol == "ICMP":
offset = ip_header.ihl * 4 buf = raw_buffer[offset:offset + sizeof(ICMP)]
icmp_header = ICMP(buf) print("原地址: {} --> 发送到: {} --> 解包协议: {} --> 解包代码: {} --> 校验和: {}".format(ip_header.src_address, ip_header.dst_address, icmp_header.icmp_type,icmp_header.icmp_code,icmp_header.icmp_checksum))
except KeyboardInterrupt: if os.name == "nt": sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)
if __name__ == "__main__": address = GetHostAddress() SnifferIPAddress(address)
|