65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2022年9月7日

MIT

1分钟阅读

viewsIcon

7666

赛门铁克可能导致有效的应用程序崩溃并无痕迹地消失

引言

我正在进行一个测试,用于在 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日:初始版本
© . All rights reserved.