¿Cómo puedo evitar que mi código sea robado?


¿Qué sucede exactamente cuando lanzo un. NET exe? Sé que C# está compilado en código IL y creo que el archivo exe generado es solo un lanzador que inicia el tiempo de ejecución y le pasa el código IL. ¿Pero cómo? ¿Y qué tan complejo es el proceso?

El código IL está incrustado en el exe. Creo que se puede ejecutar desde la memoria sin escribirlo en el disco, mientras que los exe ordinarios no lo son (ok, sí, pero es muy complicado).

Mi objetivo final es extraer el código IL y escribir el mío launcher encriptado para evitar que scriptkiddies abra mi código en Reflector y simplemente robe todas mis clases fácilmente. Bueno, no puedo evitar la ingeniería inversa completamente. Si son capaces de inspeccionar la memoria y atrapar el momento en que estoy pasando el IL puro al tiempo de ejecución, entonces no importará si es un. net exe o no, ¿verdad? Sé que hay varias herramientas ofuscadoras, pero no quiero estropear el código IL en sí.

EDITAR: así que parece que no vale la pena probar lo que quería. Ellos crack Por cierto... Así que buscaré una herramienta de ofuscación. Y sí, mis amigos también dijeron que es suficiente renombrar todos los símbolos a un nombre sin sentido. Y la ingeniería inversa no será tan fácil después de todo.

Author: Brian Leahy, 2010-02-26

7 answers

Si usted insiste absolutamente en cifrar su ensamblado, probablemente la mejor manera de hacerlo es poner su código de programa en ensamblados de bibliotecas de clases y cifrarlos. A continuación, escribiría un pequeño ejecutable stub que descifra los ensamblados en memoria y los ejecuta.

Esta es una idea extremadamente mala por dos razones:

  1. Vas a tener que incluir la clave de cifrado en tu stub. Si un hacker 1337 puede usar significativamente sus ensamblajes reflejados, puede fácilmente robar la clave de cifrado y descifrado por sí mismo. (Esto es básicamente el Agujero analógico )
  2. A nadie le importa tu código 1337. Lo siento, pero eso es amor duro. Nadie más piensa que el código de alguien es casi tan interesante como el autor.
 37
Author: Kennet Belenky,
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-02-26 00:05:44

Un "secreto" que compartes con miles de personas no es un secreto. Recuerde, sus atacantes solo tienen que romper su trivial-a-romper-porque-la-clave-está-allí-correcto-esquema de "cifrado" exactamente una vez.

Si su código es tan valioso que debe mantenerse en secreto, entonces manténgalo en secreto. Deje el código solo en sus propios servidores; escriba su software como un servicio web. A continuación, asegure el servidor.

 25
Author: Eric Lippert,
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-02-26 05:19:56

El archivo exe generado es solo un lanzador que inicia el tiempo de ejecución y le pasa el código IL.

No exactamente. Hay diferentes maneras de configurar su programa, pero normalmente el código IL se compila a código máquina nativo que se ejecuta en proceso con el tiempo de ejecución.

En cuanto a los niños, te estás engañando a ti mismo si crees que puedes venderles a ellos o a cualquiera que use lo que redistribuyen. Si no pueden desbloquear tu aplicación, seguirán adelante y encontrarán una que puedan o preséntate. Representan exactamente 0 0 en ventas potenciales; tiene poco sentido gastar demasiado esfuerzo tratando de frustrarlos porque no habría retorno de su inversión. Un ofuscador básico podría estar bien, pero no vaya mucho más allá de eso.

Siendo realistas, la mayoría de los desarrolladores se enfrentan a un desafío mucho mayor de la oscuridad que de la piratería. Cualquier cosa que hagas que te impida correr la voz sobre tu producto te lastima más que los piratas. Esto incluye hacer que las personas paga dinero para conseguirlo. La mayoría de las veces, un mejor enfoque es tener una versión gratuita de su aplicación que los niños ni siquiera necesitan desbloquear; algo que ya funciona para ellos lo suficientemente bien como para descifrar su aplicación sería una pérdida de tiempo, y no solo una prueba de tiempo o función limitada. Que ellos y tantos otros como sea posible lo difundan a lo largo y ancho.

