Интерфейс проверки антивредоносного ПО предназначен для использования двумя группами разработчиков.
Разработчики приложений, которые хотят отправлять запросы на антивредоносные продукты из своих приложений.
Сторонние создатели продуктов защиты от вредоносных программ, которые хотят, чтобы их продукты предлагали лучшие возможности для приложений.
Разработчики приложений
AMSI разработан, в частности, для борьбы с "без файловыми вредоносными программами". Типы приложений, которые могут оптимально использовать технологию AMSI, включают обработчики скриптов, приложения, которым требуется сканировать буферы памяти перед их использованием, и приложения, обрабатывающие файлы, которые могут содержать исполняемый код, отличный от PE (например, макросы Microsoft Word и Excel или PDF-документы). Однако полезность технологии AMSI не ограничивается этими примерами.
Существует два способа взаимодействия с AMSI в приложении.
Используя API-интерфейсы AMSI Win32. См . функции интерфейса проверки защиты от вредоносных программ (AMSI).
С помощью com-интерфейсов AMSI. См. интерфейс IAmsiStream.
Пример кода, показывающий, как использовать AMSI в приложении COM, см . в примере приложения интерфейса IAmsiStream.
Сторонние создатели продуктов защиты от вредоносных программ
Создатель продуктов защиты от вредоносных программ вы можете создать и зарегистрировать собственный сервер COM процесса (DLL) для работы в качестве поставщика AMSI. Этот поставщик AMSI должен реализовать интерфейс IAntimalwareProvider, и он должен выполняться в процессе.
Обратите внимание, что после Windows 10 версии 1709 (обновление Fall 2017 Creators' Update), библиотека DLL поставщика AMSI может не работать, если она зависит от других БИБЛИОТЕК DLL в пути к загрузке одновременно. Чтобы предотвратить перехват библиотеки DLL, рекомендуется, чтобы библиотека DLL поставщика загружала свои зависимости явным образом (с полным путем) с помощью безопасных вызовов LoadLibrary или эквивалентных. Мы рекомендуем использовать это вместо того, чтобы полагаться на поведение поиска LoadLibrary .
В разделе ниже показано, как зарегистрировать поставщика AMSI. Полный пример кода, показывающий, как создать собственную библиотеку DLL поставщика AMSI, см. в примере приложения интерфейса IAntimalwareProvider.
Регистрация библиотеки DLL поставщика с помощью AMSI
Для начала необходимо убедиться, что эти разделы реестра Windows существуют.
HKLM\SOFTWARE\Microsoft\AMSI\Providers
HKLM\SOFTWARE\Classes\CLSID
Поставщик AMSI — это встроенный COM-сервер. Следовательно, он должен зарегистрировать себя в COM. Классы COM регистрируются в HKLM\SOFTWARE\Classes\CLSID.
В приведенном ниже коде показано, как зарегистрировать поставщика AMSI, GUID которого (в этом примере) предполагается 2E5D8A62-77F9-4F7B-A90C-2744820139B2.
#include <strsafe.h>
...
HRESULT SetKeyStringValue(_In_ HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR valueName, _In_ PCWSTR stringValue)
{
LONG status = RegSetKeyValue(key, subkey, valueName, REG_SZ, stringValue, (wcslen(stringValue) + 1) * sizeof(wchar_t));
return HRESULT_FROM_WIN32(status);
}
STDAPI DllRegisterServer()
{
wchar_t modulePath[MAX_PATH];
if (GetModuleFileName(g_currentModule, modulePath, ARRAYSIZE(modulePath)) >= ARRAYSIZE(modulePath))
{
return E_UNEXPECTED;
}
// Create a standard COM registration for our CLSID.
// The class must be registered as "Both" threading model,
// and support multithreaded access.
wchar_t clsidString[40];
if (StringFromGUID2(__uuidof(SampleAmsiProvider), clsidString, ARRAYSIZE(clsidString)) == 0)
{
return E_UNEXPECTED;
}
wchar_t keyPath[200];
HRESULT hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Classes\\CLSID\\%ls", clsidString);
if (FAILED(hr)) return hr;
hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, L"SampleAmsiProvider");
if (FAILED(hr)) return hr;
hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Classes\\CLSID\\%ls\\InProcServer32", clsidString);
if (FAILED(hr)) return hr;
hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, modulePath);
if (FAILED(hr)) return hr;
hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, L"ThreadingModel", L"Both");
if (FAILED(hr)) return hr;
// Register this CLSID as an anti-malware provider.
hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Microsoft\\AMSI\\Providers\\%ls", clsidString);
if (FAILED(hr)) return hr;
hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, L"SampleAmsiProvider");
if (FAILED(hr)) return hr;
return S_OK;
}
Если библиотека DLL реализует функцию DllRegisterServer, как описано выше, можно зарегистрировать ее с помощью предоставленного Windows исполняемого regsvr32.exeфайла. В командной строке с повышенными привилегиями выполните команду этой формы.
Log Name: Microsoft-Windows-CodeIntegrity/Operational
Source: Microsoft-Windows-CodeIntegrity
Event ID: 3033
Description:
Code Integrity determined that a process (\Device\HarddiskVolume3\<Folder>\<Folder w/ the ISV name>\<Folder w/ the product name>\<ProcessName>.exe) attempted to load \Device\HarddiskVolume3\<Folder>\<Folder w/ the ISV name>\<Folder w/ the product name>\<Your Amsi Provider>.dll that did not meet the Custom 3 / Antimalware signing level requirements.
Чтобы просмотреть журнал событий целостности кода, выполните следующие действия.
Откройте окно просмотра событий.
В области навигации разверните узел "Приложения и службы" Журналы целостности> кода Microsoft>Windows>, а затем выберите "Операционный".
Или если у вас включен аудит целостности системы, найдите следующее: