Destinatari per sviluppatori e codice di esempio
L'interfaccia di analisi antimalware è progettata per l'uso da parte di due gruppi di sviluppatori.
- Sviluppatori di applicazioni che vogliono effettuare richieste ai prodotti antimalware dall'interno delle app.
- Creatori di terze parti di prodotti antimalware che vogliono che i loro prodotti offrano le migliori funzionalità alle applicazioni.
Sviluppatori di applicazioni
AMSI è progettato in particolare per combattere il "malware senza file". I tipi di applicazione che possono sfruttare in modo ottimale la tecnologia AMSI includono motori di script, applicazioni che necessitano di buffer di memoria da analizzare prima di usarli e applicazioni che elaborano file che possono contenere codice eseguibile non PE (ad esempio macro di Microsoft Word ed Excel o documenti PDF). Tuttavia, l'utilità della tecnologia AMSI non è limitata a tali esempi.
Esistono due modi in cui è possibile interfacciarsi con AMSI nell'applicazione.
- Usando le API Win32 AMSI. Vedere Funzioni AMSI (Antimalware Scan Interface).
- Usando le interfacce COM AMSI. Vedere Interfaccia IAmsiStream.
Per il codice di esempio che illustra come usare AMSI all'interno dell'applicazione COM, vedere l'applicazione di esempio di interfaccia IAmsiStream.
Creatori di terze parti di prodotti antimalware
Come creatore di prodotti antimalware, è possibile scegliere di creare e registrare il proprio server COM in-process (una DLL) per funzionare come provider AMSI. Tale provider AMSI deve implementare l'interfaccia IAntimalwareProvider e deve essere eseguita in-process.
Tieni presente che, dopo Windows 10, versione 1709 (Fall 2017 Creators' Update), la DLL del provider AMSI potrebbe non funzionare se dipende da altre DLL nel percorso da caricare contemporaneamente. Per evitare il hijack delle DLL, è consigliabile che la DLL del provider carichi in modo esplicito le relative dipendenze (con un percorso completo) usando chiamate LoadLibrary sicure o equivalenti. È consigliabile invece di basarsi sul comportamento di ricerca LoadLibrary .
La sezione seguente illustra come registrare il provider AMSI. Per il codice di esempio completo che mostra come creare una DLL del provider AMSI personalizzata, vedere l'applicazione di esempio di interfaccia IAntimalwareProvider.
Registrare la DLL del provider con AMSI
Per iniziare, è necessario assicurarsi che queste chiavi del Registro di sistema di Windows esistano.
- HKLM\SOFTWARE\Microsoft\AMSI\Providers
- HKLM\SOFTWARE\Classes\CLSID
Un provider AMSI è un server COM in-process. Di conseguenza, deve registrarsi con COM. Le classi COM vengono registrate in HKLM\SOFTWARE\Classes\CLSID
.
Il codice seguente illustra come registrare un provider AMSI, il cui GUID (per questo esempio) si presuppone che sia 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;
}
Se la DLL implementa la funzione DllRegisterServer, come nell'esempio precedente, è possibile registrarla usando l'eseguibile regsvr32.exe
fornito da Windows . Da un prompt dei comandi con privilegi elevati eseguire un comando di questo modulo.
C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll
In questo esempio il comando crea le voci seguenti.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
(Impostazione predefinita) implementazione del provider AMSI di esempio REG_SZ
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32
(Impostazione predefinita) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ entrambi
Oltre alla regolare registrazione COM, è anche necessario registrare il provider con AMSI. A tale scopo, aggiungere una voce alla chiave seguente.
HKLM\SOFTWARE\Microsoft\AMSI\Providers
ad esempio:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
Problemi noti
Il processo non ha soddisfatto i requisiti del livello di firma
Se si dispone di un servizio antimalware non Microsoft che è Windows Protected Process Light (PPL) o Antimalware Protected Process Light (PPL antimalware) che tenta di caricare in un provider AMSI, è possibile visualizzare le informazioni seguenti nel registro eventi di integrità del codice:
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.
Per visualizzare il registro eventi integrità del codice, seguire questa procedura:
Aprire il Visualizzatore eventi.
Nel riquadro di spostamento espandere Registri applicazioni e servizi Integrità>>>e quindi selezionare Operativo.
In alternativa, se è abilitato il controllo dell'integrità del controllo di controllo del sistema, cercare quanto segue:
- Nome log: Sicurezza
- Origine: Microsoft Sicurezza di Windows
- ID evento:
5038
Un hash di file non è valido
Le API AMSI sono progettate per funzionare con processi non protetti. Gli ISV non sono in grado di firmare le DLL registrate AMSI per consentirne il caricamento nei processi protetti ELAM/PPL. In questi casi, è possibile che nel registro eventi di sicurezza di Windows vengano visualizzate le informazioni seguenti:
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
Per visualizzare il registro eventi di Sicurezza di Windows, seguire questa procedura:
Aprire il Visualizzatore eventi.
Nel riquadro di spostamento, espandere Registri di Windows, e quindi selezionare Sicurezza.
Soluzione alternativa:
È possibile filtrare gli eventi seguendo questa procedura:
Per filtrare un evento, ad esempio ID evento 3033 o 5038, aprire Visualizzatore eventi.
Nel riquadro di spostamento espandere Registri applicazioni e servizi Integrità>>>e quindi selezionare Operativo.
Fare clic con il pulsante destro del mouse su Operational, quindi selezionare Filter Current Log....
Nella casella <Tutti gli ID evento> digitare
-3033
(o-5038
) e quindi selezionare OK.
In alternativa, in Visualizzatore Eventi è possibile espandere Registri di Windows, fare clic con il pulsante destro del mouse su Sicurezza, selezionare Filtra log corrente...e quindi specificare -3033
o -5038
.
Mancia
Se usi l'inoltro di eventi di Windows ,puoi filtrare i dettagli sugli ID evento o le descrizioni inoltrati. Per altre informazioni, vedere blog Tech Community: Filtro XML avanzato nel Visualizzatore eventi di Windows
Filtrate gli eventi 3033 e 5038 per il SIEM
Se l'organizzazione usa un server SIEM, assicurarsi di filtrare l'ID evento 3033 e/o l'ID evento 5038 specifico per AMSI in modo da non inserire informazioni non utili per gli analisti del Centro operazioni di sicurezza (SOC). Per altre informazioni, vedere Usare l'inoltro eventi di Windows per facilitare il rilevamento delle intrusioni.