Audiens pengembang, dan kode sampel
Antarmuka Pemindaian Antimalware dirancang untuk digunakan oleh dua grup pengembang.
- Pengembang aplikasi yang ingin membuat permintaan ke produk antimalware dari dalam aplikasi mereka.
- Pembuat produk antimalware pihak ketiga yang ingin produk mereka menawarkan fitur terbaik untuk aplikasi.
AMSI dirancang khusus untuk memerangi "malware tanpa file". Jenis aplikasi yang dapat memanfaatkan teknologi AMSI secara optimal termasuk mesin skrip, aplikasi yang memerlukan buffer memori untuk dipindai sebelum menggunakannya, dan aplikasi yang memproses file yang dapat berisi kode yang dapat dieksekusi non-PE (seperti makro Microsoft Word dan Excel, atau dokumen PDF). Namun, kegunaan teknologi AMSI tidak terbatas pada contoh tersebut.
Ada dua cara di mana Anda dapat berinteraksi dengan AMSI dalam aplikasi Anda.
- Dengan menggunakan API AMSI Win32. Lihat fungsi Antimalware Scan Interface (AMSI).
- Dengan menggunakan antarmuka AMSI COM. Lihat Antarmuka IAmsiStream.
Untuk kode sampel yang menunjukkan cara menggunakan AMSI dalam aplikasi COM Anda, lihat aplikasi sampel antarmuka IAmsiStream.
Sebagai pembuat produk antimalware, Anda dapat memilih untuk menulis dan mendaftarkan server COM dalam proses Anda sendiri (DLL) untuk berfungsi sebagai penyedia AMSI. Penyedia AMSI tersebut harus menerapkan antarmuka IAntimalwareProvider, dan harus berjalan dalam proses.
Perhatikan bahwa, setelah Windows 10, versi 1709 (Fall 2017 Creators' Update), DLL penyedia AMSI Anda mungkin tidak berfungsi jika bergantung pada DLL lain di jalurnya untuk dimuat pada saat yang sama. Untuk mencegah pembajakan DLL, sebaiknya DLL penyedia Anda memuat dependensinya secara eksplisit (dengan jalur lengkap) menggunakan panggilan LoadLibrary yang aman, atau setara. Kami merekomendasikan ini alih-alih mengandalkan perilaku pencarian LoadLibrary .
Bagian di bawah ini menunjukkan cara mendaftarkan penyedia AMSI Anda. Untuk kode sampel lengkap yang menunjukkan cara menulis DLL penyedia AMSI Anda sendiri, lihat aplikasi sampel antarmuka IAntimalwareProvider.
Untuk memulainya, Anda perlu memastikan bahwa kunci Windows Registry ini ada.
- HKLM\SOFTWARE\Microsoft\AMSI\Providers
- HKLM\SOFTWARE\Classes\CLSID
Penyedia AMSI adalah server COM dalam proses. Akibatnya, perlu mendaftarkan dirinya dengan COM. Kelas COM terdaftar di HKLM\SOFTWARE\Classes\CLSID
.
Kode di bawah ini menunjukkan cara mendaftarkan penyedia AMSI, yang GUID-nya (untuk contoh ini) kami akan mengasumsikan adalah 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;
}
Jika DLL Anda mengimplementasikan fungsi DllRegisterServer, seperti contoh di atas, maka Anda dapat mendaftarkannya dengan menggunakan executable regsvr32.exe
yang disediakan Windows . Dari prompt perintah yang ditingkatkan, terbitkan perintah formulir ini.
C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll
Dalam contoh ini, perintah membuat entri berikut.
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
(Default) REG_SZ Contoh implementasi Penyedia AMSI
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}\InprocServer32
(Default) REG_EXPAND_SZ %ProgramFiles%\TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ Keduanya
Selain pendaftaran COM reguler, Anda juga perlu mendaftarkan penyedia dengan AMSI. Anda melakukannya dengan menambahkan entri ke kunci berikut.
HKLM\SOFTWARE\Microsoft\AMSI\Providers
Contohnya,
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\{2E5D8A62-77F9-4F7B-A90C-2744820139B2}
Jika Anda memiliki layanan antimalware non-Microsoft yaitu Windows Protected Process Light (PPL) atau Antimalware Protected Process Light (Anti-malware PPL) yang mencoba memuat di penyedia AMSI, Anda mungkin melihat informasi berikut dalam log peristiwa Integritas Kode:
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.
Untuk melihat log peristiwa Integritas Kode, ikuti langkah-langkah berikut:
Buka Pemantau Peristiwa.
Di panel navigasi, perluas Log>>Aplikasi dan Layanan Microsoft Windows>Code Integrity, lalu pilih Operasional.
Atau jika Anda mengaktifkan audit Integritas Audit Sistem, cari ini:
- Nama Log: Keamanan
- Sumber: Microsoft Keamanan Windows
- ID Peristiwa:
5038