Holger Stehle

Softwareentwicklung und -architektur

« Windows Defender ansprechen

Windows stellt unter der Bezeichnung Antimalware Scan Interface native Funktionalität zur Interaktion mit Windows Defender bereit. Wir werden für C# also – wieder einmal – auf DllImport setzen:

public static class AmsiWrapper {
    public static Result Scan(string content, string name = null) {
        AmsiInitialize(nameof(AmsiWrapper), out IntPtr context);
        AmsiScanString(context, content, name, IntPtr.Zero, out Result result);
        AmsiUninitialize(context);

        return result;
    }

    public enum Result {
        Clean = 0,
        NotDetected = 1,
        Detected = 32768
    }


    [DllImport("Amsi")]
    private static extern int AmsiInitialize(string appName, out IntPtr amsiContext);

    [DllImport("Amsi")]
    private static extern int AmsiScanString(
        IntPtr amsiContext,
        string @string,
        string contentName,
        IntPtr session,
        out Result result
    );

    [DllImport("Amsi")]
    private static extern void AmsiUninitialize(IntPtr amsiContext);
}

Die Verwendung der empfohlenen Funktion AmsiResultIsMalware ist kurioserweise leider nicht möglich, da diese schlicht nicht in Amsi.dll gefunden werden kann. Es gilt also die Hinweise von AMSI_RESULT zu beachten.

Die Überprüfung gestaltet sich nun jedoch grundsätzlich äußerst einfach durch Übergabe des fraglichen Inhalts:

if(AmsiWrapper.Scan("sehrGefährlicherInhalt") == AmsiWrapper.Result.Detected) {
    /* Inhalt als Bedrohung erkannt */
} else {
    /* Inhalt nicht als Bedrohung erkannt */
}

Zum Test der Erkennung potentiell bedrohlicher Inhalte kann beispielsweise die EICAR-Testdatei dienen.

Vor einem tatsächlichen Einsatz sollten mindestens noch Überprüfungen der Rückgabewerte (→ HRESULT) mit entsprechender (Fehler-)Behandlung ergänzt werden.