Freigeben über


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.

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.exeregistrieren. 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:

  1. Öffnen Sie die Ereignisanzeige.

  2. 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:

  1. Öffnen Sie die Ereignisanzeige.

  2. 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:

  1. Um ein Ereignis wie die Ereignis-ID 3033 oder 5038 herauszufiltern, öffnen Sie die Ereignisanzeige.

  2. Erweitern Sie im Navigationsbereich "Anwendungen und Dienste protokolliert>Microsoft>Windows-Codeintegrität>" und wählen Sie dann "Betriebsbereit" aus.

  3. Klicken Sie mit der rechten Maustaste auf Betriebsprotokoll, und wählen Sie dann Aktuelles Protokoll filtern... aus.

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