¿Compilar C# a Nativo?


Creo que estoy algo confundido acerca de compilar.NET byte-code a código nativo, o tal vez estoy confundido acerca del resultado final. Así que por favor tengan paciencia conmigo mientras trato de ordenar lo que creo que entiendo para que puedan ayudarme a averiguar lo que me estoy perdiendo.

Lo que me gustaría hacer es compilar mi aplicación escrita en C# a código nativo regular como lo haría si la hubiera escrito en C. Mi razonamiento no tiene nada que ver con el rendimiento, sino con algún grado de protección. Entiendo que mi objetivo final no es imposible (o incluso realmente tan difícil) de eludir, pero simplemente siento que revertir el ensamblaje x86 es más difícil que revertir lo que me da el Reflector.

Ahora mismo si tiro mi aplicación C# en Reflector, básicamente recupero mi código fuente. Por lo general, cuando lanzo mis aplicaciones C/C++ no administradas a IDAPro y uso el descompilador HexRays, no obtengo el mismo grado de descompilación y tengo que recurrir a vadear desmontaje x86 para entender el flujo lógico. Tengo entendido que esta gran descompilación proviene de Reflector debido a que la aplicación está en MSIL en lugar del código nativo más conciso que HexRays intenta descompilar.

No me preocupa que la máquina cliente todavía necesite los tiempos de ejecución de.NET, no estoy tratando de eludir nada de eso. Me gustaría ejecutar programas de ofuscación de software normales como upx en mi programa, y hacerlo como un binario.NET falla.

It era mi entendimiento de esta pregunta relacionada que ngen hace lo que quiero. He intentado usar ngen. Pero después de copiar el archivo de salida del directorio C:\Windows\assemblies\...\applicationName.ni.exe a algún lugar puedo hacer doble clic, e intentar ejecutarlo produce un error sobre que no es "una aplicación Win32 válida". Además, cuando arrojo el applicationName.ni.exe en el reflector, obtengo la misma salida que hice de solo el applicationName.exe. Dado que applicationName.ni.exe se supone que es código nativo, esperaba que el Reflector fallara, pero no lo hizo. de la forma en que se supone que debo hacer esto, ¿por qué Reflector todavía me dio una gran descompilación?

Entonces, solo para resumir mi pregunta principal de nuevo: ¿Cómo puedo compilar mi programa. NET en un binario nativo que Reflector no descompile tan fácilmente? ¿O cuáles son algunas de las mejores prácticas para proteger un producto escrito en un lenguaje. NET de los ingenieros reversos novatos?

Si necesito una herramienta diferente, preferiría algo gratis y no algo como Codewall .

Gracias!

ACTUALIZACIÓN: Entiendo que lo que estoy buscando podría limitar algunas de las características del lenguaje como la Reflexión, pero creo que estoy bien con eso. Ninguno de mi código hace llamadas explícitas Assembly.Load ni nada por el estilo. Pero, ¿no podrían ser reemplazados por llamadas GetProcAddress/LoadLibrary de todos modos?

Author: Community, 2009-12-17

10 answers

Acabo de validado .Net Nativo en VS2015 & Windows 8.1 (cuando se configura correctamente, examine .proj para validar) y construir para una arquitectura en particular (puede ser exagerado, no ha validado), producirá un archivo nativo que le dará el código "más difícil de aplicar ingeniería inversa" que está buscando y que para mí no estaba habilitado para leer .dll vía dotPeek(descompilador.Net gratuito de JetBrains).

 19
Author: Sivx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-15 13:54:48

Así no es como ngen.exe funciona. Simplemente ejecuta el compilador JIT por adelantado para generar el .ni.exe o .ni.dll módulo. Ese archivo binario no contiene metadatos, solo el código máquina generado desde el IL para los cuerpos de los métodos. El CLR todavía debe encontrar el ensamblaje original. Solo entonces puede determinar que hay una imagen ngen-ed disponible para que pueda usar el código máquina de ella en lugar de generarla desde el IL del ensamblado.

Ngen.exe acelera el tiempo de inicio cálido de tu aplicación, eso es todo.

Mi consejo habitual para cualquiera que pueda estar interesado en desmontar mis ensamblajes es que los señale a sourceforge.net. Tiene terabytes de código fuente, escritos y mantenidos por programadores que suelen ser mejores que yo. A veces incluso con buenos comentarios. Si su ofuscador no funciona bien, busque uno mejor. Hay muchos.

 28
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-17 13:21:16

Ayer, en Build 2014, Microsoft anunció . NET Native. De acuerdo con el FAQ ,"... Inicialmente, nos estamos centrando en las aplicaciones de la tienda Windows con. NET nativo. A largo plazo, continuaremos mejorando la compilación nativa para todas las aplicaciones.NET."

 17
