我是一名业余程序员,由于一个大问题,我感到绝望和生气:我的大多数程序都被avast防病毒软件阻止,而有些则不是,我也不知道为什么。
我尝试调查的次数越多,对问题可能的理解就越少。

我请求您的帮助以找到解决方案,以便不再阻止我的程序,或者默认情况下,至少提供一些有力的线索来解释为什么会这样。
网上已经有很多关于这个的话题。但是,它们中的大多数仅给出了肤浅的答案:它们只是说明防病毒如何与签名和检测试探法一起使用,或者声明您只需将有问题的应用程序添加到白名单中,而无需提出任何其他问题。尽管这确实是正确的,但就我的感觉而言,这不是可接受的答案,因为我仍然留下了自己的程序,这些程序在没有任何具体想法开始调查的情况下仍然拒绝工作。

首先,唯一阻止我程序的防病毒软件是avast7.x。没有其他杀毒软件可以运行我的软件。其次,我还没有自欺欺人。它安装在 friend 的机器上。
我有Windows 7,他有Windows XP。我完全确定问题只是严重的:当它被暂时禁用时,或者如果该程序被添加到白名单中,一切都会按预期进行。

三种不同的程序有麻烦:

  • 一个文本编辑器,旨在替换Windows记事本,同时保持简单,高效和可自定义的
  • 一个非常简单的小型业余音频播放器
  • 在线游戏平台的客户端程序,当前有1000多个用户

  • 第一个是开源的,如果需要,我可以提供指向可执行文件和源代码的链接。另外两个是封闭源,但可以免费使用,我只能提供指向当前版本可执行文件的链接。
    这三个程序之间唯一明显的共同点是我作为开发人员,我的Windows 7机器对其进行了编译,编译器家族MinGW/GCC,它们都是Win32 GUI应用程序,没有任何框架(没有MFC,没有WPF,没有QT,WXWidgets或其他;仅是纯win32/C GUI应用程序)

    这是我的观察,尽管到目前为止:
  • 我的文本编辑器的1.1、1.2.1和1.3版本被阻止。它们是C语言而不是C++语言,已经在Unicode模式下使用GCC 3.4.5进行了编译,并以可移植的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(目前是私有(private)Beta版)已被阻止。它是在启用了0x功能的C++中,已在Unicode模式下使用GCC 4.7.2进行了编译。我与我的私有(private)Beta测试团队分享了它,作为私有(private)Dropbox文件夹
  • 中的zip文件

    该问题是由avast 7.x自动沙箱引起的。当尝试启动avast不喜欢的程序时,会发生以下情况:
  • 用户双击或点击可执行文件
  • 上的enter
  • 该程序已启动,但被avast
  • 几乎立即强制崩溃
  • 出现一个弹出窗口,并显示类似以下内容:avast已将该程序放入他的沙箱中,因为他的声誉很低
  • 如果一键单击弹出窗口的继续按钮,程序将重新启动并正常运行
  • 如果不单击继续按钮,则Windows资源管理器将冻结,该可执行文件将保留在任务管理器中,并始终使用76 KB的RAM,而无法将其杀死。最后大约5分钟后,Windows资源管理器解冻,程序重新启动并正常工作

  • 这是无法接受的。我的程序的新手用户,尤其是游戏的新手,不知道防病毒软件是如何工作的;不知道如何将其列入白名单,以及为何将其取消阻止;不知道如何更改其防病毒设置;如果他们看到弹出窗口,将无法理解它,并最终会因为不知道为什么无法玩而害怕或失望。如果他们没有看到弹出窗口,我就不能指望他们等着半冻结的计算机等待5分钟。每次他们想玩。

    从那里,我得出以下推论:
  • 我的机器本身并未感染病毒,也没有病毒注入(inject)我分发的可执行文件中。否则,将阻止所有最近的程序;我有两个(我的播放器和游戏的新版本),而一个没有(我的文本编辑器的最新版本)。该游戏的1.7.2已于2012年3月进行了编译,而文本编辑器的1.4.1已于2012年10月发布。
  • 出于同样的原因,最新版本的GCC 4.7.2并未出现。 ANSI与Uni​​code编译相同。
  • minGW C++运行时(作为自动链接的DLL分发,在使用GCC 4.7.2编译的所有C++应用程序中都是强制性的)可能不是原因,因为许多知名程序都在使用它。并且我的文本编辑器被阻止并且在C语言中,因此不要使用它。
  • 我的音频播放器和游戏具有共同的音频库;这不是后来的原因,因为我的游戏的1.7.2版有效,而最新的私有(private)Beta版无效。当然,该音频库还用于许多其他未被阻止的已知或较不知名的应用程序。
  • 玩家和游戏都使用winsock来访问网络。因此,出于同样的原因,它不是
  • 的原因
  • 如果确实是avast的声誉,为什么我的文本编辑器1.4.1版本(未阻止)仅被下载了70次,而被阻止的1.3版却被下载了300次以上? IT看起来完全不合逻辑。 70名用户是否足以声称有关声誉? 300个用户还会更多吗?我真的不这么认为……可能需要成千上万的用户。

  • 除此之外,尽管我将我的程序作为便携式zip文件分发的事实可能是avast阻止的原因,相反,事实是程​​序已很好地安装在程序文件中可能是信任它的原因更多。
    因此,我做了一个简单的体验:我为游戏的beta 2.0.0编译了一个新的inno-setup 5安装程序,并为我的文本编辑器1.3版编译了一个安装程序,发现安装程序本身被阻止了!

    我和我的 friend 又经历了一次尝试,尝试使用MessageBeep(MessageBox也被阻止!)来找到程序崩溃的确切位置。我没有发现任何问题。在登录对话框中首次调用SetDlgItemText时,游戏被阻止,但是如果我删除所有SetDlgItemText,它会被进一步阻止。在文本编辑器中,填充菜单栏时它被阻止...

    我的结论是,在新版本的游戏,旧版本的文本编辑器以及音频播放器中,avast都不喜欢。我的文本编辑器的最新版本中缺少某些内容。会是什么呢 ?你有什么线索吗?您是否对如何继续查找它只有一个想法,以便我希望修复它?是否只有一种方法可以分析这样的问题,还是洞口被avast搞砸了?

    请注意,我是一个人,而不是一家公司,所有这些程序都可以免费使用,我没有为开发它们而支付任何IDE费用,并且当用户使用它们时,我也没有得到用户的付款,因此我假设证书可能根本负担不起。而且,我不知道这是不是一个真正的解决方案,如何对使用GCC编译的应用程序进行签名,我真的不想切换到MSVC之类的“正当性”。如果有其他解决方案,即使是非常肮脏的解决方案,我也强烈希望忘记该选项。

    感谢您的阅读。

    最佳答案

    增加所有AV软件置信度的一种好方法是对代码进行数字签名。 Thawte拥有公认的最便宜的证书,低于每年100€。

    -两年后@Herr_Doktor发表评论后更新-

    我最近遇到了无法选择代码签名的新情况-我在php中为Joomla编写了开源代码。在收到第一个迹象表明Avast将我的文件标记为(错误)肯定结果后,我与他们联系,他们在几个小时内将我的文件列入了白名单。

    为了使我的生活更轻松,我正在创建一个具有所谓“危险”功能的单独文件,以便将来对该程序进行更改时无需将其重新提交以列入白名单。

    读取简短的php文件比进行逆向工程编译的代码要快,这有助于提高响应速度。尽管如此,它们还是友善,快捷且有效的。

    10-08 02:59