Я использую raw socket и Scapy для создания анализатора basi c, когда я запускаю скрипт из PyCharm (слева от изображения), он, кажется, работает правильно, но если я запускаю его из exe ( созданный с помощью Pyinstaller, справа от изображения) кажется, что он захватывает только исходящие пакеты с протоколом TCP.
У UDP, ICMP и IGMP такой проблемы нет.
Мой локальный IPv4 - это 192.168.1.7
Я использую следующий код для получения информации о пакете:
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__)
Я указываю, что получаю это предупреждение только тогда, когда программа только открыта, а не во время ее выполнения социологическое загрязнение.