我是一名业余程序员,因为一个大问题而感到绝望和疯狂:我的大多数程序都被Avast Antivirus阻止,而有些则没有,我不明白为什么。我尝试调查的越多,我就越不了解问题可能是什么。
我请求您帮助找到解决方案,以便我的程序不再被阻止,或者作为默认设置,至少有一些强有力的线索可以解释为什么会出现这种情况。
网上已经有很多关于这个的话题。然而,他们中的大多数只给出了肤浅的答案:他们只是解释了防病毒软件如何与签名和检测启发式一起工作,或者说您只需将有问题的应用程序添加到白名单中,而无需询问任何其他问题。虽然这肯定是正确的,但在我看来,这不是可接受的答案,因为我仍然有自己的程序拒绝工作,没有任何具体的想法开始调查。
首先,唯一阻止我的程序的防病毒软件是 Avast 7.x。没有其他防病毒软件看到运行我的软件有任何不便。其次,我自己还没有安装 Avast;它安装在朋友的机器上。
我有Windows 7,他有Windows XP。我完全确定问题只是avast:当它被暂时禁用时,或者如果程序被添加到它的白名单中,一切都按预期运行。
三个不同的程序遇到了麻烦:
- 一个文本编辑器,旨在取代 Windows记事本,同时保持简单、高效和可定制
- 一个非常简单易用的小型业余音频播放器
- 某网络游戏平台的客户端程序,目前拥有1000多个用户
第一个是开源的,如果需要,我可以提供可执行文件和源代码的链接。另外两个是封闭源代码但可以免费使用,我只能给出当前版本的可执行文件的链接。
这三个程序之间唯一明显的共同点是作为开发人员的我,编译它们的 Windows 7 机器,MinGW/GCC 编译器系列,它们都是没有任何框架的Win32 GUI 应用程序(没有MFC,没有WPF,没有Qt、wxWidgets或其他;只是纯 Win32/C GUI 应用程序)。
以下是我目前的观察和想法:
- 我的文本编辑器的 1.1、1.2.1 和 1.3 版本被阻止。它们是 C 语言,而不是 C++ 语言,已使用 GCC 3.4.5 以 Unicode 模式编译,并以可移植 ZIP 文件的形式分发(通过可移植,我的意思是无需安装程序,也无需安装)
- 同一文本编辑器的 1.4.1 版本未被阻止。它已经用 GCC 4.7.2 编译,仍然是 C 而不是 C++,仍然是 Unicode 模式,并且仍然是一个可移植的 zip 文件
- 我的音频播放器的所有版本都被阻止;它们是启用了 0x 功能的 C++ 语言,已由 GCC 4.7.2 以 ANSI 模式编译,以可移植 zip 文件的形式分发
- 我的游戏的当前版本 1.7.2 未被阻止。它是 C 语言,在 ANSI 模式下使用 GCC 3.4.5 编译,并作为Inno Setup 5 安装程序分发。
- 我的游戏新版本2.0.0,目前是私测版,被封了。它是启用了 0x 功能的 C++ 语言,已在 Unicode 模式下使用 GCC 4.7.2 进行编译。我与我的私人 beta 测试团队共享它作为私人Dropbox文件夹中的 zip 文件
该问题是由 Avast 7.x 自动沙盒引起的。当尝试启动 avast 不喜欢的程序时会发生以下情况:
- 用户在可执行文件上双击或回车
- 程序启动,却几乎瞬间被Avast强行崩溃
- 出现一个弹出窗口并显示如下内容:Avast 已将此程序放入其沙箱,因为它的声誉很低
- 如果单击弹出窗口的继续按钮,则程序的执行将重新启动并正常工作
- 如果不点击继续按钮,Windows 资源管理器会冻结,可执行文件保留在任务管理器中,并且总是使用 76 KB 的 RAM,而无法杀死;终于在大约 5 分钟后,Windows 资源管理器解冻,程序重新启动并正常运行
这是无法接受的。我的程序,尤其是游戏的新手用户,不知道杀毒软件是如何工作的;不知道怎么加入白名单,为什么会解封;不知道如何更改他们的杀毒软件的设置;如果他们看到弹出窗口,将无法理解,最终会感到害怕或失望,因为他们无法在不知道为什么的情况下玩;如果他们没有看到弹出窗口,我不能指望他们在半冻结的计算机上等待 5 分钟。每次他们想玩。
从那里,我做了以下推论:
- 我的机器本身没有被感染,我分发的可执行文件中也没有注入病毒;否则,所有最近的程序都将被阻止;我有两个是(我的播放器和我的游戏的新版本),而一个不是(我的文本编辑器的最新版本)。游戏的1.7.2是2012年3月编译的,文本编辑器的1.4.1是2012年10月的。
- 出于同样的原因,最新版本的 GCC 4.7.2 不是原因;ANSI 与 Unicode 编译相同。
- MinGW C++ 运行时,作为自动链接的 DLL 分发,在使用 GCC 4.7.2 编译的所有 C++ 应用程序中都是必需的,这可能不是原因,因为许多知名程序都使用它;并且我的文本编辑器被阻止并且在 C 中,因此不要使用它。
- 我的音频播放器和我的游戏有共同的音频库;这不是后来的原因,因为我的游戏版本 1.7.2 可以正常工作,而最新的私人测试版不行。当然,该音频库还用于许多其他已知或鲜为人知的未被阻止的应用程序。
- 玩家和游戏都使用Winsock访问网络;所以同样的道理,这也不是原因
- 如果真的是Avast的名气,为什么我的文本编辑器1.4.1版本没有被屏蔽,只下载了70次左右,而被屏蔽的1.3版本却下载了300多次?看起来完全不合逻辑。70 个用户是否足以声称有关声誉的东西?300 个用户会更多吗?我真的不这么认为......可能需要数十万用户的临界质量。
除此之外,我还认为我将程序作为可移植 ZIP 文件分发的事实可能是 Avast 阻止的原因,相反,程序已很好地安装在程序文件中的事实可能是信任它的原因更多的。
于是我做了一个简单的体验:我为我的游戏的 beta 2.0.0 和我的文本编辑器的 1.3 版本编译了一个新的 Inno Setup 5 安装程序,发现安装程序本身被阻止了!
我和我的朋友做了另一个经验,在那里我试图找到程序崩溃的确切位置,基于使用 MessageBeep(MessageBox 也被阻止!)。我没有注意到任何问题。当在登录对话框中第一次调用 SetDlgItemText 时,游戏被阻止,但如果我删除所有 SetDlgItemText,它会被进一步阻止。在文本编辑器中,它在填充菜单栏时被阻止...
我的结论是,Avast 不喜欢我的新游戏版本、旧版本的文本编辑器和音频播放器中的某些内容。我的文本编辑器的最新版本中没有的东西。会是什么呢?你有什么线索吗?您是否只有一个想法,我如何才能继续找到它,以便我希望修复它?是否只有一种方法可以分析这样的问题,还是整个世界都被 Avast 搞砸了?
请注意,我是一个人而不是公司,所有这些程序都是免费使用的,我没有支付任何 IDE 来开发它们,并且用户使用它们时也没有向我付费,所以我假设一个证书可能根本买不起。此外,我不知道这是否是一个真正的解决方案,如何签署使用 GCC 编译的应用程序,我真的不想切换到像Microsoft Visual C++ (MSVC) 这样的“usine à gaz”。如果有任何其他解决方案,即使是非常肮脏的解决方案,我宁愿强烈忘记该选项。