studio - ofuscar codigo c#
Proteger código.NET de ingeniería inversa? (30)
La ofuscación es una forma, pero no puede proteger de romper la seguridad de piratería de la aplicación. ¿Cómo me aseguro de que la aplicación no esté alterada y cómo me aseguro de que el mecanismo de registro no se pueda realizar ingeniería inversa?
También es posible convertir una aplicación de C # a código nativo, y Xenocode es demasiado costoso.
C # proporciona muchas características y es el lenguaje ideal para mi código, por lo que escribir todo el código de base nuevamente en C ++ está fuera de discusión.
Los certificados seguros se pueden eliminar fácilmente de los ensamblajes firmados en .NET.
Cómo asegurarse de que la aplicación no se ha alterado y cómo asegurarse de que el mecanismo de registro no se pueda revertir.
Ambos tienen la misma respuesta muy simple: no entregue el código objeto a partes no confiables, como (aparentemente) sus clientes. Si es factible alojar la aplicación en sus máquinas solo depende de lo que haga.
Si no es una aplicación web , tal vez pueda permitir el inicio de sesión SSH con el reenvío de X a un servidor de aplicaciones (o Conexión de escritorio remoto , supongo, para Windows).
Si le asigna un código de objeto a personas de tipo nerdy y piensan que su programa puede ser divertido de descifrar, se agrietará. No hay manera de evitarlo.
Si no me crees, señala una aplicación de alto perfil que no haya sido pirateada ni pirateada.
Si opta por las claves de hardware, la producción será más costosa y sus usuarios lo odiarán por ello. Es una verdadera perra arrastrarse por el piso para conectar y desconectar tus 27 dispositivos USB diferentes porque los fabricantes de software no confían en ti (me imagino).
Hay paquetes que cifrarán tu EXE y lo descifrarán cuando el usuario tenga permiso para usarlo
Por supuesto, la forma de evitarlo es descifrar la prueba "can-I-use-it" para que siempre devuelva verdadero.
Un truco desagradable podría ser usar los valores de bytes de los códigos de operación que realizan la prueba en otro lugar del programa de una manera sucia que haga que el programa se bloquee con alta probabilidad, a menos que el valor sea el correcto. Sin embargo, te vincula a una arquitectura particular :-(
¡Ofusca el código! Hay un ejemplo en el Código de C # ofuscación .
¿Realmente vale la pena? Todo mecanismo de protección puede romperse con suficiente determinación. Tenga en cuenta su mercado, el precio del producto, la cantidad de clientes, etc.
Si desea algo más confiable, siga el camino de las claves de hardware, pero eso es bastante problemático (para el usuario) y más costoso. Las soluciones de software serían probablemente una pérdida de tiempo y recursos, y lo único que le darían es la falsa sensación de "seguridad".
Pocas ideas más (ninguna es perfecta, ya que no hay una perfecta).
- AntiDuplicate
- Cambia el idioma, usa los trucos que usaron los autores de Skype
- Servidor de licencias
Y no pierda demasiado tiempo en ello, porque los crackers tienen mucha experiencia con las técnicas típicas y están a pocos pasos de usted. A menos que desee utilizar muchos recursos, probablemente cambie el lenguaje de programación (hágalo a través de Skype).
Además de comprar protección, usted (o sus desarrolladores) pueden aprender a proteger contra copia.
Estas son ideas:
Al principio, intente escribir un programa que se escriba en la consola. Ese es un problema famoso. El objetivo principal de esta tarea es practicar la escritura de código de autorreferencia.
En segundo lugar, debe desarrollar una tecnología que reescriba algún código de una manera que se base en el CIL otros métodos.
Puede escribir una máquina virtual (aún en .NET ). Y poner algo de código allí. En última instancia, la máquina virtual ejecuta otra máquina virtual que ejecuta el código. Esto es para una parte de las funciones que rara vez se llaman para no ralentizar demasiado el rendimiento.
Vuelva a escribir alguna lógica en C ++ / CLI y mezcle el código administrado con el no administrado. Esto endurecerá el desmontaje. En este caso, no olvide proporcionar también binarios x64 .
Aquí hay una idea: puede tener un servidor alojado por su empresa al que todas las instancias de su software necesitan conectarse. Simplemente hacer que se conecten y verificar que una clave de registro no es suficiente, solo eliminarán el cheque. Además de la verificación de la clave, también debe hacer que el servidor realice una tarea vital que el cliente no puede realizar por sí mismo, por lo que es imposible eliminarlo. Esto, por supuesto, probablemente significaría mucho procesamiento pesado por parte de su servidor, pero haría que su software fuera difícil de robar, y suponiendo que tenga un buen esquema de claves (verifique la propiedad, etc.), las claves también serán difíciles de procesar. robar. Probablemente esto sea más invasivo de lo que desea, ya que requerirá que los usuarios estén conectados a Internet para usar su software.
Bueno, no puede TOTALMENTE proteger su producto para que no se rompa, pero puede maximizar / mejorar los niveles de seguridad y hacer que sea un poco demasiado difícil de ser agrietado por los novatos y los crackers intermedios.
Pero tenga en cuenta que no hay nada que se pueda descifrar, solo el software en el lado del servidor está bien protegido y no se puede descifrar. De todos modos, para mejorar los niveles de seguridad en su aplicación, puede hacer algunos pasos simples para evitar que algunos "no todos" crackeen sus aplicaciones. Estos pasos harán que estas galletas se vuelvan locas y quizás desesperadas:
- Enmascarar su código fuente, obviamente esto hará que su código fuente se vea como un desastre e ilegible.
- Active varias rutinas de comprobación aleatoria dentro de su aplicación, como cada dos horas, 24 horas, un día, semana, etc. o tal vez después de cada acción que realice el usuario.
- Guarde la suma de comprobación MD5 su aplicación publicada en su servidor e implemente una rutina que pueda verificar la suma de comprobación MD5 del archivo actual con la real en su servidor y hacer que se active aleatoriamente. Si se ha modificado la suma de comprobación MD5, significa que esta copia se ha pirateado. Ahora solo puedes bloquearlo o lanzar una actualización para bloquearlo, etc.
- Intente hacer una rutina que pueda verificar si algunos de sus códigos (funciones, clases o rutinas específicas) se han modificado, alterado o incluso eliminado. Lo llamo (verificación de integridad de código).
- Utilice packers desconocidos gratis para empacar su aplicación. O, si tiene el dinero, Thamida soluciones comerciales como Thamida o .NET Reactor . Esas aplicaciones se actualizan regularmente y una vez que un cracker desempaqueta su aplicación, puede obtener una nueva actualización de esas compañías y una vez que obtenga la nueva actualización, simplemente empaquete su programa y lance una nueva actualización.
- Libere actualizaciones regularmente y obligue a su cliente a descargar la última actualización.
- Finalmente haz tu aplicación muy barata. No lo hagas demasiado caro. Créame, obtendrá más clientes felices y los crackers dejarán su aplicación, porque no vale la pena dedicar tiempo a descifrar una aplicación muy barata.
Esos son solo métodos simples para evitar que los usuarios nuevos y los crackers intermedios agrieten su aplicación. Si tiene más ideas para proteger su aplicación, no dude en implementarlas. Solo hará que los crackers tengan una vida difícil, se frustrarán y eventualmente abandonarán su aplicación, porque no vale la pena dedicarles tiempo.
Por último, también debe considerar dedicar su tiempo a la codificación de aplicaciones buenas y de calidad. No pierdas el tiempo codificando capas de seguridad complicadas. Si un buen cracker quiere descifrar su aplicación, él / ella lo hará sin importar lo que haga ...
Ahora ve e implementa algunos juguetes para las galletas ...
Cualquier cosa que se ejecute en el cliente puede ser descompilada y resquebrajada. La ofuscación simplemente lo hace más difícil. No conozco tu solicitud, pero el 99% del tiempo no creo que valga la pena el esfuerzo.
Cuando se trata de .NET, si está lanzando una aplicación de Windows Forms (o cualquier aplicación donde el cliente tenga el archivo ejecutable portátil), se puede descifrar.
Si desea continuar con .NET y desea minimizar la posibilidad de que le tomen el código fuente, puede considerar implementarlo como una aplicación ASP.NET en un servidor web, en lugar de convertirlo en una aplicación de Windows Forms.
Desafortunadamente, no vas a huir de esto. Lo mejor que puedes hacer es escribir tu código en C y P/Invoke .
Hay un pequeño catch-22, alguien podría simplemente descompilar su aplicación a CIL y eliminar cualquier código de verificación / activación (por ejemplo, la llamada a su biblioteca de C). Recuerde que las aplicaciones que están escritas en C también tienen ingeniería inversa por parte de los piratas informáticos más persistentes (solo observe qué tan rápido se descifran los juegos en estos días). Nada protegerá tu aplicación.
Al final funciona como su hogar, protéjalo lo suficientemente bien como para que sea demasiado esfuerzo (el código de espagueti ayudaría aquí) y para que el agresor simplemente se mueva hacia su vecino (competencia :)). Mira a Windows Vista, debe haber 10 formas diferentes de descifrarlo.
Hay paquetes por ahí que cifrarán su archivo EXE y lo descifrarán cuando el usuario tenga permiso para usarlo, pero una vez más, eso es usar una solución genérica que sin duda se ha resquebrajado.
Los mecanismos de activación y registro están dirigidos al "Joe medio": las personas que no tienen suficiente experiencia tecnológica para evitarlo (o, para el caso, saben que pueden evitarlo). No te molestes con las galletas, tienen demasiado tiempo en sus manos.
En mi experiencia, hacer que su aplicación o biblioteca sea más difícil de descifrar perjudica a sus clientes honestos y solo retrasa ligeramente a los deshonestos. Concéntrese en hacer un gran producto de baja fricción en lugar de poner mucho esfuerzo en retrasar lo inevitable.
En términos generales, hay tres grupos de personas ahí fuera.
Quienes no compren su software y recurran a grietas, o si no encuentran ninguna, no usan su software en absoluto. No esperes ganar dinero con este grupo. Dependen de sus propias habilidades o de los crackers (que tienden a priorizar su tiempo dependiendo de su utilidad y del tamaño de su audiencia. Cuanto más útil, más pronto estará disponible una grieta).
El grupo de usuarios legítimos que comprarán (pagarán) su software, independientemente del mecanismo de protección que utilice. No haga la vida difícil para sus usuarios legítimos utilizando un mecanismo de protección elaborado, ya que en cualquier caso lo van a pagar. Un mecanismo de protección complejo puede arruinar fácilmente la experiencia del usuario y no desea que esto le suceda a este grupo. Personalmente, votaría en contra de cualquier solución de hardware, lo que aumenta el costo de su software.
Una minoría que no recurrirá a craqueo "no ético" y pagará por su software porque sus características están protegidas por un mecanismo de licencia. Probablemente no querrá hacer que sea extremadamente fácil para este grupo eludir su protección. Sin embargo, todo el esfuerzo que dedique a la protección de su software se verá recompensado, según el tamaño de este grupo de personas. Esto depende completamente del tipo de software que estés creando.
Teniendo en cuenta lo que ha dicho, si cree que hay una minoría lo suficientemente grande que puede ser obligada a comprar su software, siga adelante e implemente alguna forma de protección. Piense en cuánto dinero puede ganar con esta minoría en comparación con el tiempo que dedica a trabajar en la protección o la cantidad que gasta en una herramienta o API de protección de terceros.
Si desea implementar una solución propia, el uso de la criptografía de clave pública es una buena manera (en lugar de algoritmos simétricos) para evitar cortes fáciles. Por ejemplo, podría firmar digitalmente su licencia (número de serie o archivo de licencia). La única forma de evitar esto sería descompilar, alterar y volver a compilar el código (lo que podría hacer más difícil usando técnicas como las sugeridas en la respuesta de Simucal).
Es imposible asegurar completamente una aplicación, lo siento.
Francamente, a veces necesitamos ofuscar el código (por ejemplo, registrar clases de licencia, etc.). En este caso, tu proyecto no es gratuito. En mi opinión, deberías pagar por un buen obfucador.
Dotfuscator oculta su código y .NET Reflector muestra un error cuando intenta descompilarlo.
Hay products , que es un compilador y enlazador .NET nativo de Remotesoft que puede implementar aplicaciones sin el marco .NET. No sé qué tan bien está a la altura de sus afirmaciones.
No puedes asegurar completamente ninguna aplicación (administrada o no). Si sistemas como la Playstation y el iPad pueden dañarse, donde el proveedor incluso controla el hardware, ¿qué esperanza tiene su aplicación? Afortunadamente, realmente no quieres. En mi opinión, debe asegurar su aplicación solo lo suficiente para que alguien no pueda piratear su producto accidentalmente , y nada más.
Por ejemplo, si usa una licencia por máquina, no debería funcionar solo cuando la instale en una segunda máquina nueva. Querrá un buen mensaje de error para evitar llamadas de soporte adicionales, pero no pierda tiempo extra, por lo que es muy difícil solucionarlo y no golpear a los usuarios con eso.
Otro ejemplo es una prueba de tiempo limitado. Ni siquiera se preocupe por cosas simples como si los usuarios pueden simplemente retroceder el reloj del sistema. Alguien que hace eso sabe que está violando su licencia, y mientras un usuario sepa cuándo está en violación, usted ha hecho lo suficiente.
Debe hacer esto mucho porque a los usuarios no les importa su licencia. Las licencias son cosas inventadas que a nadie le importan hasta que lo necesitan. Nadie los lee, y realmente no deberían tener que hacerlo. Por lo tanto, la mejor manera de decirle al usuario dónde están los límites es si el comportamiento listo para usar de su aplicación cumple con la licencia. En este primer caso, eso significa que no se puede instalar o instalar en modo de versión de prueba la segunda vez. Para este último, podría significar simplemente verificar una fecha de texto sin formato en un archivo de configuración. De cualquier manera, asegúrese de manejarlo de una manera elegante, útil y respetuosa.
Entonces eso explica lo que significa hacer eso. Pero ¿por qué no ir más lejos? ¿Por qué no tapar cada pequeño agujero que puedas encontrar? La respuesta está en dos partes. Primero, si alguien cruza el umbral ético de romper conscientemente los términos de su licencia, incluso de una manera simple, también estará dispuesto a hacer algo más difícil o peligroso, como extraer su solicitud de un sitio de torrent , y hay una cierta cantidad de peligro involucrado en la ejecución de aplicaciones descargadas de fuentes no confiables. Hacerlo más difícil es solo una pequeña molestia para estos usuarios y los riesgos que causan problemas con sus clientes que pagan. Mantenerlo simple puede evitar que alguien se hunda en su aplicación y libere un crack más completo. Segundo, tienes pocos ojos disponibles para buscar defectos; Los hackers tienen muchos y tienen más práctica para encontrarlos. Solo necesitas perder un pequeño defecto, y tu aplicación tendrá la misma distribución en los sitios piratas como si no hubieras hecho nada. Tienes que estar en lo correcto todo el tiempo; Solo tienen que ser afortunados una vez. Por lo tanto, el esfuerzo requerido es muy alto y la probabilidad de éxito en cualquier medida es muy baja.
En última instancia, si alguien quiere piratear su aplicación (en lugar de solo usarla), y ese es su objetivo principal, lo harán. No hay nada que puedas hacer para detenerlos. Esta es la naturaleza del software; Una vez que los archivos que componen su producto están en la computadora de un usuario, podrán hacerlo con ellos como lo deseen. Esto es especialmente relevante en entornos administrados como Java o .NET , pero definitivamente también se aplica al código nativo. El tiempo está de su lado y, dado el tiempo suficiente, se puede romper cualquier seguridad digital.
Ya que no puede evitar que los usuarios pirateen su producto, su mejor curso de acción es involucrar a esta clase de usuarios de una manera que los utilice para su beneficio. A menudo es posible hacer que trabajen para usted en lugar de en su contra. Con eso en mente, sin importar cuál sea su aplicación, probablemente valga la pena mantener una versión gratuita que sea casi completamente funcional y no caduque. La diferencia entre incluso una etiqueta de precio de US $ 1 y gratuita es enorme, aunque solo sea por el motivo por el cual el cliente no tiene que confiarle su tarjeta de crédito. Una edición gratuita de su producto no solo eliminará de manera efectiva la distribución pirateada (¿por qué arriesgar una versión pirateada cuando puede ser legítimo por el mismo precio?), Tiene el potencial de expandir dramáticamente su audiencia.
El resultado es que puede necesitar aumentar el precio de la edición de pago, de modo que al final, en lugar de 2,000 usuarios a $ 20 cada uno, tiene 100,000 usuarios gratuitos, de los cuales 500 están dispuestos a pagar $ 99 por la edición "profesional". . Esto le permite ganar más dinero que si pasara un montón de tiempo bloqueando su producto. Más que eso, puede involucrar a estos usuarios gratuitos y aprovechar la relación de varias maneras importantes.
Uno es el apoyo. Un pesimista aprovecharía esta oportunidad para quejarse por el aumento en el costo de admitir 100,000 usuarios gratuitos, pero en su lugar sucede algo sorprendente: su producto se vuelve en gran parte autosuficiente. Ves esto todo el tiempo con grandes proyectos de código abierto que no tienen dinero para los costos de soporte. Los usuarios darán un paso adelante y lo harán realidad.
Los usuarios gratuitos generalmente tienen expectativas de soporte reducidas para empezar, y por una buena razón. Todo lo que necesita hacer es marcar la edición gratuita como solo calificable para el apoyo de la comunidad y crear un foro en línea moderado por el usuario para ese propósito. Su base de conocimientos de soporte es autogenerada, y los usuarios avanzados guiarán a aquellos que necesitan un control adicional en su nombre. Aún más importante, esto le permitirá identificar y corregir errores más rápidamente, mejorando la calidad de su producto y reduciendo los costos totales de soporte. Antes no era posible porque su base de usuarios no era lo suficientemente grande, pero cuando trata a los usuarios gratuitos como clientes, puede funcionar muy bien.
Otra es la retroalimentación. Al observar su foro, usted aprende ideas de mejora importantes que tal vez nunca haya considerado de otra manera. Esto puede permitirle, en última instancia, convertir a más de sus usuarios gratuitos en usuarios pagos y crear un producto más atractivo que atraiga a una audiencia aún mayor.
Por último, hay que tener en cuenta la comercialización. Todos estos usuarios gratuitos son ahora fanáticos en lugar de adversarios, y actuarán en consecuencia. No solo eso, sino que cuando llegue el momento de lanzar su próxima versión, todos estos usuarios habrán pasado por su canal de distribución aprobado, en lugar de algún otro mecanismo desconocido. Eso significa que para su próxima versión, usted comienza a conectarse con una audiencia más grande, muy interesada y de apoyo.
Las mejores características para reservar para la edición profesional son las herramientas destinadas a facilitar la implementación y la gestión corporativas. Un cracker no verá esto como una razón suficientemente convincente para hackearlo para su propio uso, pero para una empresa que busca comprar 300 licencias y extenderlo a toda la compañía, esto es algo que debe tener. Por supuesto, la edición profesional será pirateada de todos modos, pero una vez más: no te preocupes porque probablemente no podrías vender el producto a esos piratas sin importar lo que hayas hecho, así que no te costará ningún ingreso.
Si bien psicológicamente puede ser difícil regalar tanto su producto, espero que pueda comprender cómo es realmente la mejor manera de hacerlo. No solo eso, es el único camino a largo plazo. Sé que alguien está pensando que no quieren hacerlo de esta manera. Después de todo, han logrado vender su producto bloqueado de $ 20 por años. Pero eso es demasiado malo, porque si no lo haces de esta manera, eventualmente alguien más lo hará . Y su producto será tan bueno como el tuyo, o lo suficientemente cerca como para que puedan salirse con la suya al afirmar eso. Entonces, de repente, su precio se ve escandaloso, las ventas caen drásticamente y no hay nada más que pueda hacer. Si lo desea, puede optar por un nivel intermedio adicional, pero es poco probable que lo ayude.
No puedes evitar que la gente craque tu software.
Sin embargo, puede hacer que creen grietas que perjudiquen menos sus ventas. Los generadores de claves que pueden emitir un código de registro válido para su software son mucho peores que los parches simples que eliminan los incentivos de registro de su software. Esto se debe a que un crack solo funcionará para una versión de software y dejará de funcionar con la próxima actualización de software que lance. El generador de claves continuará trabajando hasta que cambies el algoritmo de tu clave de registro y eso es algo que no quieres hacer a menudo porque postergará a tus clientes honestos.
Por lo tanto, si está buscando un método para combatir a los generadores de claves ilegales para su software y no desea utilizar el cifrado asimétrico debido a los largos códigos de registro que esto genera, puede consultar la Verificación de clave parcial.
La verificación de clave parcial se asegura de que cada generador de clave ilegal funcione solo para una versión particular de su software. Básicamente, lo que hace es asegurarse de que cada versión de su software solo se vincule con el código para verificar ALGUNOS dígitos del código de registro. Los dígitos exactamente son aleatorios, por lo que los crackers tendrían que aplicar ingeniería inversa a muchas versiones diferentes de su software y combinar todo esto en un generador de teclas para lanzar un generador de teclas que funcione para todas las versiones de su software.
Si lanza nuevas versiones de software de forma regular, esto lleva a numerosos generadores de claves distribuidos en todo tipo de archivos de piratería de software que ya no funcionan. Los piratas potenciales de software generalmente buscan un crack o keygen para la última versión, por lo que probablemente probarán algunos de ellos y se rendirán eventualmente.
He usado la Verificación de clave parcial en mis juegos de shareware más nuevos (C ++) y ha sido muy efectivo. Antes teníamos muchos problemas con los generadores de claves con los que no podíamos luchar. Después, hubo muchas grietas y algunos generadores de claves que funcionaron solo para esa versión particular del juego, pero ningún generador de claves funcionaría con todas las versiones. Regularmente lanzamos actualizaciones menores del juego y volvemos inútiles todas las grietas existentes.
Parece que hay un marco .NET de código abierto para la verificación parcial de claves , aunque no lo he probado.
Puedo recomendar el uso de Dotfuscator .
Sí. Es verdad. El código .NET es extremadamente fácil de aplicar ingeniería inversa si el código no está ofuscado.
La ofuscación agregará una capa de molestia a las personas que intentan aplicar ingeniería inversa a su software. Dependiendo de la versión que obtenga, obtendrá diferentes niveles de protección.
Visual Studio incluye una versión de Dotfuscator . Ya que es una versión empaquetada, definitivamente no está obteniendo la ofuscación más fuerte posible. Si observa sus listas de funciones, verá exactamente lo que se está perdiendo (y exactamente lo que hará la aplicación para hacer que su código sea más seguro).
Hay un par de otros ofuscadores de .NET de código abierto o gratuitos (pero no puedo comentar sobre la calidad o los diversos métodos que utilizan):
Al final, nada es perfecto. Si alguien realmente quiere ver cómo funciona su software, lo hará.
Si Microsoft pudiera encontrar una solución, no tendremos versiones pirateadas de Windows, por lo que nada es muy seguro. Aquí hay algunas preguntas similares de y puede implementar su propia forma de protegerlas. Si está lanzando diferentes versiones, entonces puede adoptar diferentes técnicas para diferentes versiones, de modo que cuando se rompe la primera, la segunda puede hacerse cargo.
Si desea que las personas puedan ejecutar su código (y si no lo hace, entonces ¿por qué lo escribió en primer lugar?), Entonces su CPU debe poder ejecutar su código. Para poder ejecutar el código, la CPU necesita poder entenderlo .
Dado que las CPU son tontas y los humanos no lo son, esto significa que los humanos también pueden entender el código.
Solo hay una forma de asegurarse de que sus usuarios no obtengan su código: no les dé su código.
Esto se puede lograr de dos maneras: Software como servicio (SaaS), es decir, ejecuta su software en su servidor y solo permite que sus usuarios accedan a él de forma remota. Este es el modelo que utiliza , por ejemplo. Estoy bastante seguro de que no confunde su código, pero no puedes descompilarlo.
La otra forma es el modelo de dispositivo: en lugar de darles a sus usuarios su código, les da una computadora que contiene el código. Este es el modelo que utilizan las consolas de juegos, la mayoría de los teléfonos móviles y TiVo . Tenga en cuenta que esto solo funciona si "posee" la ruta de ejecución completa: necesita crear su propia CPU, su propia computadora, escribir su propio sistema operativo y su propia implementación de CLI . Entonces, y solo entonces puedes proteger tu código. (Pero tenga en cuenta que incluso el más mínimo error hará que todas sus protecciones sean inútiles. Microsoft, Apple, Sony, la industria de la música y la industria del cine pueden dar fe de ello).
O, simplemente no puede hacer nada, lo que significa que su código estará protegido automáticamente por la ley de derechos de autor.
Si está escrito en .NET y compilado en CIL , puede reflejarse. Si la seguridad es una preocupación y se debe evitar la ofuscación, entonces recomiendo escribir su aplicación usando un lenguaje no administrado, que es, por naturaleza, más difícil de aplicar ingeniería inversa.
Simplemente haga una buena aplicación y codifique un sistema de protección simple. No importa la protección que elija, se invertirá ... No pierda demasiado tiempo / dinero.
Solo para agregar una advertencia: si va a usar ofuscación, ¡compruebe que todo sigue funcionando! La ofuscación puede cambiar cosas como nombres de clases y métodos. Entonces, si usa la reflexión para llamar a ciertos métodos y / o clases (como en una arquitectura de complementos), su aplicación podría fallar después de ofuscar. También los stacktraces pueden ser inútiles para localizar errores.
Tenga en cuenta que el 99% o más de sus usuarios no estarán interesados en examinar su ejecutable para ver cómo funciona.
Dado que tan poca gente se va a molestar en intentarlo y que la mayoría de los ofuscadores pueden ser resueltos, ¿vale la pena su tiempo y esfuerzo?
Sería mejor invertir el tiempo en mejorar su producto para que más personas lo quieran usar.
Un secreto que compartes con mucha gente no es un secreto. Si tienes cosas secretas en tu código, ofuscarlas no es ninguna protección; solo tiene que ser despobinado una vez . Si tiene un secreto que no desea compartir con sus clientes, entonces no lo comparta con sus clientes . Escriba su código como un servicio web y mantenga su código súper secreto en su propio servidor, donde solo usted puede verlo.
Usted no puede
Hay pasos que puede seguir para hacerlo un poco más difícil, pero en última instancia, cualquier archivo ejecutable en la máquina local es crackable. Eventualmente, ese código debe convertirse en código de máquina nativo y todas las aplicaciones que se pueden ejecutar son vulnerables.
Lo que quieres hacer es hacer que sea lo suficientemente difícil de descifrar para que no valga la pena para la gente.
Algunas sugerencias que tengo para que pueda ayudar a proteger su aplicación:
- Ofuscar su código. Dotfuscator tiene una edición gratuita y viene con Visual Studio.
- Use una clave pública / privada o un cifrado asimétrico para generar sus licencias de productos. Esto asegura que solo usted puede generar sus códigos de licencia. Incluso si su aplicación está dañada, puede estar seguro de que no lanzarán un generador de claves para su aplicación, ya que es imposible invertir el algoritmo de generación de claves.
- Utilice un empaquetador de terceros para empaquetar su ejecutable .NET en una aplicación de envoltorio Win32 cifrada. Themida es una de las mejores. Esto evita que las personas reflejen su aplicación en .NET Reflector y hace que sea difícil descomprimir para invertir.
- Escribe tu propio empaquetador personalizado . Si los empacadores de terceros son demasiado caros, considere escribir el suyo propio. A veces, los empacadores personalizados pueden ser muy efectivos, porque no hay métodos bien publicados sobre cómo desempaquetarlos. El tutorial Cómo escribir su propio packer le da mucha información sobre cómo escribir su propio Win32 packer.
En última instancia, sin embargo, si la gente quiere que tu aplicación sea rajada, lo harán. Mire todo el software comercial que tiene una gran cantidad de recursos para proteger sus aplicaciones y, sin embargo, están descifrados antes de que las aplicaciones se publiquen al público.
Un experto en ingeniería inversa puede activar IDA-Pro y dividir su aplicación como mantequilla, sin importar lo que haga. Se puede desempacar una aplicación empaquetada y la ofuscación solo evita que se convierta en un paseo por el parque. Todo su trabajo duro con su código de licencia complejo se puede deshacer con un parche de un solo byte.
Solo debe aceptar que existe una posibilidad real de que la gente piratee su software. Hay algunas personas que nunca van a pagar por su solicitud sin importar qué, y estas son las personas por las que no tiene que preocuparse.
Sin embargo, hay muchas empresas por ahí que nunca arriesgarían una demanda y felizmente compran licencias de software y muchos usuarios de computadoras que no quieren arriesgarse, lo encuentran mal o no son lo suficientemente expertos en tecnología para piratear. Estos son sus verdaderos clientes, y debe enfocar sus esfuerzos en brindarles una buena experiencia de usuario e ignorar a la gente que está descifrando su software.
He tenido mi solicitud pirateada antes, y la tomé como una afrenta personal. ¡Aquí estaba, un desarrollador de poca monta, vertiendo mi corazón y mi alma en una aplicación y estas personas tuvieron el descaro de piratear de mí? ¡Estaban tomando dinero directamente de mi bolsillo!
Inmediatamente agregué un montón de código DRM draconiano e intenté sabotear a cualquier persona usando una copia ilegítima o agrietada. Por supuesto, debería haber estado trabajando para mejorar mi aplicación en lugar de intentar detener lo inevitable. No solo eso, sino que estaba lastimando a mis verdaderos clientes todas estas protecciones adicionales que estaba poniendo.
Después de una larga batalla, me di cuenta de que estaba luchando contra las mareas y todo este tiempo perdido fue en vano. Saqué todo el código del teléfono del hogar, excepto las funciones de licencia de barebones, y nunca miré atrás.
Usted puede..
Servicios de Microsoft SLP El potencial de software de InishTech ofrece la capacidad de ayudar a proteger el código sin afectar la funcionalidad de sus aplicaciones.
ACTUALIZACIÓN: (Divulgación: yo trabajo en Eazfuscator.NET) Lo que hace que el Software de Servicios SLP de Microsoft sea diferente es la capacidad de virtualizar el código, por lo que definitivamente puede hacerlo. Varios años pasaron desde que la pregunta fue originalmente hecha; Hoy en día hay más productos disponibles que también funcionan de manera similar, como:
.NET Reflector solo puede abrir "código administrado", que básicamente significa "código .NET". Por lo tanto, no puede usarlo para desensamblar archivos COM DLL, C ++ nativo, código clásico de Visual Basic 6.0 , etc. La estructura del código compilado .NET lo hace muy conveniente, portátil, detectable, verificable, etc. El .NET Reflector aprovecha las ventajas de esto le permite mirar en ensamblados compilados, pero los descompiladores y desensambladores no son de ninguna manera específicos de .NET y han existido desde que existieron los compiladores.
Puede usar los ofuscadores para hacer que el código sea más difícil de leer, pero no puede evitar exactamente que se descompile sin que también sea ilegible para .NET. Hay un puñado de products (generalmente costosos) que afirman "vincular" su aplicación de código administrado a una aplicación de código nativo, pero incluso si realmente funcionan, una persona determinada siempre encontrará la manera.
Sin embargo, cuando se trata de ofuscación, obtienes lo que pagas. Entonces, si su código es tan propietario que debe hacer todo lo posible para protegerlo, debería estar dispuesto a invertir dinero en un buen ofuscador.
Sin embargo, en mis más o menos 15 años de experiencia escribiendo código, me he dado cuenta de que sobreproteger su código fuente es una pérdida de tiempo y tiene pocos beneficios. Tratar de leer el código fuente original sin la documentación de respaldo, los comentarios, etc. puede ser muy difícil de entender. Agregue a eso los nombres de las variables sin sentido que vienen con los descompiladores y el código de espagueti que crean los ofuscadores modernos: probablemente no tenga que preocuparse demasiado por las personas que roban su propiedad intelectual.
Actualizar
Jared señaló que de4dot afirma ser capaz de descompilarlo.
.NET Reactor proporciona protección completa para su propiedad intelectual sensible al convertir sus ensamblados .NET en procesos no administrados que no pueden entenderse como CIL y que ninguna herramienta existente puede descompilar. Los hackers no tienen acceso a ninguna forma inteligible de su fuente.
Potentes y flexibles, las características de licencia de .NET Reactor le permiten hacer cumplir las condiciones de su licencia y proteger su flujo de ingresos mediante el uso de bloqueos de hardware y software. El administrador de licencias puede construir licencias de prueba o permanentes, en cuestión de segundos. Un kit de desarrollo de software (SDK) completamente documentado, completo con ejemplos, le permite llamar al sistema de licencias directamente desde su código, lo que le permite crear extensiones personalizadas para el sistema de licencias.
Use la actualización en línea para bloquear esas copias sin licencia.
Verifique el número de serie de diferentes módulos de su aplicación y no use una llamada de función única para hacer la verificación (de modo que los crackers no puedan pasar por alto la verificación fácilmente).
No solo verifique el número de serie al inicio, haga la verificación mientras guarda los datos, hágalo todos los viernes por la noche, hágalo cuando el usuario está inactivo ...
Verifique la suma de verificación del archivo de aplicación, almacene su suma de verificación de seguridad en diferentes lugares.
No vaya demasiado lejos en este tipo de trucos, asegúrese de que su aplicación nunca se bloquee / no funcione correctamente al verificar el código de registro.
Crear una aplicación útil para los usuarios es mucho más importante que hacer una
Binario irrompible para galletas.