Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb.
#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.exeproporcionado 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\{aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb}
(Valor predeterminado) Implementación del proveedor AMSI de ejemplo de REG_SZ
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb}\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\{aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb}
Problemas conocidos
El proceso no cumple los requisitos de nivel de firma
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 >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
Un hash de archivo no es válido
Las API de AMSI están diseñadas para trabajar con procesos no protegidos. Los ISV no pueden firmar los archivos DLL registrados de AMSI para poder cargarlos en procesos protegidos de ELAM/PPL. En tales casos, es posible que vea la siguiente información en el registro de eventos de seguridad de Windows:
Description:
Code integrity determined that the image hash of a file is not valid. The file could be corrupt due to unauthorized modification, or the invalid hash could indicate a potential disk device error.
File Name: \Device\HarddiskVolume3\<Folder> \<Folder w/ the ISV name> \<Folder w/ the product name>\<Your Amsi Provider>.dll
Para ver el registro de eventos de seguridad de Windows, siga estos pasos:
- Abra Visor de eventos.
- En el panel Navegación, expanda Registros de Windowsy, a continuación, seleccione Seguridad.
Solución alternativa:
Puede filtrar los eventos siguiendo estos pasos:
- Para filtrar un evento, como id. de evento 3033 o 5038, abra el Visor de eventos.
- En el panel de navegación, expanda >y, a continuación, seleccione Operativo.
- Haga clic con el botón derecho en Operativoy, a continuación, seleccione Filtrar registro actual....
- En el cuadro <Todos los identificadores de evento>, escriba
-3033(o-5038) y, a continuación, seleccione Aceptar.
O bien, en el Visor de eventos, puede expandir Registros de Windows, hacer clic con el botón derecho en Seguridad, seleccionar Filtrar registro actual...y, a continuación, especificar -3033 o -5038.
Propina
Si usa el reenvío de eventos de Windows (WEF), puede filtrar los detalles de los identificadores de evento o las descripciones que se reenvieron. Para obtener más información, consulte Blog de tech Community: Filtrado XML avanzado en el Visor de eventos de Windows
Filtrar eventos 3033 y 5038 para su SIEM
Si su organización usa un servidor SIEM, asegúrese de filtrar el identificador de evento 3033 o el identificador de evento 5038 específico de AMSI para que no ingiere información que no sea útil para los analistas de Security Operations Center (SOC). Para obtener más información, consulte Usar el reenvío de eventos de Windows para ayudar con la detección de intrusiones.