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
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