我创建了一个默认的Dev-C ++项目,而不是通常的return 0;
,它有return EXIT_SUCCESS;
,在编译和运行它时,我的防病毒软件警告我可执行文件是病毒。< / p>
我用Visual C ++,Eclipse和Codeblocks尝试了相同的代码,他们都成功编译了......所以我在这里有点困惑..
- 当其他类似的宏工作得很好时,为什么AVG会检测使用行return EXIT_SUCCESS;
作为病毒从Dev-C ++生成的可执行文件?
答案 0 :(得分:14)
例如,这是AVG检测为病毒的C ++程序:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
cout << "done";
return 0;
}
运行可执行文件,我将获得带有此文本的AVG弹出窗口:
AVG Resident Shield Alert
Threat detected!
File name: c:\Documents and Settings\eleschinski\Desktop\workspace\CppApplication_2\dist\Debug\MinGW-Windows\cppapplication_2.exe
Threat name: Trojan horse Agent3.CJAI (More Info)
Move to Vault (Reccommended)
Go to file
Ignore the threat
AVG的功能截图:
AVG防病毒是一种在您的计算机上运行的程序,它使用启发式扫描和其他不精确的算法来识别哪些程序具有不必要的恶意议程。 AVG将可执行文件的内容作为输入,并确定您的程序不安全。
防病毒编写者正在使用Enumerating Badness策略来识别世界上的恶意软件,并且它会回来咬他们,因为这是检测恶意软件问题的错误方法。 Enumerating Badness的一个问题是误报,你现在遇到的问题。
第1步。首先,您要确定AVG抱怨的文件是什么。为此,请转到AVG - &gt;工具菜单 - &gt;扫描文件。选择威胁窗口中定义的违规可执行文件或文件。 AVG将立即扫描文件并建议将其添加到Vault中。此时你可以知道AVG认为这个文件本身就是恶意软件。
第2步。获取关于此恶意软件/病毒文件的第二意见,更好的是,获得50个独立的第二意见。转到网站https://www.virustotal.com
,您可以免费上传文件,大约50种不同的防病毒程序将分析它,如果大多数人认为它是病毒,那么AVG就做得很好。但是,如果只有少数防病毒软件将您的文件标记为邪恶,那么AVG可能会出现误报。
第3步。让AVG确信您的C ++程序是安全的一种简单方法是在C ++程序的开头添加c ++语句:system("pause");
并重新编译并重新运行。对我来说,AVG然后警告我,我点击忽略,然后它让我运行它无论如何。另外,尝试在主函数末尾使用'return 1'而不是'return 0'。它会让你运行它。如果这看起来很奇怪,那就是。通过使用防病毒软件来查看许多误报,病毒编写者比防病毒编写者更聪明。
第4步。查看您是否可以将程序列入白名单。进入AVG中的“病毒库”。 AVG - &gt;历史菜单 - &gt;病毒库。找到代表您的违规C ++程序的订单项,并将其从病毒库中释放出来,或者将其列入白名单,然后重试。
选项1:承认病毒编写者正在赢得针对防病毒软件的战争。隐藏某些东西比调查所有内容并发现所有不良内容更容易。 AVG无法区分合法病毒和刚刚制作的某些c ++程序。获取新的防病毒软件,或获得不需要防病毒软件(Linux)的操作系统,或者不使用防病毒软件,并保留大量离线异地备份。
选项2:告诉AVG停止分析扩展名为.EXE的文件。警告这会降低AVG保护计算机免受真实病毒/恶意软件侵害的能力。转到AVG控制台 - &gt;工具 - &gt;高级设置 - &gt;反病毒 - &gt; Resident Shield - &gt;专家设置。您将看到一个带有标签的文本框:“始终扫描具有以下扩展名的文件”。从该文本框中删除EXE;
。保存并尝试重新运行您的程序。 AVG将不再抱怨您的something.exe可执行文件。
选项3:摆弄您的C ++程序,直到它被标记为病毒为止。添加一些#include
库,不包括其他库。一个无关紧要的变化可能会使AVG决定你的文件是恶意的。
如果AVG中的任何人有兴趣追逐此错误,here is the false positive executable以上
答案 1 :(得分:5)
也许this会减轻整个事情,因为看起来AVG似乎不喜欢(可能)旧版本的gcc(因为Dev-C ++不再开发)和空的组合程序
答案 2 :(得分:1)
当您“定义EXIT_SUCCESS”时,您会看到它应为“0”。
尝试使用IDA Pro Disassembler + Hex Rays Decompiler对您的可执行文件进行反编译,看看那里到底发生了什么:)
答案 3 :(得分:0)