Audience des développeurs et exemple de code
Antimalware Scan Interfrace est conçue pour être utilisée par deux groupes de développeurs.
- Développeurs d’applications qui souhaitent effectuer des demandes aux produits anti-programme malveillant à partir de leurs applications.
- Créateurs tiers de produits anti-programme malveillant qui souhaitent que leurs produits offrent les meilleures fonctionnalités aux applications.
Développeurs d’applications
AMSI est conçu en particulier pour lutter contre les « programmes malveillants sans fichier ». Les types d’applications qui peuvent tirer parti de la technologie AMSI de manière optimale incluent les moteurs de script, les applications qui ont besoin de mémoire tampons pour être analysées avant de les utiliser et les applications qui traitent des fichiers qui peuvent contenir du code exécutable non PE (par exemple, microsoft Word et des macros Excel ou des documents PDF). Toutefois, l’utilité de la technologie AMSI ne se limite pas à ces exemples.
Il existe deux façons d’interagir avec AMSI dans votre application.
- En utilisant les API AMSI Win32. Consultez Fonctions AMSI (Antimalware Scan Interface).
- En utilisant les interfaces COM AMSI. Consultez interface IAmsiStream.
Pour obtenir un exemple de code montrant comment utiliser AMSI dans votre application COM, consultez l’exemple d’application d’interface IAmsiStream.
Créateurs tiers de produits anti-programme malveillant
En tant que créateur de produits anti-programme malveillant, vous pouvez choisir de créer et d’inscrire votre propre serveur COM in-process (une DLL) pour fonctionner en tant que fournisseur AMSI. Ce fournisseur AMSI doit implémenter l’interface IAntimalwareProvider et il doit s’exécuter en cours.
Notez qu’après Windows 10, version 1709 (mise à jour des créateurs d’automne 2017), votre DLL de fournisseur AMSI peut ne pas fonctionner si elle dépend d’autres DLL dans son chemin à charger en même temps. Pour empêcher le détournement de DLL, nous vous recommandons de charger explicitement ses dépendances (avec un chemin d’accès complet) à l’aide d’appels LoadLibrary sécurisés , ou équivalent. Nous vous recommandons cela au lieu de vous fier au comportement de recherche LoadLibrary .
La section ci-dessous montre comment inscrire votre fournisseur AMSI. Pour obtenir un exemple de code complet montrant comment créer votre propre DLL de fournisseur AMSI, consultez l’exemple d’application d’interface IAntimalwareProvider.
Inscrire votre DLL de fournisseur auprès d’AMSI
Pour commencer, vous devez vous assurer que ces clés de Registre Windows existent.
- HKLM\SOFTWARE\Microsoft\AMSI\Providers
- HKLM\SOFTWARE\Classes\CLSID
Un fournisseur AMSI est un serveur COM in-process. Par conséquent, il doit s’inscrire auprès de COM. Les classes COM sont inscrites dans HKLM\SOFTWARE\Classes\CLSID
.
Le code ci-dessous montre comment inscrire un fournisseur AMSI, dont le GUID (pour cet exemple) est 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 votre DLL implémente la fonction DllRegisterServer, comme le fait l’exemple ci-dessus, vous pouvez l’inscrire à l’aide de l’exécutable regsvr32.exe
fourni par Windows . À partir d’une invite de commandes avec élévation de privilèges, émettez une commande de ce formulaire.
C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll
Dans cet exemple, la commande crée les entrées suivantes.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
(Par défaut) REG_SZ exemple d’implémentation du fournisseur AMSI
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32
(Par défaut) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ les deux
En plus de l’inscription COM régulière, vous devez également inscrire le fournisseur auprès d’AMSI. Pour ce faire, ajoutez une entrée à la clé suivante.
HKLM\SOFTWARE\Microsoft\AMSI\Providers
Par exemple,
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}