Audiencia de los desarrolladores y código de ejemplo

La Interfaz de examen Antimalware está diseñada para su uso por dos grupos de desarrolladores.

  • Desarrolladores de aplicaciones que quieren realizar solicitudes a productos antimalware desde sus aplicaciones.
  • Creadores de terceros de productos antimalware que desean que sus productos ofrezcan las mejores características a las aplicaciones.

Desarrolladores de aplicaciones

AMSI está diseñado en particular para combatir "malware sin archivos". Entre los tipos de aplicaciones que pueden aprovechar de forma óptima la tecnología AMSI están los motores de scripts, las aplicaciones que necesitan búferes de memoria que se van a examinar antes de usarlas y las aplicaciones que procesan archivos que pueden contener código ejecutable que no sea PE (como las macros de Microsoft Word y Excel o los documentos PDF). Sin embargo, la utilidad de la tecnología AMSI no se limita a esos ejemplos.

Hay dos maneras de interactuar con AMSI en la aplicación.

Para ver un código de ejemplo que muestre cómo consumir AMSI dentro de la aplicación COM, consulte la aplicación de ejemplo de interfaz IAmsiStream.

Creadores de terceros de productos antimalware

Como creador de productos antimalware, puede optar por crear y registrar su propio servidor COM en proceso (un DLL) para que funcione como proveedor amSI. Ese proveedor AMSI debe implementar la interfaz IAntimalwareProvider y debe ejecutarse en proceso.

Tenga en cuenta que, después de Windows 10, versión 1709 (la actualización Fall Creators Update de 2017), es posible que el archivo DLL del proveedor de AMSI no funcione si depende de otros archivos DLL en su ruta de acceso que se carguen al mismo tiempo. Para evitar el secuestro de DLL, se recomienda que el DLL del proveedor cargue explícitamente sus dependencias (con una ruta de acceso completa) mediante llamadas seguras a LoadLibrary o equivalentes. Se recomienda esto en lugar de confiar en el comportamiento de búsqueda loadLibrary.

En la sección siguiente se muestra cómo registrar el proveedor de AMSI. Para ver un código de ejemplo completo que muestre cómo crear su propio archivo DLL del proveedor AMSI, consulte la aplicación de ejemplo de interfaz IAntimalwareProvider.

Registro del archivo DLL del proveedor en AMSI

Para empezar, debe asegurarse de que existen estas claves del Registro de Windows.

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

Un proveedor AMSI es un servidor COM en proceso. Por lo tanto, debe registrarse en COM. Las clases COM se registran en HKLM\SOFTWARE\Classes\CLSID.

En el código siguiente se muestra cómo registrar un proveedor AMSI, cuyo GUID (para este ejemplo) se supone que es 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;
}

Si el archivo DLL implementa la función DllRegisterServer, como en el ejemplo anterior, puede registrarla mediante el ejecutable proporcionado por Windows regsvr32.exe. En un símbolo del sistema con privilegios elevados, emita un comando de este formulario.

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

En este ejemplo, el comando crea las siguientes entradas.

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

    (Valor predeterminado) Implementación del proveedor AMSI de ejemplo de REG_SZ

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

    (Valor predeterminado) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll

    ThreadingModel REG_SZ Both

Además del registro COM normal, también debe inscribir el proveedor en AMSI. Para ello, agregue una entrada a la siguiente clave.

HKLM\SOFTWARE\Microsoft\AMSI\Providers

Por ejemplo,

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