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.
- Mediante las API de Win32 de AMSI. Consulte Funciones de Interfaz de examen antimalware (AMSI).
- Mediante el uso de las interfaces COM de AMSI. Consulte la interfaz IAmsiStream.
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}