【发布时间】:2018-01-12 18:09:48
【问题描述】:
我正在尝试从托管代码(特别是 C#)中使用 Windows 反恶意软件服务接口的 AmsiScanBuffer 函数。当尝试调用该方法时,只要提供非零缓冲区长度,程序就会挂起调用。如果提供的缓冲区长度为零,则该方法立即返回 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);
}
【问题讨论】: