Аудитория разработчика и пример кода
Интерфейс проверки антивредоносного ПО предназначен для использования двумя группами разработчиков.
- Разработчики приложений, которые хотят отправлять запросы на антивредоносные продукты из своих приложений.
- Сторонние создатели продуктов защиты от вредоносных программ, которые хотят, чтобы их продукты предлагали лучшие возможности для приложений.
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.
Для начала необходимо убедиться, что эти разделы реестра 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
файла. В командной строке с повышенными привилегиями выполните команду этой формы.
C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll
В этом примере команда создает следующие записи.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
(по умолчанию) реализация поставщика AMSI REG_SZ
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-274820139B2}\InprocServer32
(по умолчанию) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ оба
Помимо обычной регистрации COM, необходимо также зарегистрировать поставщика с помощью AMSI. Для этого добавьте запись в следующий ключ.
HKLM\SOFTWARE\Microsoft\AMSI\Providers
Например,
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
Если у вас есть служба защиты от вредоносных программ, не являющаяся поставщиком программного обеспечения Windows Protected Process Light (PPL) или antimalware Protected Process Light (anti-malware PPL), которая пытается загрузить в поставщик AMSI, в журнале событий целостности кода могут появиться следующие сведения:
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>, а затем выберите "Операционный".
Или если у вас включен аудит целостности системы, найдите следующее:
- Имя журнала: безопасность
- Источник: Microsoft Безопасность Windows
- Идентификатор события:
5038