Odbiorcy deweloperów i przykładowy kod
Interfejs skanowania oprogramowania chroniącego przed złośliwym kodem jest przeznaczony do użycia przez dwie grupy deweloperów.
- Deweloperzy aplikacji, którzy chcą wysyłać żądania do produktów chroniących przed złośliwym kodem z poziomu swoich aplikacji.
- Twórcy innych firm produktów chroniących przed złośliwym kodem, którzy chcą, aby ich produkty oferowały najlepsze funkcje aplikacjom.
Deweloperzy aplikacji
Usługa AMSI została zaprojektowana w szczególności w celu zwalczania "złośliwego oprogramowania bez plików". Typy aplikacji, które mogą optymalnie wykorzystać technologię AMSI, obejmują silniki skryptowe, aplikacje, które wymagają przeskanowania buforów pamięci przed ich użyciem, oraz aplikacje, które przetwarzają pliki mogące zawierać kod wykonywalny w formatach innych niż PE (np. makra programów Microsoft Word i Excel lub dokumenty PDF). Jednak użyteczność technologii AMSI nie jest ograniczona do tych przykładów.
Istnieją dwa sposoby interfejsu z usługą AMSI w aplikacji.
- Używając interfejsów API Win32 AMSI. Zobacz funkcje Antimalware Scan Interface (AMSI).
- Korzystając z interfejsów COM AMSI. Zobacz interfejs IAmsiStream.
Aby uzyskać przykładowy kod pokazujący sposób korzystania z usługi AMSI w aplikacji COM, zobacz przykładową aplikację interfejsu IAmsiStream .
Twórcy zewnętrznych produktów antywirusowych
Jako twórca produktów chroniących przed złośliwym oprogramowaniem możesz utworzyć i zarejestrować własny serwer COM w procesie (DLL), aby działać jako dostawca AMSI. Ten dostawca AMSI musi zaimplementować interfejs
Należy pamiętać, że po wersji Windows 10 1709 (Aktualizacja dla twórców z jesieni 2017 roku) biblioteka DLL dostawcy AMSI może nie działać, jeśli zależy od innych bibliotek DLL na swojej ścieżce, aby były ładowane jednocześnie. Aby zapobiec przejęciom bibliotek DLL, zalecamy jawne załadowanie zależności dostawcy (z pełną ścieżką) przy użyciu bezpiecznych wywołań LoadLibrary lub równoważnych. Zalecamy wykorzystanie tego zamiast polegać na mechanizmie wyszukiwania LoadLibrary.
W poniższej sekcji pokazano, jak zarejestrować dostawcę amSI. Aby uzyskać pełny przykładowy kod pokazujący sposób tworzenia własnej biblioteki DLL dostawcy AMSI, zobacz aplikację z przykładowym użyciem interfejsu IAntimalwareProvider .
Zarejestruj bibliotekę DLL dostawcy w usłudze AMSI
Na początek, należy upewnić się, że te klucze rejestru systemu Windows istnieją.
- HKLM\SOFTWARE\Microsoft\AMSI\Providers
- HKLM\SOFTWARE\Classes\CLSID
Dostawca AMSI jest działającym w procesie serwerem COM. W związku z tym musi zarejestrować się w COM. Klasy COM są rejestrowane w HKLM\SOFTWARE\Classes\CLSID
.
Poniższy kod pokazuje, jak zarejestrować dostawcę AMSI, którego identyfikator GUID (na przykład) zakładamy, że jest 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;
}
Jeśli biblioteka DLL implementuje funkcję DllRegisterServer, jak pokazano powyżej, możesz zarejestrować ją przy użyciu pliku wykonywalnego dostarczonego przez system Windows regsvr32.exe
. W podwyższonym wierszu poleceń wydaj polecenie w tej formie.
C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll
W tym przykładzie polecenie tworzy następujące wpisy.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
(domyślna) implementacja REG_SZ przykładowego dostawcy AMSI
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32
(ustawienie domyślne) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ Obie
Oprócz regularnej rejestracji COM należy również zarejestrować dostawcę w usłudze AMSI. W tym celu należy dodać wpis do następującego klucza.
HKLM\SOFTWARE\Microsoft\AMSI\Providers
Na przykład
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
Znane problemy
Proces nie spełnia wymagań dotyczących poziomu podpisywania
Jeśli masz usługę ochrony przed złośliwym oprogramowaniem innego producenta niż Microsoft, która jest Windows Protected Process Light (PPL) lub Antimalware Protected Process Light (Anti-malware PPL) i próbuje załadować się w dostawcy AMSI, mogą zostać wyświetlone następujące informacje w dzienniku zdarzeń integralności kodu:
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.
Aby wyświetlić dziennik zdarzeń integralności kodu, wykonaj następujące kroki:
Otwórz Podgląd zdarzeń.
W okienku nawigacji rozwiń Dzienniki aplikacji i usług>Microsoft>Windows>Integralności Kodu, a następnie wybierz pozycję Operacyjny.
Jeśli masz włączoną integralność audytu systemu, poszukaj tego:
- Nazwa dziennika: Zabezpieczenia
- Źródło: Zabezpieczenia systemu Microsoft Windows
- Identyfikator zdarzenia:
5038
Skrót pliku jest nieprawidłowy
Interfejsy API AMSI są przeznaczone do pracy z procesami, które nie są chronione. Niezależni dostawcy oprogramowania (ISV) nie mogą podpisać zarejestrowanych bibliotek DLL AMSI, aby mogły się ładować do procesów zabezpieczonych przez ELAM/PPL. W takich przypadkach w dzienniku zdarzeń zabezpieczeń systemu Windows mogą zostać wyświetlone następujące informacje:
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
Aby wyświetlić dziennik zdarzeń zabezpieczeń systemu Windows, wykonaj następujące kroki:
Otwórz Podgląd zdarzeń.
W okienku Nawigacji rozwiń węzeł Dzienniki systemu Windows, a następnie wybierz pozycję Zabezpieczenia.
Obejście:
Zdarzenia można odfiltrować, wykonując następujące kroki:
Aby odfiltrować zdarzenie, takie jak zdarzenie o identyfikatorze 3033 lub 5038, otwórz Podgląd zdarzeń.
W okienku nawigacji rozwiń Dzienniki aplikacji i usług>Microsoft>Windows>Integralności Kodów, a następnie wybierz pozycję Operacyjne.
Kliknij prawym przyciskiem myszy Operacyjny, a następnie wybierz Filtruj bieżący dziennik....
W polu <Wszystkie identyfikatory zdarzeń> wpisz
-3033
(lub-5038
), a następnie wybierz OK.
Lub w Podglądzie zdarzeń można rozwinąć dzienniki systemu Windows, kliknąć prawym przyciskiem myszy pozycję Zabezpieczenia, wybrać Filtruj bieżący dziennik..., a następnie określić -3033
lub -5038
.
Napiwek
Jeśli używasz funkcji przekazywania zdarzeń systemu Windows (WEF), możesz filtrować szczegóły dotyczące identyfikatorów lub opisów zdarzeń, które są przekazywane. Aby uzyskać więcej informacji, zobacz blog społeczności technicznej : zaawansowane filtrowanie XML w Podglądzie zdarzeń systemu Windows
Odfiltruj zdarzenia 3033 i 5038 dla rozwiązania SIEM
Jeśli Twoja organizacja korzysta z serwera SIEM, należy odfiltrować identyfikator zdarzenia 3033 i/lub identyfikator zdarzenia 5038 specyficzny dla usługi AMSI, aby nie pozyskiwać informacji, które nie są przydatne dla analityków usługi Security Operations Center (SOC). Aby uzyskać więcej informacji, zobacz Używanie przekazywania zdarzeń systemu Windows w celu pomocy w wykrywaniu włamań.