Entwicklergruppe und Beispielcode
Die Antischadsoftware-Scanschnittstelle wurde für die Verwendung durch zwei Entwicklergruppen entwickelt.
- Anwendungsentwickler, die Anforderungen an Antischadsoftwareprodukte innerhalb ihrer Apps stellen möchten.
- Entwickler von Antischadsoftware-Produkten von Drittanbietern, die ihren Produkten die besten Features für Anwendungen bieten möchten.
Anwendungsentwickler
AMSI ist insbesondere darauf ausgelegt, "dateilose Schadsoftware" zu bekämpfen. Anwendungstypen, die amSI-Technologie optimal nutzen können, umfassen Skriptmodule, Anwendungen, die Speicherpuffer benötigen, bevor sie verwendet werden, und Anwendungen, die Dateien verarbeiten, die ausführbaren Code ohne PE enthalten können (z. B. Microsoft Word- und Excel-Makros oder PDF-Dokumente). Die Nützlichkeit der AMSI-Technologie ist jedoch nicht auf diese Beispiele beschränkt.
Es gibt zwei Möglichkeiten, mit AMSI in Ihrer Anwendung zu arbeiten.
- Mithilfe der AMSI Win32-APIs. Siehe Antimalware Scan Interface (AMSI)-Funktionen.
- Mithilfe der AMSI-COM-Schnittstellen. Siehe IAmsiStream-Schnittstelle.
Beispielcode zur Verwendung von AMSI in Ihrer COM-Anwendung finden Sie in der Beispielanwendung für IAmsiStream-Schnittstellen.
Ersteller von Antischadsoftwareprodukten von Drittanbietern
Als Ersteller von Antischadsoftwareprodukten können Sie sich dafür entscheiden, Ihren eigenen IN-Process-COM-Server (eine DLL) zu erstellen und zu registrieren, um als AMSI-Anbieter zu fungieren. Dieser AMSI-Anbieter muss die IAntimalwareProvider-Schnittstelle implementieren und muss im Prozess ausgeführt werden.
Beachten Sie, dass Ihre AMSI-Anbieter-DLL nach Windows 10, Version 1709 (Fall 2017 Creators'Update), möglicherweise nicht funktioniert, wenn sie von anderen DLLs im Pfad abhängt, die gleichzeitig geladen werden sollen. Um die DLL-Entführerung zu verhindern, empfehlen wir, dass Ihre Anbieter-DLL seine Abhängigkeiten explizit (mit einem vollständigen Pfad) mit sicheren LoadLibrary-Aufrufen oder gleichwertig lädt. Wir empfehlen dies, anstatt auf das LoadLibrary-Suchverhalten zu vertrauen.
Im folgenden Abschnitt wird gezeigt, wie Sie Ihren AMSI-Anbieter registrieren. Den vollständigen Beispielcode, der zeigt, wie Sie Ihre eigene AMSI-Anbieter-DLL erstellen, finden Sie in der IAntimalwareProvider-Schnittstellenbeispielanwendung.
Registrieren Der Anbieter-DLL bei AMSI
Zunächst müssen Sie sicherstellen, dass diese Windows-Registrierungsschlüssel vorhanden sind.
- HKLM\SOFTWARE\Microsoft\AMSI\Providers
- HKLM\SOFTWARE\Classes\CLSID
Ein AMSI-Anbieter ist ein prozessinterner COM-Server. Folglich muss sie sich selbst bei COM registrieren. COM-Klassen werden in HKLM\SOFTWARE\Classes\CLSID
.
Der folgende Code zeigt, wie sie einen AMSI-Anbieter registrieren, dessen GUID (für dieses Beispiel) angenommen wird 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;
}
Wenn Ihre DLL die DllRegisterServer-Funktion implementiert, wie im obigen Beispiel, können Sie sie mithilfe der von Windows bereitgestellten ausführbaren Datei regsvr32.exe
registrieren. Geben Sie an einer Eingabeaufforderung mit erhöhten Rechten einen Befehl dieses Formulars aus.
C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll
In diesem Beispiel erstellt der Befehl die folgenden Einträge.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
(Standard) REG_SZ Beispielimplementierung des AMSI-Anbieters
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32
(Standard) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ Beide
Zusätzlich zur regulären COM-Registrierung müssen Sie den Anbieter auch bei AMSI registrieren. Dazu fügen Sie dem folgenden Schlüssel einen Eintrag hinzu.
HKLM\SOFTWARE\Microsoft\AMSI\Providers
Beispiel:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
Bekannte Probleme
Der Prozess erfüllte die Anforderungen der Signaturstufe nicht.
Wenn Sie über einen Nicht-Microsoft-Antischadsoftwaredienst verfügen, der windows Protected Process Light (PPL) oder Antischadsoftware-geschütztes Prozesslicht (Antimalware PPL) ist, der versucht, in einem AMSI-Anbieter zu laden, werden möglicherweise die folgenden Informationen im Codeintegritätsereignisprotokoll angezeigt:
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.
Führen Sie die folgenden Schritte aus, um das Codeintegritätsereignisprotokoll anzuzeigen:
Öffnen Sie die Ereignisanzeige.
Erweitern Sie im Navigationsbereich "Anwendungen und Dienste protokolliert>Microsoft>Windows-Codeintegrität>" und wählen Sie dann "Betriebsbereit" aus.
Wenn Sie die Systemüberwachungsintegritätsüberwachung aktiviert haben, suchen Sie folgendes:
- Protokollname: Sicherheit
- Quelle: Microsoft Windows-Sicherheit
- Ereignis-ID:
5038
Ein Dateihash ist ungültig.
DIE AMSI-API sind für die Arbeit mit nicht geschützten Prozessen konzipiert. ISVs können ihre im AMSI registrierten DLLs nicht signieren, damit diese in ELAM/PPL-gesicherte Prozesse geladen werden können. In solchen Fällen werden möglicherweise die folgenden Informationen im Windows Security-Ereignisprotokoll angezeigt:
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
Führen Sie die folgenden Schritte aus, um das Windows-Sicherheitsereignisprotokoll anzuzeigen:
Öffnen Sie die Ereignisanzeige.
Erweitern Sie im Navigationsbereich die Option Windows-Protokolle, und wählen Sie dann Sicherheit aus.
Problemumgehung:
Sie können Ereignisse herausfiltern, indem Sie die folgenden Schritte ausführen:
Um ein Ereignis wie die Ereignis-ID 3033 oder 5038 herauszufiltern, öffnen Sie die Ereignisanzeige.
Erweitern Sie im Navigationsbereich "Anwendungen und Dienste protokolliert>Microsoft>Windows-Codeintegrität>" und wählen Sie dann "Betriebsbereit" aus.
Klicken Sie mit der rechten Maustaste auf Betriebsprotokoll, und wählen Sie dann Aktuelles Protokoll filtern... aus.
Geben Sie im Feld <Alle Ereignis-IDs>
-3033
(oder-5038
) ein, und wählen Sie dann OK aus.
Alternativ können Sie in der Ereignisanzeige die Windows-Protokolle erweitern, mit der rechten Maustaste auf „Sicherheitsprotokolle” klicken, Aktuelles Protokoll filtern... auswählen und dann -3033
oder -5038
angeben.
Tipp
Wenn Sie Windows Event Forwarding (WEF) verwenden, können Sie die Details danach filtern, welche Ereignis-IDs oder Beschreibungen weitergeleitet werden. Weitere Informationen finden Sie im Tech Community-Blog: Erweiterte XML-Filterung in der Windows-Ereignisanzeige
Filtern Sie Ereignisse 3033 und 5038 für Ihr SIEM
Wenn Ihre Organisation einen SIEM-Server verwendet, stellen Sie sicher, dass Sie die speziell für AMSI relevanten Ereignis-IDs 3033 und/oder 5038 herausfiltern, damit Sie keine Informationen erhalten, die für Ihre SOC-Analysten (Security Operations Center) nicht nützlich sind. Weitere Informationen finden Sie unter Verwenden der Windows-Ereignisweiterleitung zur Unterstützung bei der Angriffserkennung.