Público de desenvolvedor e código de exemplo

A Interface de Verificação Antimalware foi projetada para uso por dois grupos de desenvolvedores.

  • Desenvolvedores de aplicativos que desejam fazer solicitações para produtos antimalware de dentro de seus aplicativos.
  • Criadores terceirizados de produtos antimalware que desejam que seus produtos ofereçam os melhores recursos aos aplicativos.

Desenvolvedores de aplicativos

AMSI é projetado em particular para combater "malware sem arquivo". Os tipos de aplicativos que podem aproveitar de forma ideal a tecnologia AMSI incluem mecanismos de script, aplicativos que precisam de buffers de memória para serem verificados antes de usá-los e aplicativos que processam arquivos que podem conter código executável não PE (como macros do Microsoft Word e Excel ou documentos PDF). No entanto, a utilidade da tecnologia AMSI não se limita a esses exemplos.

Há duas maneiras pelas quais você pode fazer interface com o AMSI em seu aplicativo.

  • Usando as APIs AMSI Win32. Consulte Funções da Interface de Verificação Antimalware (AMSI).
  • Usando as interfaces AMSI COM. Consulte Interface IAmsiStream.

Para obter o código de exemplo mostrando como consumir AMSI em seu aplicativo COM, consulte o aplicativo de exemplo de interface IAmsiStream.

Criadores terceirizados de produtos antimalware

Como criador de produtos antimalware, você pode optar por criar e registrar seu próprio servidor COM em processo (uma DLL) para funcionar como um provedor AMSI. Esse provedor AMSI deve implementar a interface IAntimalwareProvider e deve ser executado no processo.

Observe que, após o Windows 10, versão 1709 (a atualização de criadores do outono de 2017), sua DLL do provedor AMSI pode não funcionar se depender de outras DLLs em seu caminho para ser carregado ao mesmo tempo. Para evitar o sequestro de DLL, recomendamos que a DLL do provedor carregue suas dependências explicitamente (com um caminho completo) usando chamadas LoadLibrary seguras ou equivalentes. Recomendamos isso em vez de confiar no comportamento de pesquisa LoadLibrary.

A seção abaixo mostra como registrar seu provedor AMSI. Para obter o código de exemplo completo mostrando como criar sua própria DLL do provedor AMSI, consulte o aplicativo de exemplo de interface IAntimalwareProvider.

Registre sua DLL do provedor com AMSI

Para começar, você precisa garantir que essas chaves do Registro do Windows existam.

  • HKLM\SOFTWARE\Microsoft\AMSI\Provedores
  • HKLM\SOFTWARE\Classes\CLSID

Um provedor AMSI é um servidor COM em processo. Consequentemente, tem de se registar na OCM. As classes COM são registradas no HKLM\SOFTWARE\Classes\CLSID.

O código abaixo mostra como registrar um provedor AMSI, cujo GUID (para este exemplo) assumiremos ser 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;
}

Se sua DLL implementa a função DllRegisterServer, como o exemplo acima faz, então você pode registrá-lo usando o executável regsvr32.exefornecido pelo Windows . Em um prompt de comando elevado, emita um comando deste formulário.

C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll

Neste exemplo, o comando cria as seguintes entradas.

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}

    (Padrão) REG_SZ Exemplo de implementação do provedor AMSI

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32

    (Padrão) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll

    ThreadingModel REG_SZ Ambos

Além do registro COM regular, você também precisa inscrever o provedor com AMSI. Para fazer isso, adicione uma entrada à seguinte chave.

HKLM\SOFTWARE\Microsoft\AMSI\Provedores

Por exemplo,

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}