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.

Pengembang 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.

Untuk kode sampel yang menunjukkan cara menggunakan AMSI dalam aplikasi COM Anda, lihat aplikasi sampel antarmuka IAmsiStream.

Pembuat produk antimalware pihak ketiga

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.

Daftarkan DLL penyedia Anda dengan AMSI

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.exeyang 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}

Masalah umum

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:

  1. Buka Pemantau Peristiwa.

  2. 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