Аудитория разработчика и пример кода

Интерфейс проверки антивредоносного ПО предназначен для использования двумя группами разработчиков.

  • Разработчики приложений, которые хотят отправлять запросы на антивредоносные продукты из своих приложений.
  • Сторонние создатели продуктов защиты от вредоносных программ, которые хотят, чтобы их продукты предлагали лучшие возможности для приложений.

Разработчики приложений

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файла. В командной строке с повышенными привилегиями выполните команду этой формы.

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. 

Чтобы просмотреть журнал событий целостности кода, выполните следующие действия.

  1. Откройте окно просмотра событий.

  2. В области навигации разверните узел "Приложения и службы" Журналы целостности> кода Microsoft>Windows>, а затем выберите "Операционный".

Или если у вас включен аудит целостности системы, найдите следующее:

  • Имя журнала: безопасность
  • Источник: Microsoft Безопасность Windows
  • Идентификатор события: 5038