Ahora sé que eventualmente necesitas algunos clientes que paguen. La clave es ahora utilizar toda la atención que recibe de la libre producto para aumentar o promover algo más que es más rentable. Una opción aquí es también tener una versión premium con características adicionales dirigidas en gran medida a un público empresarial; cosas como hacer que sea fácil de implementar en toda una red y administrar de esa manera. Las empresas tienen bolsillos más profundos y es más probable que paguen sus tarifas de licencia. Su versión gratuita sirve para promocionar su producto y darle legitimidad a sus clientes comerciales.

Por supuesto, hay otros modelos como bueno, pero no importa lo que hagas, vale la pena recordar que la oscuridad es el mayor desafío y que las copias pirateadas de su software nunca se traducirán en ventas. En última instancia (y por supuesto, esto depende de su ejecución) usted será capaz de ganar más dinero con un modelo de negocio que se aprovecha de esos puntos que va a tratar de luchar contra ellos.

 19
Author: Joel Coehoorn,
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-02-26 05:22:30

"...evitar scriptkiddies para abrir mi código en el reflector y sólo robar todo mis clases fácilmente."

Desafortunadamente, independientemente de cómo oscurezca el lanzamiento, es cuestión de media docena de comandos en un depurador volcar un ensamblado en ejecución en un archivo de la elección del usuario. Por lo tanto, incluso si puede iniciar su aplicación como Brian sugirió, no es difícil obtener los componentes de esa aplicación en Reflector una vez que se está ejecutando (puedo publicar una muestra de WinDbg si alguien lo encontraría interesante).

Las herramientas de ofuscación se crean a partir de una gran cantidad de experiencia técnica, y a menudo están diseñadas para dificultar que los depuradores se adhieran de manera confiable a un proceso o para extraer información de él. Como dijo Brian: No estoy seguro de por qué estás decidido a preservar la IL y, si quieres una protección significativa de los niños del guion, eso es algo que puede que tengas que cambiar de opinión.

 6
Author: Dan Puzey,
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-02-25 23:47:03

"Copiaron todo lo que pudieron seguir, pero no pudieron copiar mi mente, así que los dejé sudando y robando un año y medio atrás."Ki R. Kipling

 6
Author: r. kipling,
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-04-19 23:49:37

Personalmente creo que la ofuscación es el camino a seguir. Es simple y puede ser efectivo, especialmente si todo su código está dentro de un exe (no estoy seguro de cuál es la preocupación con "estropear el IL").

Sin embargo, si siente que eso no funcionará para usted, tal vez pueda cifrar su exe e incrustarlo como un recurso dentro de su lanzador. La forma más sencilla de manejarlo sería descifrar el recurso exe y escribirlo demasiado archivo y ejecutarlo. Una vez que el exe ha completado la ejecución, borra el archivo. También es posible que pueda ejecutarlo a través de las funciones de emisión. No tengo idea de cómo funcionaría esto, pero aquí hay un artículo para comenzar - Usando Reflection Emit para Almacenar en Caché Ensamblados.NET.

Por supuesto, su clave de descifrado probablemente tendría que ser incrustado en el exe, así que alguien realmente determinado será capaz de descifrar su asamblea de todos modos. Esta es la razón por la ofuscación es probablemente el mejor enfoque.

 3
Author: Brian,
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-02-25 23:21:27

Copiando mi respuesta de esta pregunta (que no es exactamente duplicada, pero se puede responder con la misma respuesta, por lo tanto CW):

Un EXE de Windows contiene varias "partes". Simplificado, el Código.net (=MSIL) es solo una Parte del EXE, y también hay una Parte nativa "real" de Windows dentro del EXE que sirve como una especie de lanzador para. net Framework que luego ejecuta el MSIL.

Mono simplemente tomará el MSIL y lo ejecutará, ignorando las ventanas nativas Cosas del lanzador.

De nuevo, este es un resumen simplificado.

Edit: Me temo que mi comprensión de los detalles depp profundos no es lo suficientemente bueno para realmente mucho detalle (sé aproximadamente lo que es un encabezado PE, pero no realmente los detalles), pero encontré estos enlaces útiles:

Estructura del conjunto NETO-Parte II

. NET Foundations -. NET assembly structure

Apéndice: Si realmente quieres ir más profundo, coge una copia en Depuración avanzada de.net. El primer capítulo explica exactamente cómo .net Ensamblado se carga antes y después de Windows XP (desde XP, el Windows Loader es .net consciente de que cambia radicalmente cómo .net Aplicaciones se inician)

 2
Author: Michael Stum,
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
2017-05-23 12:01:45