Exploración de Windows Defender Antivirus desde C#
dllimport windows-defender (3)
He estado buscando problemas y he leído esto como una de las posibles causas:
"A menudo se ven diferencias entre las compilaciones de depuración y de versión porque las compilaciones de depuración contienen metadatos adicionales para ayudar en la depuración".
También debe verificar esta respuesta en "¿Es posible detectar una excepción de infracción de acceso en .NET?" y los detalles adicionales que se explican en el artículo Manejo de excepciones de estado corrupto en la revista MSDN
...
Entonces, de acuerdo con las respuestas y los artículos que probaría:
Primero verifique las firmas y las interoperaciones COM para todos los códigos no administrados para verificar que sean correctos.
2. Establezca el depurador de Visual Studio para omitir esta excepción: menú Herramientas -> Opciones -> Depuración -> General -> Desmarque esta opción "Suprimir optimización JIT en la carga del módulo"
3er intento: atrapa la excepción
(nota: si está utilizando .Net 4, en App.config, dentro de la etiqueta modifique el tiempo de ejecución para incluir legacyCorruptedStateExceptionsPolicy enabled = "true" como:
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>
)
Además, here , he encontrado que algunas versiones de .net framework (el último comentario a 4.6.1 en uno de los comentarios de la respuesta) tiene un error relacionado con esta excepción y la solución, en el pasado, ha estado actualizando el framework . Además, en una de las respuestas que he leído:
Hola, hay dos posibles razones.
1.Tenemos código no administrado y lo estamos llamando desde código administrado. que está impidiendo ejecutar este código. Intenta ejecutar estos comandos y reinicia tu PC.
cmd: netsh winsock reset
abra cmd.exe y ejecute el comando "netsh winsock reset catalog" 2.Anti-virus está considerando el código no administrado como dañino y está restringiendo la ejecución de este código, desactive el antivirus y luego verifique
Me gustaría saber si alguno de estos enfoques le ayuda a resolver su problema.
Realmente espero que esto ayude.
KR,
Juan
Estamos escribiendo un código para realizar un análisis bajo demanda de un archivo desde C # utilizando las API de Windows Defender.
[DllImport(@"C:/Program Files/Windows Defender/MpClient.dll")]
public static extern int WDStatus(out bool pfEnabled);
[DllImport(@"C:/Program Files/Windows Defender/MpClient.dll")]
public static extern int MpManagerOpen(uint dwReserved, out IntPtr phMpHandle);
[DllImport(@"C:/Program Files/Windows Defender/MpClient.dll")]
public static extern int MpScanStart(IntPtr hMpHandle, uint ScanType, uint dwScanOptions, IntPtr pScanResources, IntPtr pCallbackInfo, out IntPtr phScanHandle);
[DllImport(@"C:/Program Files/Windows Defender/MpClient.dll")]
public static extern int MpHandleClose(IntPtr hMpHandle);
private void DoDefenderScan_Click(object sender, EventArgs e)
{
try
{
bool pfEnabled;
int result = WDStatus(out pfEnabled); //Returns the defender status - It''s working properly.
ErrorHandler.ThrowOnFailure(result, VSConstants.S_OK);
IntPtr phMpHandle;
uint dwReserved = 0;
IntPtr phScanHandle;
MpManagerOpen(dwReserved, out phMpHandle); //Opens Defender and returns the handle in phMpHandle.
tagMPRESOURCE_INFO mpResourceInfo = new tagMPRESOURCE_INFO();
mpResourceInfo.Path = "eicar.com";
mpResourceInfo.Scheme = "file";
mpResourceInfo.Class = IntPtr.Zero;
tagMPRESOURCE_INFO[] pResourceList = new tagMPRESOURCE_INFO[1];
pResourceList.SetValue(mpResourceInfo, 0);
tagMPSCAN_RESOURCES scanResource = new tagMPSCAN_RESOURCES();
scanResource.dwResourceCount = 1;
scanResource.pResourceList = pResourceList;
IntPtr resourcePointer = StructToPtr(scanResource);
result = MpScanStart(phMpHandle, 3, 0, resourcePointer, IntPtr.Zero, out phScanHandle); **//Getting Access violation exception here**.
MpHandleClose(phMpHandle);
MpHandleClose(phScanHandle);
Marshal.FreeHGlobal(resourcePointer);
}
catch (Exception)
{ }
}
Y la estructura se define aquí.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct tagMPSCAN_RESOURCES
{
public uint dwResourceCount;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)]
public tagMPRESOURCE_INFO[] pResourceList;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct tagMPRESOURCE_INFO
{
[MarshalAs(UnmanagedType.LPWStr)]
public String Scheme;
[MarshalAs(UnmanagedType.LPWStr)]
public String Path;
public IntPtr Class;
}
public class MPRESOURCE_CLASS
{
public uint Value;
}
private static IntPtr StructToPtr(object obj)
{
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj));
Marshal.StructureToPtr(obj, ptr, false);
return ptr;
}
El código está escrito en base a la documentación disponible en
https://msdn.microsoft.com/en-us/library/vs/alm/dn920144(v=vs.85).aspx
Estamos recibiendo esta excepción
Intento de leer o escribir en la memoria protegida. Esto es a menudo una indicación de que otra memoria está dañada.
a
result = MpScanStart(phMpHandle, 3, 0, resourcePointer, IntPtr.Zero, out phScanHandle); **//Getting Access violation exception here**.
¿Cual podría ser el problema? ¿Es correcto el formato de la estructura?
PS: no hay información sobre MPRESOURCE_CLASS disponible en msdn.
No estoy seguro, si esta línea de código es correcta.
mpResourceInfo.Class = IntPtr.Zero;
Actualizar:
El escaneo rápido funciona bien con este código:
result = MpScanStart(phMpHandle, 1, 0, IntPtr.Zero, IntPtr.Zero, out phScanHandle);
Los registros de Defender en el visor de eventos [Registros de aplicaciones y servicios-Defensor de Microsoft-Windows / Operacional] como
El escaneo de Windows Defender ha comenzado.
ID de escaneo: {CDC2AC0D-7648-4313-851C-4D8B7B5EB5CD}
Tipo de escaneo: AntiSpyware
Parámetros de escaneo: escaneo rápido
No pude identificar el problema aquí. Así que terminé con la Interfaz de análisis antimalware (AMSI) disponible a partir de Windows 10.
He escrito un código C # de muestra midhunlalg.blogspot.in/2016/12/… .
Una cosa que encontré es que AMSI requiere que Windows Defender / cualquier antivirus esté activado para verificar el archivo pasado a la API. Pero si se activa una exploración a través de MpClient.dll
se activará una exploración de defensor incluso si la defensa está desactivada.
Asegúrate también de que tu proyecto x64
plataforma x64
.
public enum AMSI_RESULT
{
AMSI_RESULT_CLEAN = 0,
AMSI_RESULT_NOT_DETECTED = 1,
AMSI_RESULT_DETECTED = 32768
}
[DllImport("Amsi.dll", EntryPoint = "AmsiInitialize", CallingConvention = CallingConvention.StdCall)]
public static extern int AmsiInitialize([MarshalAs(UnmanagedType.LPWStr)]string appName, out IntPtr amsiContext);
[DllImport("Amsi.dll", EntryPoint = "AmsiUninitialize", CallingConvention = CallingConvention.StdCall)]
public static extern void AmsiUninitialize(IntPtr amsiContext);
[DllImport("Amsi.dll", EntryPoint = "AmsiOpenSession", CallingConvention = CallingConvention.StdCall)]
public static extern int AmsiOpenSession(IntPtr amsiContext, out IntPtr session);
[DllImport("Amsi.dll", EntryPoint = "AmsiCloseSession", CallingConvention = CallingConvention.StdCall)]
public static extern void AmsiCloseSession(IntPtr amsiContext, IntPtr session);
[DllImport("Amsi.dll", EntryPoint = "AmsiScanString", CallingConvention = CallingConvention.StdCall)]
public static extern int AmsiScanString(IntPtr amsiContext, [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)]string @string, [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)]string contentName, IntPtr session, out AMSI_RESULT result);
[DllImport("Amsi.dll", EntryPoint = "AmsiScanBuffer", CallingConvention = CallingConvention.StdCall)]
public static extern int AmsiScanBuffer(IntPtr amsiContext, [In] [MarshalAs(UnmanagedType.LPArray)] byte[] buffer, ulong length, [In()] [MarshalAs(UnmanagedType.LPWStr)] string contentName, IntPtr session, out AMSI_RESULT result);
//This method apparently exists on MSDN but not in AMSI.dll (version 4.9.10586.0)
[DllImport("Amsi.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern bool AmsiResultIsMalware(AMSI_RESULT result);
private void CallAntimalwareScanInterface()
{
IntPtr amsiContext;
IntPtr session;
AMSI_RESULT result = 0;
int returnValue;
returnValue = AmsiInitialize("VirusScanAPI", out amsiContext); //appName is the name of the application consuming the Amsi.dll. Here my project name is VirusScanAPI.
returnValue = AmsiOpenSession(amsiContext, out session);
returnValue = AmsiScanString(amsiContext, @"X5O!P%@AP[4/PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*", "EICAR", session, out result); //I''ve used EICAR test string.
AmsiCloseSession(amsiContext, session);
AmsiUninitialize(amsiContext);
}
Puede usar la Interfaz de exploración antimalware para verificar si el archivo contiene malware.
La Interfaz de análisis antimalware (AMSI) es un estándar de interfaz genérico que permite que las aplicaciones y servicios se integren con cualquier producto antimalware presente en una máquina. Proporciona protección contra malware mejorada para los usuarios y sus datos, aplicaciones y cargas de trabajo.
Está disponible a partir de Windows 10.