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

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

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

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

AMSI предназначен, в частности, для борьбы с "бесфайлированными вредоносными программами". Типы приложений, которые могут оптимально использовать технологию AMSI, включают обработчики скриптов, приложения, которым требуется проверять буферы памяти перед их использованием, а также приложения, обрабатывающие файлы, которые могут содержать исполняемый код, не содержащий PE (например, макросы Microsoft Word и Excel или PDF-документы). Однако полезность технологии AMSI не ограничивается этими примерами.

Существует два способа взаимодействия с AMSI в приложении.

Пример кода, демонстрирующий использование AMSI в приложении COM, см. в примере приложения интерфейса IAmsiStream.

Сторонние создатели продуктов для защиты от вредоносных программ

Как создатель продуктов для защиты от вредоносных программ вы можете создать и зарегистрировать собственный внутрипроцессный COM-сервер (DLL) для работы в качестве поставщика AMSI. Этот поставщик AMSI должен реализовывать интерфейс IAntimalwareProvider и выполняться внутри процесса.

Обратите внимание, что после Windows 10 версии 1709 (обновление Creators За осень 2017 г.) библиотека DLL поставщика AMSI может не работать, если она зависит от других библиотек 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}

    (По умолчанию) REG_SZ пример реализации поставщика AMSI

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\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}