Público para 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". Los tipos de aplicación que pueden aprovechar de forma óptima la tecnología AMSI incluyen motores de script, aplicaciones que necesitan búferes de memoria que se examinen antes de usarlos y aplicaciones que procesan archivos que pueden contener código ejecutable que no sea PE (como macros de Microsoft Word y Excel o 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.
- Mediante las API de Win32 de AMSI. Consulte Funciones de interfaz de examen de antimalware (AMSI).
- Mediante el uso de las interfaces COM de AMSI. Consulte IAmsiStream interface (Interfaz IAmsiStream).
Para obtener código de ejemplo que muestra 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 elegir crear y registrar su propio servidor COM en proceso (un ARCHIVO 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 de creadores de otoño 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 archivo DLL del proveedor cargue sus dependencias explícitamente (con una ruta de acceso completa) mediante llamadas loadLibrary seguras 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 obtener código de ejemplo completo que muestra cómo crear su propia DLL del proveedor AMSI, consulte la aplicación de ejemplo de interfaz IAntimalwareProvider.
Registro del archivo DLL del proveedor con 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 consiguiente, debe registrarse con COM. Las clases COM se registran en HKLM\SOFTWARE\Classes\CLSID
.
El código siguiente 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 regsvr32.exe
proporcionado por Windows. Desde 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 ambos
Además del registro COM normal, también debe inscribir el proveedor con 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}
Problemas conocidos
Si tiene un servicio antimalware que no es de Microsoft que es Windows Protected Process Light (PPL) o Antimalware Protected Process Light (Antimalware PPL) que intenta cargar en un proveedor AMSI, es posible que vea la siguiente información en el registro de eventos de integridad de código:
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.
Para ver el registro de eventos de integridad de código, siga estos pasos:
Abra Visor de eventos.
En el panel de navegación, expanda Registros de aplicaciones y servicios Integridad>de código de Microsoft>Windows>y, a continuación, seleccione Operativo.
O bien, si tiene habilitada la auditoría de integridad de auditoría del sistema, busque lo siguiente:
- Nombre de registro: Seguridad
- Origen: Microsoft Seguridad de Windows
- Identificador de evento:
5038