应用程序无痕迹崩溃 / 没有转储文件





5.00/5 (3投票s)
赛门铁克可能导致有效的应用程序崩溃并无痕迹地消失
引言
我正在进行一个测试,用于在 parallel_for
循环中执行 SID
转换。 一切正常,但大约 7 次中的 1 次,我的应用程序会无迹可寻。 我检查了可能的竞争条件,但没有发现明显的问题。 在花了一个晚上简化代码后,我将其重现为以下代码:
PSID pSID;
SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY;
AllocateAndInitializeSid(&SIDAuth, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pSID);
concurrency::parallel_for(size_t(0), (size_t)1000, [&](size_t i) {
LPTSTR sidString = NULL;
if (!ConvertSidToStringSid(pSID, &sidString)) {
return;
}
LocalFree(sidString);
});
cout << "test" << endl;
Sleep(1000);
我尝试捕获 C++ 异常,但没有发现。 我尝试捕获结构化异常,但也没有发现。 绝对没有任何事情发生,我的应用程序只是停止存在了。 我检查了事件日志,但那里也没有任何信息。
然后,我开始通过 shell 运行我的测试程序,而没有调试器,这时每次应用程序消失时,都会在应用程序日志中显示以下内容。
这时我回忆起 Raymond Chen 的一篇博文,他在其中解释了应用程序在反恶意软件服务拦截 RPC 调用(微软不支持)并出现故障后,如何神秘地崩溃,导致应用程序不再遵循任何预期的执行路径,并直接崩溃。 在我的例子中,我知道异常 0xc0000005 是访问违规,RPCRT4.dll 是 RPC 库,并且我确实安装了一个具有侵入性的反恶意软件程序,所以……
这解释了一切。 代码没有做任何错误的事情。 没有 C++ 或结构化异常可以捕获。 只是赛门铁克已经深入到 RPC 链中(可能因为它在挂钩到 RPC 时会破坏多线程本身),并决定发生了某种恶意行为,因此直接将应用程序从存在中移除。
历史
- 2022年9月7日:初始版本