我创建了一个默认的 Dev-C++ 项目,而不是通常的return 0;
,它有return EXIT_SUCCESS;
,并且在编译和运行它时,我的防病毒软件警告我可执行文件是病毒。
我用 Visual C++、Eclipse 和 Codeblocks 尝试了相同的代码,它们都成功编译了它……所以我在这里有点困惑……
— 为什么 AVG 检测到从 Dev-C++ 生成的可执行文件带有return EXIT_SUCCESS;
病毒行,而其他类似的宏运行良好?
例如,下面是一个被 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 将您的可执行文件的内容作为输入,并确定您的程序不安全。
防病毒作者正在使用枚举不良策略来识别世界上的恶意软件,并且它又回来咬他们,因为这是检测恶意软件问题的错误方法。枚举不良的一个问题是误报,这是您现在遇到的问题。
第 1 步。 首先,您要非常确定 AVG 抱怨的文件是什么。为此,请转到 AVG -> 工具菜单 -> 扫描文件。选择威胁窗口中定义的有问题的可执行文件或文件。AVG 将立即扫描文件并建议将其添加到保管库中。此时您可以知道 AVG 认为仅此文件就是恶意软件。
步骤 2. 获得有关此恶意软件/病毒文件的第二意见,更好的是,获得 50 个独立的第二意见。去网站https://www.virustotal.com
,在那里你可以免费上传你的文件,它会被大约 50 种不同的杀毒程序分析,如果大多数人认为它是病毒,那么 AVG 做得很好。但是,如果只有少数防病毒软件将您的文件标记为恶意文件,那么 AVG 可能会误报。
步骤 3. 让 AVG 相信您的 C++ 程序是安全的一种简单方法是添加 c++ 语句:system("pause");
在 C++ 程序的开头并重新编译和重新运行。对我来说,AVG 会警告我,我点击忽略,然后它让我运行它。另外,请尝试在 main 函数的末尾使用“return 1”而不是“return 0”。它会让你运行它。如果这看起来很奇怪,那就是。病毒编写者比防病毒编写者更聪明,因为它让防病毒软件能够发现许多误报。
第 4 步 :看看您是否可以将您的程序列入白名单。进入 AVG 中的“病毒库”。AVG -> 历史菜单 -> 病毒库。找到代表有问题的 C++ 程序的行项目并将它们从病毒库中释放,或者将它们列入白名单,然后重试。
选项 1:承认病毒编写者正在赢得与反病毒软件的战争。隐藏某事比调查一切并发现所有不良情况更容易。AVG 无法区分合法病毒和您刚刚制作的某些 c++ 程序。获得新的防病毒软件,或者获得不需要防病毒软件 (linux) 的操作系统,或者完全不使用防病毒软件并保留大量离线异地备份。
选项 2: 告诉 AVG 停止分析带有 .EXE 扩展名的文件。警告这将降低 AVG 保护您的计算机免受真正病毒/恶意软件侵害的能力。转到 AVG 控制台 -> 工具 -> 高级设置 -> 防病毒 -> Resident Shield -> 专家设置。您将看到一个带有标签的文本框:“始终扫描具有以下扩展名的文件”。从该文本框中删除EXE;
。保存并尝试重新运行您的程序。AVG 将不再抱怨您的 something.exe 可执行文件。
选项 3: 摆弄你的 C++ 程序,直到它不再被标记为病毒。添加一些#include
库,不包括其他一些库。一个无关紧要的更改可能会使 AVG 决定您的文件是恶性的。
如果 AVG 的任何人有兴趣追查这个错误,这里是上面的误报可执行文件
也许这会减轻整个事情,因为似乎 AVG 不喜欢(可能)旧版本的 gcc(因为 Dev-C++ 不再开发)和空程序的组合。
当你谷歌“定义 EXIT_SUCCESS”时,你会看到它应该是“0”。
尝试使用 IDA Pro Disassembler + Hex Rays Decompiler 反编译你的可执行文件,看看到底发生了什么:)