Author: Ðаn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-03 13:31:46

Si desea proteger su código, un ofuscador es el enfoque típico. Dotfuscator ha estado en una carrera armamentista con reflector durante un tiempo y lo usamos en nuestros productos. En la práctica, sin embargo, un humano experto puede leer fácilmente código ofuscado.

Compilar a código nativo frustra el propósito de tener un lenguaje administrado. El principal beneficio es permitir que el tiempo de ejecución de destino JIT el IL en algo que es óptimamente aceptable para la CPU de destino. Si quieres lo contrario, usaría algo como la opción ahead-of-time en mono.

 16
Author: plinth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-17 13:09:21

Spoon (anteriormente Xenocode) tiene un producto que podría ajustarse a sus necesidades. Lo usamos para una interfaz de usuario de instalador basada en WPF, por lo que no tenemos que arrancar.net para cargar el programa de instalación en sí.

 8
Author: dkackman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-04 16:37:47

NGEN añade código nativo, pero no elimina el MSIL. Por lo tanto, cualquier herramienta que funcione en el MSIL puede seguir funcionando. También necesita esto para la reflexión, algo que sería muy difícil para un verdadero compilador nativo.

 7
Author: MSalters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-17 13:10:50

Este es un ofuscador gratuito, que es muy bueno: eazfuscator

 5
Author: chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-08 12:01:53

Podría dar un paso atrás y preguntar por qué está buscando este tipo de protección. No estoy tratando de argumentar que no necesitas la protección, pero creo que vale la pena entender la motivación.

Por ejemplo, si desea protección porque tiene un algoritmo en el que sería devastador para la seguridad si alguien ingeniería inversa, entonces usted puede ser que necesite para considerar un enfoque diferente. Significa que hay un defecto en el algoritmo y ninguna cantidad de ofuscación o la compilación nativa te ayudará allí.

Si es una cuestión de IP, entonces creo que la ofuscación es probablemente su mejor enfoque aquí. Es como poner una cerradura en tu puerta. Alguien puede romper la cerradura y entrar, pero lo están haciendo intencionalmente en lugar de simplemente entrar por la puerta.

 4
Author: Brian Genisio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-17 13:43:19

Esto finalmente es posible usando el compilador nativo. NET de Microsoft

Compila automáticamente la versión de lanzamiento de las aplicaciones que están escritas en código administrado (C# o Visual Basic) y que apuntan a.NET Framework y Windows 10 a código nativo.

..

•Sus aplicaciones proporcionarán el rendimiento superior del código nativo.

•Puede continuar programando en C# o Visual Basic.

* Puede seguir aprovechando el recursos proporcionados por. NET Framework, incluida su biblioteca de clases, administración automática de memoria y recolección de elementos no utilizados, y manejo de excepciones.

Para los usuarios de sus aplicaciones,. NET Native ofrece estas ventajas:

* Tiempos de ejecución rápidos

* Tiempos de inicio consistentemente rápidos

* Bajos costos de implementación y actualización

* Uso optimizado de la memoria de la aplicación

Pero.NET Native implica más que una compilación de código nativo. Se transforma la forma en que se crean y ejecutan las aplicaciones de.NET Framework. En particular:

•Durante la precompilación, las partes necesarias de.NET Framework se vinculan estáticamente a su aplicación. Esto permite que la aplicación se ejecute con bibliotecas locales de aplicaciones de.NET Framework y que el compilador realice análisis globales para obtener ganancias de rendimiento. Como resultado, las aplicaciones se inician constantemente más rápido incluso después de las actualizaciones de. NET Framework.

* El tiempo de ejecución nativo de. NET está optimizado para estática precompilación y por lo tanto es capaz de ofrecer un rendimiento superior. Al mismo tiempo, conserva las características principales de reflexión que los desarrolladores encuentran tan productivas.

•. NET Native utiliza el mismo back-end que el compilador de C++, que está optimizado para escenarios de precompilación estática.

Https://msdn.microsoft.com/en-us/library/dn584397 (v=vs.110). aspx

Esto solo está disponible con VS.NET 2015.

 4
Author: Amir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-29 15:32:50

Esto es posible usando el compilador IL2CPU. IL2CPU está desarrollado por las mismas personas que hacen COSMOS (C# Open Source Managed Operating System) y solo está disponible descargando cosmos. IL2CPU produce archivos ASM que se pueden compilar a través de Nasm (algunos otros ensambladores pueden funcionar, pero es mejor usar nasm). el único problema con IL2CPU es que está integrado en el Proyecto Cosmos y es bastante difícil que se ejecute por sí solo.

 3
Author: Tuomas Laakkonen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-04 15:53:27