我正在尝试使用AmsiScanBuffer https://msdn.microsoft.com/en-us/library/windows/desktop/dn889865(v=vs.85).aspx来自托管代码(特别是 C#)的 Windows 反恶意软件服务接口的功能。当尝试调用该方法时,只要提供非零缓冲区长度,程序就会挂起调用。如果提供了 0 零的缓冲区长度,则该方法立即返回 HResult E_INVALIDARG。 AMSI 公开的其他方法按预期工作,因此我希望我相信此函数的 dllimport 很接近,但可能不完全正确。除了此处介绍的数组复制方法之外,我还尝试固定数组,并且行为是相同的。
C原型
HRESULT WINAPI AmsiScanBuffer(
_In_ HAMSICONTEXT amsiContext,
_In_ PVOID buffer,
_In_ ULONG length,
_In_ LPCWSTR contentName,
_In_opt_ HAMSISESSION session,
_Out_ AMSI_RESULT *result
);
托管代码
[DllImport("Amsi.dll", EntryPoint = "AmsiScanBuffer", CallingConvention = CallingConvention.StdCall)]
public static extern int ScanBuffer(IntPtr amsiContext, IntPtr ptr, ulong length, string contentName, IntPtr session, out int result);
var virus = "X5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*";
var bytes = Encoding.UTF8.GetBytes(virus);
int sizet = Marshal.SizeOf(typeof(byte)) * bytes.Length;
var ptr = Marshal.AllocHGlobal(sizet);
try
{
Marshal.Copy(bytes, 0, ptr, bytes.Length);
int hr = Amsi.ScanBuffer(context, ptr, (ulong)sizet, "Unknown Data", session, out result);
}
finally
{
Marshal.FreeHGlobal(ptr);
}