【发布时间】:2018-07-18 07:08:25
【问题描述】:
我使用 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();
}
}
【问题讨论】:
-
您应该询问“Avira”。与许多 WinAPI 函数一样,这个函数很可能是许多恶意软件应用程序的一部分。
-
“我发现 CoCreateInstance… 实际 Avira 产生问题的函数。” - 你是怎么发现的?是什么让您认为它没有被标记只是因为它不是众所周知的可执行文件?
-
@VTT 当我在 VirasTotal.com 中评论 CoCreateInstance 并检查 exe 时,就没有问题了。
-
可以使用 CoCreateInstance 在正在运行的进程中附加一个 DLL。过去的许多病毒可能都这样使用它并因此被标记!
标签: c++ winapi visual-c++ antivirus