Entwicklerzielgruppe und Beispielcode
AMSI ist für die Nutzung durch zwei Gruppen von Entwicklern konzipiert.
- Anwendungsentwickler, die in ihren Apps Anforderungen an Antischadsoftwareprodukte stellen möchten.
- Drittanbieter von Antischadsoftwareprodukten, die möchten, dass ihre Produkte Anwendungen die besten Features bieten.
Anwendungsentwickler
AMSI ist insbesondere auf die Bekämpfung von "dateiloser Schadsoftware" ausgelegt. Anwendungstypen, die die AMSI-Technologie optimal nutzen können, sind Skript-Engines, Anwendungen, die Speicherpuffer vor der Verwendung überprüfen müssen, und Anwendungen, die Dateien verarbeiten, die ausführbaren Code ohne PE enthalten können (z. B. Microsoft-Word- und Excel-Makros oder PDF-Dokumente). Der Nutzen der AMSI-Technologie ist jedoch nicht auf diese Beispiele beschränkt.
Es gibt zwei Möglichkeiten, wie Sie in Ihrer Anwendung eine Schnittstelle mit AMSI erstellen können.
- Mithilfe der AMSI Win32-APIs. Siehe Funktionen Antimalware Scan Interface (AMSI).
- Mithilfe der AMSI-COM-Schnittstellen. Siehe IAmsiStream-Schnittstelle.
Beispielcode zur Verwendung von AMSI in Ihrer COM-Anwendung finden Sie in der Beispielanwendung für die IAmsiStream-Schnittstelle.
Drittanbieter von Antischadsoftware-Produkten
Als Ersteller von Antischadsoftwareprodukten können Sie ihren eigenen prozessinternen COM-Server (eine DLL) erstellen und registrieren, um als AMSI-Anbieter zu fungieren. Dieser AMSI-Anbieter muss die IAntimalwareProvider-Schnittstelle implementieren und prozessintern ausgeführt werden.
Beachten Sie, dass ihre AMSI-Anbieter-DLL nach Windows 10 Version 1709 (dem Fall 2017 Creators‘ Update) möglicherweise nicht funktioniert, wenn sie von anderen DLLs in ihrem Pfad abhängt, die gleichzeitig geladen werden sollen. Um DLL-Hijacking zu verhindern, empfehlen wir, dass Ihre Anbieter-DLL die Abhängigkeiten explizit (mit einem vollständigen Pfad) mithilfe von sicheren LoadLibrary-Aufrufen oder einer entsprechenden Option lädt. Dies wird empfohlen, anstatt sich auf das LoadLibrary-Suchverhalten zu verlassen.
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 Beispielanwendung für die IAntimalwareProvider-Schnittstelle.
Registrieren Ihrer 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 bei COM registrieren. COM-Klassen werden in HKLM\SOFTWARE\Classes\CLSID
registriert.
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
(Default) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ Both
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}