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
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)
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.
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. –
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
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.
Sí, esta es la respuesta también. –
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.
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. –
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
- 1. ASLR y DEP en Delphi, ¿cómo decirlo?
- 2. ¿Mi programa C++ debería ser compatible con IA64 o solo con x64?
- 3. ¿Cómo puedo hacer que enlace mi gran programa?
- 4. Mi IE no es compatible con "document.getElementById()"!
- 5. ¿Cómo debo hacer que mi código VBA sea compatible con Windows de 64 bits?
- 6. ¿Cómo puedo hacer que mi archivo VSIX sea compatible con VS11 y VS2010?
- 7. Cómo hacer que javascript sea compatible con shebang (#!)?
- 8. Cómo forzar Lein DEP para re-fetch tarros locales/libs
- 9. ¿Debería mi página web compatible con Outdoted IE6 aún?
- 10. Usando "desde __future__ división de importación" en mi programa, pero no está cargado con mi programa
- 11. ¿Cómo puedo hacer que mi aplicación web iPhone 5 sea compatible?
- 12. ¿Por qué mi IE9 no es compatible con lienzo?
- 13. ¿Cómo evito que Vista mate mi programa con excepciones?
- 14. agregando mi programa para hacer clic con el botón derecho en el menú
- 15. ¿Cómo estructurar mi programa Perl CGI?
- 16. ¿C99 es compatible con C89?
- 17. ¿Mi programa está completo?
- 18. ¿Cómo importo jar a mi programa java?
- 19. C++: Haciendo que mi proyecto sea compatible con unicode
- 20. ¿Cómo puedo acelerar mi programa Perl?
- 21. ¿Por qué mi programa C++ Builder es mucho más pequeño que mi programa Delphi?
- 22. cmake: Cómo hacer un script para copiar los archivos de datos que acompañan a mi programa
- 23. Hacer mi propia API con oauth
- 24. Mejorando mi primer programa Clojure
- 25. Cómo hacer que mi programa sea un proceso en segundo plano
- 26. Cómo hacer que mi solicitud se considerará como un programa de comunicación en Windows
- 27. Python ¿IDLE compatible con multihilo?
- 28. ¿Cómo obtener la clase de escritorio compatible con Linux?
- 29. Cómo saber si OpenMP funciona en mi programa C++
- 30. ¿Qué puedo hacer con mi documentación XML?
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. –
Muy bien, esta fue la respuesta. –
Se agregaron comillas alrededor de la ruta, lo que impidió la ejecución de VS2010 – Ulterior