PyInstaller 是一种将 Python 脚本转换为独立可执行文件的流行工具,已成为寻求分发其应用程序的开发人员的首选。然而,用户越来越担心他们的 PyInstaller.EXE 文件被部分防病毒软件检测并标记为病毒。
为什么被检测为病毒?
在深入研究解决方案之前,了解为什么 PyInstaller 生成的 EXE 文件可能会触发防病毒警报至关重要。它与你的实际代码关系不大,因为即使是最简单的程序最终也会被标记。实际上,还有许多其他外部因素在起作用。
- 由于 Python 的普及和广泛使用,黑客或网络犯罪分子使用 Python + PyInstaller 分发恶意软件、特洛伊木马和勒索软件的情况并不少见。这是第一个问题,因为防病毒软件会看到您生成的 EXE 与犯罪分子生成的恶意软件之间的相似之处。
- 每当您从某个位置下载可执行文件时,您都可能看到一个弹出窗口,询问您是否确定要运行该文件。您可能还会在弹出窗口中看到一些出版商信息,如果存在未知出版商,则会显示一条警告消息。当您作为个人发布 EXE 时(无论您使用什么技术来制作 EXE),您在防病毒软件眼中实际上是一个陌生人。你没有身份,也没有真实性。
使用 VirusTotal 进行测试:
确定 PyInstaller 生成的 EXE 是否被流行的防病毒软件检测为病毒的一种有效方法是使用 virustotal 网站。Virustotal 允许您上传文件并使用多个防病毒引擎对其进行扫描,并让您知道哪些引擎将您的 EXE 标记为病毒/恶意软件,以及它们发出了什么警告。
该网站也是一个很好的参考点。在开始应用本文中的任何技术之前,请通过将 EXE 上传到站点来检查您的 EXE。记下有多少防病毒软件检测到您的 EXE 有害。
解决方案:Pyinstaller EXE 检测为病毒
有关如何避免应用程序被防病毒软件标记的解决方案列表。如果您有任何建议,请在评论部分告诉我们,我们会将它们添加到此列表中。
1. 避免 onefile 模式:
说明:
使用 PyInstaller 的 onefile 模式将 Python 解释器、脚本和所有依赖项编译成一个压缩的可执行文件。由于可执行文件的压缩性质,这种压缩可能会在防病毒扫描中触发误报。
步骤:
- 打开终端或命令提示符。
- 导航到您的项目目录。
- 不要在 PyInstaller 命令中使用,而是通过排除该选项来选择捆绑的目录结构。您还可以使用该选项手动指定目录模式。
--onefile
--onefile
--onedir
2. 自己构建 PyInstaller 引导加载程序:
说明:
从源代码构建 PyInstaller 引导加载程序允许您创建自定义版本,从而降低触发防病毒警报的可能性。默认情况下,PyInstaller 带有针对不同操作系统的预编译 bootloader 二进制文件。通过在您自己的系统上编译引导加载程序,您可以使过程更加一致(和唯一),从而可能避免类似于恶意软件的模式。
步骤:
- 从项目中删除任何现有的 PyInstaller 相关文件,例如
build
、dist
和__pycache__
文件夹。 - 使用以下命令卸载 PyInstaller: 。
pip uninstall pyinstaller
- 下载并安装 C/C++ 编译器(如果您还没有编译器)。对于 Windows 用户,最简单的方法(只需很少的手动工作)是下载 Visual Studio C/C++ 编译器。
- 从 GitHub 克隆 PyInstaller 存储库,或将其下载为 Zip 文件。提取文件夹的内容,并将其放在要安装 PyInstaller 的目录中。
- 导航到 PyInstaller 文件夹中的 bootloader 子目录。
- 要编译 bootloader,请运行以下命令:
1. python ./waf all
(如不起作用,参阅 PyInstaller 的此文档页面,其中解释了如何编译 bootloader)。
- 现在
cd
进入您为安装 PyInstaller 创建(或选择)的文件夹,并运行以下命令:python.exe setup.py install
- 现在,使用新的 PyInstaller 库重新构建 EXE。
- 将新创建的 EXE 上传到 virustotal 网站,检查是否有任何改进。
3. 代码签名证书:
解释:
获取代码签名证书是建立应用程序合法性的主动措施。代码签名涉及使用受信任的证书颁发机构 (CA) 颁发的证书对可执行文件进行数字签名。这增强了应用程序的可信度,并降低了触发防病毒检测的可能性。
步骤:
- 从受信任的证书颁发机构获取代码签名证书。以下是 Microsoft 推荐的证书提供程序列表。
- 使用开发环境中的工具或集成的签名选项对 PyInstaller 生成的可执行文件进行签名。
signtool
4. 使用 Nuitka 作为替代品
说明:
Nuitka 是 PyInstaller 的替代方案,它采用不同的方法,在编译之前将 Python 脚本转换为优化的 C 代码。此过程会导致可执行文件触发防病毒警报的可能性较低,这使其成为面临 PyInstaller 持续问题的开发人员的可行替代方案。Nuitka 具有许多与 PyInstaller 相同的功能,例如 onefile 模式。最重要的是,Nuitka 还比 PyInstaller 更快、更安全。唯一的缺点是编译需要额外的时间,因为它涉及多个阶段(转换为 C,然后编译)。
步骤:
- 使用适用于您的操作系统的推荐方法安装 Nuitka。这可以使用命令
pip install nuitka
来完成。 - 使用以下命令使用 Nuitka 编译器编译 Python 脚本:
python -m nuitka --standalone yourfile.py
- 将生成的可执行文件分发给用户。
5. 使用 Inno Setup 或类似工具:
说明:
使用 Inno Setup 等工具打包应用程序提供了一种解决方法,通过创建更传统的安装程序来进行防病毒检测。此方法避免了对 PyInstaller 可执行文件的直接依赖,并且可以降低误报的可能性。如果您的应用程序在开始运行之前就被标记了,那么此解决方案很可能会有所帮助(因为 Inno Setup 创建的 EXE 更值得信赖)。
步骤:
- 下载并安装 Inno Setup 或类似的打包工具。
- 按照 Inno Setup 将提示您的脚本向导为您的应用程序创建配置脚本。这很容易遵循。
- 将 PyInstaller 生成的可执行文件和依赖项包含在安装程序包中(脚本向导过程的一部分)。
- 编译脚本以为您的应用程序生成可分发的安装程序。
6. 向防病毒组织提交报告
说明:
许多防病毒软件都带有报告功能,允许您报告误报。然后,他们将审核您的应用程序,并根据报告更新其病毒定义。如果有特定的防病毒软件给您带来麻烦,这将是一个不错的选择。
步骤:
- 使用 virustotal 网站确定哪些防病毒软件正在标记您的应用程序。
- 使用报告功能(如果可用)让您的应用程序获得批准。