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

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