Я пытаюсь отправить необработанный пакет сокета, записывая свой собственный IP-заголовок и TCP-заголовок, wireshark может перехватить пакеты, если для ip_protocol в IP-заголовке задано любое число, кроме 6 (что является TCP)
Я работаю на Windows 10 и Python 3.6.8.
Мой IP-адрес источника и IP-адрес назначения - все localhost.
Я также попытался закрыть брандмауэр, и это не помогло.
Любой пакет с протоколом IP не 6 может быть перехвачен нормально.
Wireshark не может перехватить пакет, только когда я установил ip_protocol = 6.
def carry_around_add(a, b):
c = a + b
return (c & 0xffff) + (c >> 16)
def CalculateChecksum(msg):
s = 0
for i in range(0, len(msg), 2):
temp = msg[i] << 8 + msg[i+1]
s = carry_around_add(s, temp)
return ~s & 0xffff
def GenerateIPHeader(ip_source, ip_dest):
ip_ver = 4 # ipv4
ip_ihl = 5 # Header Length = 5, no option
ip_dscp = 0 # dscp (type of service)
ip_total_len = 0 # left for kernel to fill
ip_id = 0 # fragment
ip_frag_offset = 0 # fragment
ip_ttl = 255 # Time to live
ip_protocol = 6 # TCP = 6
ip_checksum = 0 # left for kernel to fill
ip_saddr = socket.inet_aton(ip_source)
ip_daddr = socket.inet_aton(ip_dest)
ip_ver_ihl = (ip_ver << 4) + ip_ihl
ip_header = struct.pack('!BBHHHBBH4s4s' , ip_ver_ihl, ip_dscp, ip_total_len, ip_id, ip_frag_offset, ip_ttl, ip_protocol, ip_checksum, ip_saddr, ip_daddr)
return ip_header
def GenerateTCPHeader(SrcPort, DestPort, Checksum = 0, Flags = (0, 0, 0, 0, 1, 0)):
tcp_sport = SrcPort
tcp_dport = DestPort
global SequenceNumber
tcp_seq = SequenceNumber
tcp_ack_seq = 0
tcp_data_offset = 5 # No option
# Flags
tcp_flag_urg = Flags[0]
tcp_flag_ack = Flags[1]
tcp_flag_psh = Flags[2]
tcp_flag_rst = Flags[3]
tcp_flag_syn = Flags[4]
tcp_flag_fin = Flags[5]
tcp_window_size = 3000
tcp_checksum = Checksum
tcp_urgent_ptr = 0
tcp_offset_reserv = (tcp_data_offset << 4)
tcp_flags = tcp_flag_fin + (tcp_flag_syn << 1) + (tcp_flag_rst << 2) + (tcp_flag_psh <<3) + (tcp_flag_ack << 4) + (tcp_flag_urg << 5)
# print(tcp_sport, tcp_dport, tcp_seq, tcp_ack_seq, tcp_offset_reserv, tcp_flags, tcp_window_size, tcp_checksum, tcp_urgent_ptr)
tcp_header = struct.pack('!HHLLBBHHH' , tcp_sport, tcp_dport, tcp_seq, tcp_ack_seq, tcp_offset_reserv, tcp_flags, tcp_window_size, tcp_checksum, tcp_urgent_ptr)
return tcp_header
def GeneratePacket(SrcAddr, SrcPort, DestAddr, DestPort, payload = ''):
if len(payload) % 2 == 1:
payload += " "
IPHeader = GenerateIPHeader(SrcAddr, DestAddr)
TCPHeader = GenerateTCPHeader(SrcPort, DestPort)
PseudoIPHEader = GeneratePseudoIPHeader(SrcAddr, DestAddr, TCPHeader, payload)
Checksum = b"".join([PseudoIPHEader, TCPHeader, payload.encode()])
TCPChecksum = CalculateChecksum(Checksum)
TCPHeader = GenerateTCPHeader(SrcPort, DestPort, TCPChecksum)
TCPPacket = b"".join([TCPHeader, payload.encode()])
packet = b"".join([IPHeader, TCPPacket])
return packet
def GeneratePseudoIPHeader(ip_source, ip_dest, tcp_header, payload_data):
psh_saddr = socket.inet_pton(socket.AF_INET, ip_source)
psh_daddr = socket.inet_pton(socket.AF_INET, ip_dest)
psh_reserved = 0
psh_protocol = socket.IPPROTO_TCP
psh_tcp_len = len(tcp_header) + len(payload_data)
psh = struct.pack('!4s4sBBH', psh_saddr, psh_daddr, psh_reserved, psh_protocol, psh_tcp_len)
return psh
def StartClient(SrcAddr, SrcPort, DestAddr, DestPort):
try:
Client = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
except socket.error as msg:
print('Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()
Client.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) #Set it to include the header
Client.bind((SrcAddr, SrcPort))
Packet = GeneratePacket(SrcAddr, SrcPort, DestAddr, DestPort, 'Hello!')
print(Packet)
Client.sendto(Packet, (DestAddr, DestPort))