2008-12-08 19 views
8

Tengo un proyecto de Windows forms (.net 3.0) que no se ejecutará en la computadora vista de mi cliente debido a un error DEP. Se ejecuta en mi máquina de vista, y en una versión limpia de vista sp1 en una máquina virtual. Tengo problemas para encontrar maneras de hacer que mi programa DEP, Data Execution Prevention sea compatible. Realmente no puedo hacer nada con las máquinas de los usuarios finales, solo tiene que ejecutarse. ¿Hay alguna forma de salir de esta última pesadilla de desarrollo de vista? Mi programa utiliza controles devexpress, sql express y .net, es decir, el control del navegador web. Ya he saltado el control ie, pero fue en vano. Tengo otro programa que usa devexpress y sql express en esa misma máquina y funcionan bien. No puedo depurar esto en la computadora del usuario.¿Cómo hacer mi programa compatible con DEP?

Respuesta

17

DEP funciona en uno de dos modos:

1) DEP hardware es para CPUs que pueden marcar las páginas de memoria como no ejecutables. Esto ayuda a prevenir ciertos exploits, como desbordamientos de búfer.

2) El software DEP es para CPU que no tienen soporte de hardware DEP. No impide la ejecución del código en las páginas de datos, sino que detiene la sobreescritura SEH (otro tipo de ataque).

En Windows XP con CPU que lo admitan, el hardware DEP está habilitado de forma predeterminada solo para ciertos binarios del sistema de Windows, y también para los programas que eligen "habilitar".

En Vista con las CPU que lo soportan, el hardware DEP está habilitado por defecto para casi todos los procesos. Esto ocasionalmente puede ser problemático, generalmente para programas y controladores más antiguos, y para ISV que no han hecho ninguna prueba de Vista.

Así que sospecho que el primer paso es descubrir si se trata de software o hardware DEP. Además, ¿está utilizando C#/VB o Managed C++? ¿Y está usando algún código o componente nativo? Si su aplicación utiliza un componente nativo o un control ActiveX que se creó utilizando el antiguo marco ATL, entonces es muy posible que su aplicación falle con el hardware DEP.

Desde .NET Framework 2.0 SP1, creo que el compilador C# emite código administrado que es compatible con DEP. Pero si su aplicación genera excepciones DEP, puede intentar borrar el indicador IMAGE_DLLCHARACTERISTICS_NX_COMPAT para su ejecutable. Para ello se utiliza el conjunto de herramientas de Editbin.exe VC, así:

editbin.exe /NXCOMPAT:NO <your binary> 

Si está utilizando Visual Studio, puede agregar un paso posterior a la generación de proyectos de su ejecutable. Tendrá que configurar el entorno para que las dependencias de EDITBIN se puedan resolver.Cuando estoy usando código nativo como parte de mi aplicación, el paso posterior a la generación siguiente aspecto:

call $(DevEnvDir)..\tools\vsvars32.bat 
editbin.exe /NXCOMPAT:NO $(TargetPath) 
+1

Tuve dificultades y usé específicamente (editbin.exe no está en las herramientas, así que lo copié): llamada "C: \ Archivos de programa \ Microsoft Visual Studio 9.0 \ Common7 \ Tools \ vsvars32.bat" editbin.exe/NXCOMPAT : NO "$ (TargetPath)" TY para una respuesta increíble, le responderemos sobre los resultados de los clientes. –

+0

Muy bien, esta fue la respuesta. –

+0

Se agregaron comillas alrededor de la ruta, lo que impidió la ejecución de VS2010 – Ulterior

0

Comience por averiguar dónde y cómo está fallando su programa. ¿Puedes replicar el problema en tu sistema? Con habilitar DEP para la aplicación en su sistema? Cuando puede replicar el problema y obtener el error (violación de acceso), puede buscar arreglar su programa.

Ver el MSDN article for information on DEP.

+0

Es una situación completamente opaca. No obtengo detalles de vista, no tengo depurador en el sistema. El programa funciona bien en mi máquina dev vista y en una máquina virtual de vista limpia. –

5

Las versiones anteriores de ATL no son DEP, por lo que si usa cualquier control ActiveX que se construya utilizando ATL y se creó con esa versión de ATL (versión 7.1 y posterior, creo), obtendrá errores DEP .

Como último recurso, de hecho puede deshabilitar DEP para el proceso llamando a una función API: SetProcessDEPPolicy.

Más información sobre SetProcessDEPPolicy

5

Los compiladores que se entregan con .NET 2.0 SP1 a su vez en la bandera NXCOMPAT en la cabecera del archivo ejecutable. Puede desactivar ese indicador en un paso posterior a la compilación ejecutando EditBin.exe con la opción/NXCOMPAT: NO.

+1

Sí, esta es la respuesta también. –

3

FWIW, vale la pena mencionar explícitamente que, en muchos casos, las aplicaciones no son "incompatibles con DEP", sino que estaban a punto de bloquearse de todos modos y DEP "se lanzó para salvar el día". Muy a menudo, una vez que deshabilitas DEP, encontrarás que estás golpeando un AV "ordinario".

Si su proyecto está escrito únicamente en .NET 3.0, este es casi seguro el caso, porque .NET no hace ninguna de las cosas "disparatadas" que desencadenan DEP (por ejemplo, función thunking, etc.).

Para depurar, instale un depurador o habilite Watson para generar un archivo .DMP, luego tome ese archivo .DMP en la máquina del desarrollador y descubra qué salió mal.

+0

El problema es con un control activex anterior que tengo que usar con mi programa. Controla un medidor y el objetivo principal de la aplicación es ejecutar el medidor. No he podido lograr que el proveedor reconstruya la aplicación con las bibliotecas atl más nuevas. La aplicación también debe ejecutarse en todas las máquinas de los usuarios finales, y estoy atacando dep bugs en algunos de ellos. No tengo control o administración de las máquinas del usuario directamente. –

+0

Ah. Bueno, una opción sería usar SetProcessDEPPolicy para optar por DEP en lugar de utilizar la opción del enlazador NXCOMPAT. Cuando usa SetProcessDEPPolicy para activar DEP, deja ATL Thunk Emulation habilitada, a diferencia de la opción del enlazador. Así es como IE8 enciende DEP para seguir siendo compatible con los antiguos controles ATL. – EricLaw

Cuestiones relacionadas