我是一名业余程序员,因为一个大问题,我感到绝望和愤怒:我的大多数程序都被Avast Antivirus阻止了,而有些程序没有,我不明白为什么。
我越是努力调查,就越不了解问题所在
我请求你帮我找到一个解决方案,这样我的程序就不会再被阻止,或者,默认情况下,至少有一些强有力的线索可以解释为什么会出现这种情况
网上已经有很多关于这个的话题了。然而,他们中的大多数只给出了肤浅的答案:他们只是解释了杀毒软件如何与签名和检测启发式一起工作,或者说你只需要将有问题的应用程序添加到白名单中,而不需要问任何其他问题。虽然这肯定是正确的,但在我看来,这是不可接受的答案,因为我仍然有自己的程序,在没有任何具体想法开始调查的情况下拒绝工作
首先,唯一阻止我的程序的防病毒软件是Avast 7.x。没有其他防病毒软件认为运行我的软件有任何不便。其次,我自己还没有安装Avast;它安装在朋友的机器上
我有Windows7,他有WindowsXP。我完全确定问题只存在于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文件 。
- 我的音频播放器的所有版本都被阻止;它们是在C++中启用的0x特性,已经由GCC 4.7.2在ANSI模式下编译,分布在便携zip文件 中
- 我的游戏的当前版本1.7.2没有被阻止。它是C语言,在ANSI模式下使用GCC 3.4.5进行编译,并作为Inno Setup 5安装程序分发
- 我的游戏2.0.0的新版本,目前是一个私人测试版,被阻止了。它是在C++中启用的0x特性,已经在GUCC模式下用GCC 4.7.2编译。我将它作为zip文件在一个私人Dropbox文件夹中与我的私人beta测试团队共享
这个问题是由Avast 7.x自动沙盒造成的。当您尝试启动avast不喜欢的程序时,会发生以下情况:
- 用户双击或点击可执行文件上的enter键
- 程序启动了,但几乎是在瞬间被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编译的情况相同
- 在GCC 4.7.2编译的所有C++应用程序中,强制分配的作为一个自动链接的DLL的MunW C++运行时可能不是原因,因为许多著名程序使用它;我的文本编辑器被阻止了,并且是C语言的,因此不要使用它
- 我的音频播放器和我的游戏有共同的音频库;这不是后来的原因,因为我的游戏1.7.2版有效,而最新的私人测试版无效。当然,该音频库也用于许多其他已知或不太已知的未被阻止的应用程序中
- 玩家和游戏都使用Winsock访问网络;同样的道理,这也不是原因
- 如果这真的是Avast的声誉问题,为什么我的文本编辑器1.4.1版(未被阻止)只下载了70次左右,而被阻止的1.3版下载了300多次?这看起来完全不合逻辑。70个用户是否足以宣称自己的声誉?有300个用户的情况是否更多?我真的不这么认为。。。可能需要几万用户的临界质量
除此之外,我还认为我将程序作为可移植的ZIP文件分发可能是Avast阻止的原因,相反,程序在程序文件中安装良好可能是更信任它的原因
因此,我做了一个简单的体验:我为我的游戏beta 2.0.0编译了一个新的Inno Setup 5安装程序,也为我的文本编辑器1.3版编译了一个安装程序,发现安装程序本身被阻止了
我和我的朋友做了另一次体验,在那里,我试图通过使用MessageBeep(MessageBox也被阻止!)找到程序崩溃的确切位置。我没有发现任何问题。当在登录对话框中第一次调用SetDlgItemText时,游戏被阻止,但如果我删除所有SetDlgItemText,它将被进一步阻止。在文本编辑器中,它在填充菜单栏时被阻止
我的结论是,在我的游戏的新版本中,在我的文本编辑器的旧版本中,在我的音频播放器中,有一些东西是Avast不喜欢的。我的文本编辑器的最新版本中缺少的东西。可能是什么?你有什么线索吗?你对我如何继续找到它,以便我能希望修复它只有一个想法吗?难道只有一种方法可以分析这样一个问题,还是整个世界都被阿瓦斯特搞砸了
请注意,我是一个人,不是一家公司,所有这些程序都是免费使用的,我没有支付任何IDE来开发它们,用户使用它们时也没有支付我的费用,因此我认为证书可能根本负担不起。此外,我不知道这是否是一个真正的解决方案,也不知道如何对使用GCC编译的应用程序进行签名,我真的不想切换到;“乌西娜·加兹”;比如微软Visual C++(MSVC)。如果有任何其他解决方案,即使是非常肮脏的解决方案,我宁愿强烈地忘记这个选项
增加所有防病毒软件可信度的一个好方法是对代码进行数字签名。Thawte拥有最便宜的公认证书,起价低于100欧元/年
当代码签名不是一个选项时,另一种方法是:我用PHP为Joomla编写开放源码。在我收到Avast将我的文件标记为(假)阳性的第一个指示后,我联系了他们,他们在几个小时内将我的文件列入了白名单
为了让我的生活更轻松,我创建了一个单独的文件;“危险的”;函数,这样以后对程序所做的更改就不需要重新提交白名单
他们的响应速度可能得益于这样一个事实:读取一个简短的PHP文件比反向工程编译的代码要快;尽管如此,它们还是善良、迅速和有效的