为什么Avira会将“ CoCreateInstance()”视为一种恶意软件?

时间:2018-07-18 07:08:25

标签: c++ winapi visual-c++ antivirus

我使用Visual Studio 2017创建了c ++控制台应用程序,该应用程序提取了.zip文件。但是,当我运行 application.exe 文件时, Avira 防病毒软件将我的exe检测为恶意软件。

我发现CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD)函数在实际的 Avira 造成问题的地方。

为什么Avira认为CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD)是恶意软件?

我的功能:

bool Utils::Unzip2Folder(BSTR lpZipFile, BSTR lpFolder)
{
    IShellDispatch *pISD;

    Folder  *pZippedFile = 0L;
    Folder  *pDestination = 0L;

    long FilesCount = 0;
    IDispatch* pItem = 0L;
    FolderItems *pFilesInside = 0L;

    VARIANT Options, OutFolder, InZipFile, Item;
    CoInitialize(NULL);
    __try {
        if (CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD) != S_OK)
            return 1;

        InZipFile.vt = VT_BSTR;
        InZipFile.bstrVal = lpZipFile;
        pISD->NameSpace(InZipFile, &pZippedFile);
        if (!pZippedFile)
        {
            pISD->Release();
            return 1;
        }

        OutFolder.vt = VT_BSTR;
        OutFolder.bstrVal = lpFolder;
        pISD->NameSpace(OutFolder, &pDestination);
        if (!pDestination)
        {
            pZippedFile->Release();
            pISD->Release();
            return 1;
        }

        pZippedFile->Items(&pFilesInside);
        if (!pFilesInside)
        {
            pDestination->Release();
            pZippedFile->Release();
            pISD->Release();
            return 1;
        }

        pFilesInside->get_Count(&FilesCount);
        if (FilesCount < 1)
        {
            pFilesInside->Release();
            pDestination->Release();
            pZippedFile->Release();
            pISD->Release();
            return 0;
        }

        pFilesInside->QueryInterface(IID_IDispatch, (void**)&pItem);

        Item.vt = VT_DISPATCH;
        Item.pdispVal = pItem;

        Options.vt = VT_I4;
        Options.lVal = 1024 | 512 | 16 | 4;//http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx

        bool retval = pDestination->CopyHere(Item, Options) == S_OK;

        pItem->Release(); pItem = 0L;
        pFilesInside->Release(); pFilesInside = 0L;
        pDestination->Release(); pDestination = 0L;
        pZippedFile->Release(); pZippedFile = 0L;
        pISD->Release(); pISD = 0L;

        return retval;
    }
    __finally
    {
        CoUninitialize();
    }
}

1 个答案:

答案 0 :(得分:2)

没有真正好的答案。为什么AV系统将某些文件检测为误报。

大多数这种误报都是基于某种启发式的。

  1. 小程序比大程序更容易出现问题。
  2. 与其他DLL的依赖关系较少的程序比具有依赖关系的复杂EXE更具问题性。
  3. API函数的某些混合似乎更成问题。使用更复杂的API函数和UI似乎没有什么问题。
  4. 经过签名的可执行文件对于AV系统中的此类启发式问题的风险较小。
  5. 许多程序(以及公司的签名)在内部被列入白名单。您的程序未知。

此功能肯定不是您使用的唯一API函数。检查依赖,您会发现更多!

只需将您的exe路径添加到Avira的排除列表中...在小型工具的开发阶段中,我必须多次执行此操作。

最终提示:询问Avira并将其发送给您。他们可能会更改启发式模式匹配,因此这不再是误报。

我对Avira的服务时间产生了这种影响。