Dela via


Målgrupp för utvecklare och exempelkod

Gränssnittet för programgenomsökning mot skadlig kod är utformat för användning av två grupper av utvecklare.

  • Programutvecklare som vill göra begäranden till produkter mot skadlig kod från sina appar.
  • Tredjepartsskapare av produkter mot skadlig kod som vill att deras produkter ska erbjuda de bästa funktionerna till program.

Programutvecklare

AMSI är särskilt utformat för att bekämpa "fillös skadlig kod". Programtyper som optimalt kan utnyttja AMSI-teknik är skriptmotorer, program som behöver minnesbuffertar som ska genomsökas innan de används och program som bearbetar filer som kan innehålla körbar kod som inte kan köras av PE (till exempel Microsoft Word- och Excel-makron eller PDF-dokument). Amsi-teknikens användbarhet är dock inte begränsad till dessa exempel.

Det finns två sätt att interagera med AMSI i ditt program.

Exempelkod som visar hur du använder AMSI i ditt COM-program finns i exempelprogrammet IAmsiStream-gränssnittet.

Tredjepartsskapare av produkter mot skadlig kod

Som skapare av produkter mot skadlig kod kan du välja att skapa och registrera din egen processbaserade COM-server (en DLL) för att fungera som AMSI-provider. Amsi-providern måste implementera IAntimalwareProvider-gränssnittetoch måste köras i processen.

Observera att efter Windows 10 version 1709 (fall 2017 Creators' Update) kanske din AMSI-provider-DLL inte fungerar om den är beroende av att andra DLL:er i dess sökväg läses in samtidigt. För att förhindra DLL-kapning rekommenderar vi att providerns DLL läser in dess beroenden explicit (med en fullständig sökväg) med hjälp av säkra LoadLibrary--anrop eller motsvarande. Vi rekommenderar detta istället för att förlita sig på LoadLibrary:s sökbeteende.

Avsnittet nedan visar hur du registrerar din AMSI-provider. Fullständig exempelkod som visar hur du skapar en egen AMSI-provider-DLL finns i exempelprogrammet IAntimalwareProvider-gränssnittet.

Registrera din provider-DLL med AMSI

Till att börja med måste du se till att dessa Windows-registernycklar finns.

  • HKLM\SOFTWARE\Microsoft\AMSI\Providers
  • HKLM\SOFTWARE\Classes\CLSID

En AMSI-tjänst är en intern COM-server. Därför måste den registrera sig hos COM. COM-klasser registreras i HKLM\SOFTWARE\Classes\CLSID.

Koden nedan visar hur du registrerar en AMSI-provider, vars GUID (i det här exemplet) vi antar är 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;
}

Om DLL-filen implementerar funktionen DllRegisterServer, som exemplet ovan gör, kan du registrera den med hjälp av den Windows-levererade körbara filen regsvr32.exe. Från en upphöjd kommandotolk, ange ett kommando i denna form.

C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll

I det här exemplet skapar kommandot följande poster.

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}

     (standard) REG_SZ exempelimplementering av AMSI-provider

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32

     (standard) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll

     ThreadingModel REG_SZ Båda

Förutom vanlig COM-registrering måste du också registrera providern med AMSI. Det gör du genom att lägga till ett element i följande nyckel.

HKLM\SOFTWARE\Microsoft\AMSI\Providers

Till exempel

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}

Kända problem

Processen uppfyllde inte kraven på signeringsnivå

Om du har en icke-Microsoft-tjänst för program mot skadlig kod som Windows Protected Process Light (PPL) eller Antimalware Protected Process Light (Anti-malware PPL) som försöker ladda in i en AMSI-provider kan du se följande information i händelseloggen för Kodintegritet:

 
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ölj dessa steg för att visa händelseloggen för kodintegritet:

  1. Öppna Händelsevisaren.

  2. I navigeringsfönstret expanderar du Program- och tjänstloggar>Microsoft>Windows>Code Integrityoch väljer sedan Operational.

Om du har aktiverat granskning av systemgranskningsintegritet kan du söka efter följande:

  • Loggnamn: Säkerhet
  • Källa: Microsoft Windows Security
  • Händelse-ID: 5038

Filhashen är inte giltig

AMSI API:er är utformade för att fungera med icke-skyddade processer. ISV:er kan inte signera sina AMSI-registrerade DLL:er så att de kan läsas in i ELAM/PPL-skyddade processer. I sådana fall kan du se följande information i händelseloggen för Windows-säkerhet:


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ölj dessa steg för att visa händelseloggen för Windows-säkerhet:

  1. Öppna Händelsevisaren.

  2. I navigeringsfönstret expanderar du Windows-loggaroch väljer sedan Säkerhet.

Lösning:

Du kan filtrera bort händelser genom att följa dessa steg:

  1. Om du vill filtrera bort en händelse, till exempel Händelse-ID 3033 eller 5038, öppnar du Loggboken.

  2. I navigeringsfönstret expanderar du Program- och tjänstloggar>Microsoft>Windows>Code Integrityoch väljer sedan Operational.

  3. Högerklicka på Operationaloch välj sedan Filtrera aktuell logg....

  4. I rutan <Alla händelse-ID:er> skriver du -3033 (eller -5038) och väljer sedan OK.

Eller expandera Windows-loggar i Händelsevisaren, högerklicka på Säkerhet, välj Filtrera aktuell logg...och sedan ange -3033 eller -5038.

Tips

Om du använder Windows Event Forwarding (WEF) kan du filtrera information om vilka händelse-ID:er eller beskrivningar som vidarebefordras. Mer information finns i Tech Community Blogg: Avancerad XML-filtrering i Windows Händelsevyn

Filtrera bort händelser 3033 och 5038 för SIEM

Om din organisation använder en SIEM-server ska du filtrera bort händelse-ID 3033 och/eller händelse-ID 5038 som är specifikt för AMSI så att du inte matar in information som inte är användbar för dina SOC-analytiker (Security Operations Center). Mer information finns i Använda Vidarebefordran av Windows-händelser för att hjälpa till med intrångsidentifiering.