目前我会玩一点 scapy、Qt 和 python。到目前为止,使用 VSC 启动程序时一切正常。 现在我尝试使用 PyInstaller 制作 .exe。它也有效,我得到了一个 .exe 文件,可以打开它并显示我的 Qt-Windows。但是当我使用 scapy 函数时,程序崩溃,没有任何消息,并且窗口关闭。 我激活了日志记录并发现,每当我们到达以下代码行时,程序都会崩溃:
ans, unans = sr(query, timeout=5)
使用此行应该发送存储在查询变量中的 DNS 数据包。这一步仅在 exe 中失败。
这些是我的 scapy-imports:
from scapy.layers.inet import IP, UDP
from scapy.layers.dns import DNS, DNSRR, DNSQR, DNSRROPT
from scapy.sendrecv import sr
from scapy.all import get_if_addr, conf
这是我用于构建 .exe 的命令行:
-m PyInstaller --onefile -w --exclude=PySide6 --hidden-import=scapy.layers.dns --hidden-import=scapy.layers.inet --hidden-import=scapy.sendrecv --hidden-import=scapy.all
--hidden-import=PyQt6 .\main.py
任何人有任何想法吗? 我很迷失,这是我尝试构建 exe 的第一个应用程序..
非常感谢! 丹尼斯
将 Scapy 与 PyInstaller 一起使用打包成 .exe 文件可能会很棘手,因为 Scapy 依赖于在运行时加载的低级网络功能。
sr()
函数(用于发送和接收数据包)尤其容易出现此类问题。以下是一些可能解决方案的故障排除步骤:
-
使用
--onefile
时要小心: 尽管--onefile
创建了一个整洁的单一可执行文件,但它有时会使调试依赖关系变得更加困难。首先使用--onedir
选项构建一个目录包。如果这样可行,可以稍后再进行--onefile
的故障排除。 -
明确导入
winpcap
: Scapy 在 Windows 上使用winpcap
库进行数据包捕获。PyInstaller 可能无法自动检测到此依赖项。尝试明确导入:
python
import scapy.all # 你的其他 scapy 导入
import scapy.arch.windows # 显式导入 winpcap 相关模块
-
以管理员身份运行: Scapy 中的原始套接字操作和数据包注入通常需要管理员权限。尝试以管理员身份运行你的 .exe 文件,看看是否能解决问题。
-
检查 PyInstaller 版本和挂起的更新: 旧版本的 PyInstaller 过去在处理 Scapy 时存在已知问题。确保你使用的是最新版本的 PyInstaller 和 Scapy。
-
详细的 PyInstaller 日志记录: 为 PyInstaller 启用更详细的日志记录,以帮助查明问题。使用
--log-level=DEBUG
选项运行 PyInstaller。日志文件(build 文件夹中)可能包含有关崩溃原因的线索。 -
使用
tcpdump
或 Wireshark 进行测试: 要隔离问题是否与数据包发送本身有关,请尝试使用tcpdump
或 Wireshark 等外部工具在发送数据包时监控你的网络接口。这可以帮助你确定你的应用程序是否真的在发送数据包。 -
简化并逐步测试: 从最小的 Scapy 示例开始,逐步向你的应用程序添加更多功能。这可以帮助你查明哪个特定部分导致了问题。
如果在尝试了这些步骤后问题仍然存在,请提供以下附加信息,以便我进一步帮助你:
- 你正在使用的 Python、Scapy 和 PyInstaller 的确切版本。
- 完整的 PyInstaller 构建日志。
-
你的
sr()
函数调用的更完整的代码片段,包括query
变量的定义。
祝你好运,不要犹豫,如有任何其他问题,请告诉我!
标签:python,pyinstaller,scapy From: 78797985