41

我是一名业余程序员,因为一个大问题而感到绝望和疯狂:我的大多数程序都被Avast Antivirus阻止,而有些则没有,我不明白为什么。我尝试调查的越多,我就越不了解问题可能是什么。

我请求您帮助找到解决方案,以便我的程序不再被阻止,或者作为默认设置,至少有一些强有力的线索可以解释为什么会出现这种情况。

网上已经有很多关于这个的话题。然而,他们中的大多数只给出了肤浅的答案:他们只是解释了防病毒软件如何与签名和检测启发式一起工作,或者说您只需将有问题的应用程序添加到白名单中,而无需询问任何其他问题。虽然这肯定是正确的,但在我看来,这不是可接受的答案,因为我仍然有自己的程序拒绝工作,没有任何具体的想法开始调查。

首先,唯一阻止我的程序的防病毒软件是 Avast 7.x。没有其他防病毒软件看到运行我的软件有任何不便。其次,我自己还没有安装 Avast;它安装在朋友的机器上。

我有Windows 7,他有Windows XP。我完全确定问题只是avast:当它被暂时禁用时,或者如果程序被添加到它的白名单中,一切都按预期运行。

三个不同的程序遇到了麻烦:

  • 一个文本编辑器,旨在取代 Windows记事本,同时保持简单、高效和可定制
  • 一个非常简单易用的小型业余音频播放器
  • 某网络游戏平台的客户端程序,目前拥有1000多个用户

第一个是开源的,如果需要,我可以提供可执行文件和源代码的链接。另外两个是封闭源代码但可以免费使用,我只能给出当前版本的可执行文件的链接。

这三个程序之间唯一明显的共同点是作为开发人员的我,编译它们的 Windows 7 机器,MinGW/GCC 编译器系列,它们都是没有任何框架的Win32 GUI 应用程序(没有MFC,没有WPF,没有QtwxWidgets或其他;只是纯 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 不喜欢的程序时会发生以下情况:

  1. 用户在可执行文件上双击或回车
  2. 程序启动,却几乎瞬间被Avast强行崩溃
  3. 出现一个弹出窗口并显示如下内容:Avast 已将此程序放入其沙箱,因为它的声誉很低
  4. 如果单击弹出窗口的继续按钮,则程序的执行将重新启动并正常工作
  5. 如果不点击继续按钮,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”。如果有任何其他解决方案,即使是非常肮脏的解决方案,我宁愿强烈忘记该选项。

4

10 回答 10

14

增加所有防病毒软件信心的一个好方法是对您的代码进行数字签名。Thawte 拥有最便宜的公认证书,起价低于 100 欧元/年。

不能选择代码签名的另一种方法是:我用 PHP 为 Joomla 编写开源代码。在我收到 Avast 将我的文件标记为(假)阳性的第一个迹象后,我联系了他们,他们在几小时内将我的文件列入了白名单。

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

阅读简短的 PHP 文件比逆向工程编译的代码更快,这可能有助于提高他们的响应速度;尽管如此,他们还是善良、快速和有效的。

于 2013-01-17T09:10:58.113 回答
5

防病毒程序通过分析文件中已知的“不良行为”模式来工作。

如果您的程序正在取消引用指针,将 200 字节写入 100 字节缓冲区或类似内容,那么您很可能会生成类似于已知攻击签名的代码(因为大多数攻击都利用这些类型的编程错误)。

您应该调试您的代码(如果在 Linux 上,请尝试ValgrindElectric Fence)并确保正确处理内存。

于 2013-01-17T09:03:07.397 回答
4

您可以对文章The Case of Evil WinMain感兴趣。

它说明了防病毒软件在处理链接一个简单的 C 运行时库的小程序时如何真正发疯。

您唯一能做的就是向防病毒制造商发出问题信号,并希望他们采取公平的行为。

于 2013-01-17T09:12:12.883 回答
0

好吧,我想通了。转到您的 Avast Antivirus 设置,您可以在其中添加例外的区域,设置防病毒。然后向下滚动该菜单,出现一个名为Exclusions的区域,您可以在其中浏览到 Visual Studio 路径,即C:johnDocumentsVisualStudio2010projects

选择您的项目路径,它会将其添加到扫描异常列表中,您应该能够测试运行您的文件......它对我来说效果很好。由于另一位成员的建议,我还在同一菜单中禁用了深度扫描。

于 2013-11-24T20:41:11.513 回答
0

Avast 具有称为网络捕获/深度扫描的功能。

这就是造成你麻烦的原因。

它甚至不打扰启发式方法。

如果没有任何Authenticode签名,它认为它可疑,并将其发送到 Avast Antivirus 以供他们扫描,直到他们声明没问题,您将无法运行它。一旦他们宣布它没问题,那么如果它与他们的版本匹配,那么所有其他使用 Avast Antivirus 的人都可以安全地运行它。

于 2018-06-19T03:32:29.997 回答
0

以下是使用 PowerShell 将应用程序排除在Windows Defender和 Microsoft 实时保护之外的方法:

// Create Windows Defender exclusion
string cmd = "powershell -Command \"Add-MpPreference -ExclusionPath '" + GetAppPath() + "'";
Process.Start(new ProcessStartInfo() { FileName = "cmd.exe", Arguments = "/c " + cmd, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }).WaitForExit();

// Create controlled folder exclusion
cmd = "powershell -Command \"Add-MpPreference -ControlledFolderAccessAllowedApplications '" + GetAppPath() + "\\MyApp.exe" + "'";
Process.Start(new ProcessStartInfo() { FileName = "cmd.exe", Arguments = "/c " + cmd, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }).WaitForExit();

我还没有弄清楚如何为Norton AntiVirus和其他软件执行此操作。

于 2020-10-12T17:07:11.780 回答
0

大多数防病毒程序都提供了启用例外的选项。

转到防病毒设置并将您的 C 或 C++ 文件文件夹添加到 Exceptions

在此处输入图像描述

于 2019-10-19T07:01:08.780 回答
0

我最近遇到了一些应用程序无法运行的问题。它们将显示为进程(在 Windows 下),但从不在任务管理器的应用程序选项卡下。这些进程通常有大约 120 KB 的内存大小,有时会有多个进程。

罪魁祸首是 Avast DeepScreen。来自 Avast:

DeepScreen 技术允许 Avast 在执行未知文件时做出实时决策。

就我而言,MATLAB和其他一些应用程序一样被阻止。

Avast 没有任何迹象表明它正在阻止应用程序,从而发出“删除 Avast!”。上面的评论很合适。

于 2015-12-23T05:13:17.480 回答
-1

转到 Avast Antivirus的“文件系统防护”并单击“专家设置”按钮。

然后从左侧菜单中找到并单击“排除”选项。在文件排除列表中添加您的项目文件夹。这是安全的,除非危险病毒在您不知情的情况下爬入您的项目文件夹:P

于 2013-08-14T17:20:52.263 回答
-2

您需要转到您的防病毒软件帐户→设置→*排除或类似的东西,然后输入其他人提到的文件路径。

我用 Avast Antivirus 做到了。第一次没有成功,所以我卸载并安装了。然后我去了排除,它现在可以工作了。

于 2016-03-25T21:52:37.100 回答