Проблемы с протоколом TCP в Python (3.8.0) после генерации exe-файла с помощью Pyinstaller - PullRequest
0 голосов
/ 30 апреля 2020

Я использую raw socket и Scapy для создания анализатора basi c, когда я запускаю скрипт из PyCharm (слева от изображения), он, кажется, работает правильно, но если я запускаю его из exe ( созданный с помощью Pyinstaller, справа от изображения) кажется, что он захватывает только исходящие пакеты с протоколом TCP.

У UDP, ICMP и IGMP такой проблемы нет.

Мой локальный IPv4 - это 192.168.1.7

PyCharm - Pyinstaller exe

Я использую следующий код для получения информации о пакете:

def sniff():
    global s, tcp, udp, icmp, all_proto, table, IPN

    to_show = {'TCP':tcp.get(), 'UDP':udp.get(), 'ICMP':icmp.get()}
    show_all = all_proto.get()

    if not show_all and not 1 in to_show.values():
        showerror('MyProgram', 'No protocol(s) selected!')
        return

    # the public network interface
    HOST = socket.gethostbyname(socket.gethostname())

    # create a raw socket and bind it to the public interface
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
    s.bind((HOST, 0))

    # Include IP headers
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

    # receive all packages
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

    while True:
        # receive a package
        try:
            data = s.recvfrom(65565)
        except:
            break

        t = time.ctime().split()[3]
        packet = IP(data[0])

        try:
            proto = IPN[str(packet.proto)]
        except:
            proto = '-'
        try:
            src = packet.src
        except:
            src = '-'
        try:
            dst = packet.dst
        except:
            dst = '-'
        try:
            sport = packet.sport
        except:
            sport = '-'
        try:
            dport = packet.dport
        except:
            dport = '-'
        try:
            data = packet.load
        except:
            data = data[0][20:] # maybe is there the issue? I'm not sure about this line


        if show_all:
            table.insert("", END, tags=proto, values=(t, proto, src, dst, sport, dport, data))
        else:
            try:
                if to_show[proto]:
                    table.insert("", END, tags=proto, values=(t, proto, src, dst, sport, dport, data))
            except:
                pass

        table.yview_moveto(1) # set view to last row


IP () is функция scapy.all.

* * * * * * * * * * * * * * * * * T 10 10 *

В Pyinstaller:

pyinstaller --onefile --windowed --icon=icon.ico --uac-admin script.py

Итак, почему программа работает по-другому после создания exe с Pyinstaller?

РЕДАКТИРОВАТЬ:

Я удалил параметр --windowed из Pyinstaller, чтобы проверить наличие исключений в соответствии с предложением @ jizhihaoSAMA.

Результат:

MatplotlibDeprecationWarning: The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and will be removed in 3.3. exec(bytecode, module.__dict__)

Я указываю, что получаю это предупреждение только тогда, когда программа только открыта, а не во время ее выполнения социологическое загрязнение.

...