Извлечение номеров портов из кадра Ethe rnet - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть этот код ниже, который я хочу использовать для извлечения некоторых данных через указанный c порт TCP (502).

import struct
import socket

def ethernet_frame(data):
    dest_mac, src_mac,proto = struct.unpack('! 6s 6s H', data[:14])
    return socket.htons(proto), data[14:]

def ipv4_Packet(data):
    version_header_len = data[0]
    version = version_header_len >> 4
    header_len = (version_header_len & 15) * 4
    ttl, proto, src, target = struct.unpack('! 8x B B 2x 4s 4s', data[:20])
    return version, header_len, ttl, proto, ipv4(src), ipv4(target), data[header_len:]

def ipv4(addr):
    return '.'.join(map(str, addr))

conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3))
while True:
        raw_data, addr = conn.recvfrom(65536)
        eth_proto, data = ethernet_frame(raw_data)
        if eth_proto == 8:
            (version, header_length, ttl, proto, src, target, data) = ipv4_Packet(data)
            if proto==6:
                src_port, dest_port, sequence, acknowledgment, flag_urg, flag_ack, flag_psh, flag_rst, flag_syn, flag_fin = struct.unpack('! H H L L H H H H H H', raw_data[:24])
                print('Source Port: {}, Destination Port: {}'.format(src_port,dest_port))

Когда я пытаюсь установить связь со вторым компьютером в моей сети на порту 502, обычно на wireshark, я получаю, что source_port равен 47000, а dest_port равен 502 (и наоборот src_port = 502 и dest_port = 47000 ..), но когда я выполняю этот код для прослушивания в сети и возврата src_port и dest_port, я получаю это вместо:

Порт источника: 19506, Порт назначения: 30101
Порт источника: 19506, Порт назначения: 30101
Порт источника: 2048, Порт назначения: 10002
Порт источника: 2048, Порт назначения: 10002

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...