Herramientas / estrategia de ofuscación .NET [cerrado]


160

Mi producto tiene varios componentes: ASP.NET, la aplicación de formularios Windows Forms y el servicio de Windows. El 95% del código está escrito en VB.NET.

Por razones de propiedad intelectual, necesito ofuscar el código, y hasta ahora he estado usando una versión de dotfuscator que ahora tiene más de 5 años. Estoy pensando que es hora de pasar a una herramienta de nueva generación. Lo que estoy buscando es una lista de requisitos que debería tener en cuenta al buscar un nuevo ofuscador.

Lo que sé que debería buscar hasta ahora:

  • Serialización / Deserialización . En mi solución actual, simplemente le digo a la herramienta que no ofusque a ningún miembro de datos de la clase porque el dolor de no poder cargar datos que se serializaron anteriormente es simplemente demasiado grande.
  • Integración con el proceso de construcción
  • Trabajando con ASP.NET . En el pasado, he encontrado este problema debido al cambio de nombres .dll (a menudo tiene uno por página), que no todas las herramientas manejan bien.

Varios duplicados: google.com/…
John Rasch


Consulte Agile.net .NET Obfuscator para obtener una solución alternativa para ofuscar su código. En particular, compruebe su función de virtualización de código.
Sutton Bernard el

Vea una buena lista de ofuscadores de ArmDot a Xenocode aquí en SO: stackoverflow.com/a/60054/1480104
Artem Razin

Respuestas:


43

Volver con la ofuscación de .Net 1.1 era esencial: descompilar el código era fácil, y se podía pasar del ensamblado, a IL, al código C # y volver a compilarlo con muy poco esfuerzo.

Ahora con .Net 3.5 no estoy del todo seguro. Intente descompilar un ensamblado 3.5; lo que obtienes está muy lejos de compilar.

Agregue las optimizaciones de 3.5 (mucho mejor que 1.1) y la forma en que los tipos anónimos, los delegados, etc., se manejan por reflexión (son una pesadilla recompilar). Agregue expresiones lambda, compilador 'magic' como Linq-syntax y varfunciones C # 2 como yield(lo que da como resultado nuevas clases con nombres ilegibles). Su código descompilado termina muy lejos de ser compilable.

Un equipo profesional con mucho tiempo aún podría realizar ingeniería inversa de nuevo, pero lo mismo es cierto para cualquier código ofuscado. El código que obtuvieron de eso sería imposible de mantener y es muy probable que tenga muchos errores.

Recomendaría firmar con clave sus ensamblajes (lo que significa que si los piratas informáticos pueden recompilar uno, tienen que recompilar todos), pero no creo que la ofuscación valga la pena.


127
Totalmente en desacuerdo. La firma no puede reemplazar la ofuscación. La firma tiene como objetivo piratear su código. Pero si ocultas tu idea, los algoritmos, etc., la ofuscación es la única forma.
Shrike

24
No creo que la firma pueda reemplazar la ofuscación, solo hace que sea mucho más difícil de hackear. La ofuscación no puede ocultar su idea; si quieren copiar eso, de todos modos lo harán, y la ofuscación ni siquiera lo hará mucho más difícil. En particular, dado que los algoritmos son todos los operadores, la ofuscación no tiene mucho efecto sobre ellos, generalmente son una de las cosas más fáciles de extraer.
Keith el

66
La ofuscación puede no valer la pena si habla de un equipo con muchos recursos disponibles, pero la ofuscación es excelente para proteger contra el desarrollador "promedio" que no quiere nada más que usar Reflector para abrir su ensamblaje y guardar el código fuente como proyecto y haciendo ajustes. La ofuscación tiene su lugar y descartarlo por completo es una actitud equivocada. Es una capa de defensa.
Razor

55
Cuando descompila, la fuente está en un estado desordenado pero lógicamente sigue los mismos caminos. No hay un compilador de vudú 'mágico'. Lo sé porque había perdido un repositorio recientemente y usé reflector para recuperar el código fuente. La ofuscación es solo un dolor para "mantener", si no es parte de su proceso de construcción. Agrega gastos generales, pero ¿todos estamos escribiendo aplicaciones computacionalmente intensivas? No. Es una capa de defensa débil para un atacante débil.
Razor

8
Que horrible respuesta. ¿Realmente has intentado descompilar últimamente? Descompiladores han conseguido mejor , no peor. Reflector ofrece una calidad casi original, sin comentarios, por supuesto.
BlueRaja - Danny Pflughoeft

50

Hemos probado varios ofuscadores. Ninguno de ellos funciona en una gran aplicación cliente / servidor que utiliza comunicación remota. El problema es que el cliente y el servidor comparten algunos dlls, y no hemos encontrado ningún ofuscador que pueda manejarlo.

Hemos probado DotFuscator Pro, SmartAssembly, XenoCode, Salamander y varias aplicaciones pequeñas cuyos nombres se me escapan.

Francamente, estoy convencido de que la ofuscación es un gran truco.

Incluso los problemas que aborda no son del todo un problema real. Lo único que realmente necesita proteger es cadenas de conexión, códigos de activación, cosas sensibles a la seguridad como esas. Esta tontería de que otra compañía va a realizar ingeniería inversa de toda su base de código y crear un producto de la competencia es algo de la pesadilla de un gerente paranoico, no la realidad.


14
Bravo Judá! La única forma de mantenerse a la vanguardia es desarrollar un código nuevo y mejor, sin aferrarse al código que ya ha escrito. Terminas invirtiendo tiempo, esfuerzo y tal vez incluso dinero en algo que es irrelevante. La ofuscación no vale la pena.
David Rutten

180
Es por eso que no me gusta este sistema de reputación, tiene 19 votos y no ha proporcionado una respuesta. El usuario no solicita su opinión sobre la ofuscación, quiere saber más sobre las técnicas de ofuscación.
barra invertida17

32
Proporcioné información sobre mis experiencias usando varios ofuscadores existentes. Y mi opinión deriva de esa experiencia.
Judah Gabriel Himango

66
+1 para "Francamente, estoy convencido de que la ofuscación es un gran truco". No podrías haberlo dicho mejor que esto.
Andrei Rînea

15
Una necesidad muy válida para proteger su código es vender costosas aplicaciones especializadas a compañías que las usarán internamente con solo unos pocos usuarios. La tentación es revertir el código para permitir la piratería interna y las modificaciones para sus propios fines, evitar contratos de mantenimiento o incluso piratear versiones de prueba para obtener los beneficios que necesitan.
Brady Moritz

44

Estoy 'Rodilla Profunda' en esto ahora, tratando de encontrar una buena solución. Aquí están mis impresiones hasta ahora.

Xenocode : tengo una licencia anterior para Xenocode2005 que solía usar para ofuscar mis ensamblados .net 2.0. Funcionó bien en XP y fue una solución decente. Mi proyecto actual es .net 3.5 y estoy en Vista, el soporte me dijo que lo intentara, pero la versión 2005 ni siquiera funciona en Vista (se bloquea), así que ahora tengo que comprar 'PostBuild2008' a un precio increíble. de $ 1900. Esta podría ser una buena herramienta, pero no voy a averiguarlo. Muy caro.

Reactor.Net : este es un punto de precio mucho más atractivo y funcionó bien en mi Ejecutable independiente. El módulo de licencias también fue agradable y me habría ahorrado mucho esfuerzo. Desafortunadamente, le falta una característica clave y es la capacidad de excluir cosas de la ofuscación. Esto hace que sea imposible lograr el resultado que necesitaba (Fusionar múltiples ensamblajes, ofuscar algunos, no ofuscar otros).

SmartAssembly : descargué el Eval para esto y funcionó a la perfección. Pude lograr todo lo que quería y la interfaz era de primera clase. El precio sigue siendo un poco elevado.

Dotfuscator Pro : no se pudo encontrar el precio en el sitio web. Actualmente en conversaciones para obtener una cotización. Suena siniestro

Confuser : un proyecto de código abierto que funciona bastante bien (para confundir a ppl, tal como su nombre lo indica).

Nota: Según se informa, ConfuserEx está "roto" según el número 498 en su repositorio de GitHub.


8
¿Puedes publicar cuánto cotizó dotfuscator?
Anthony Johnston

66
@Anthony Recientemente compré una licencia a principios de 2011. La cotización fue de $ 2475 USD para la máquina mínima de 1 compilación + 1 licencia de desarrollador. Incluye 12 meses de actualizaciones y soporte.
Yoshi

2
No estaba usando .NET Reactor cuando se realizó esta publicación, pero ahora puede excluir partes de su código de la ofuscación usando el atributo System.Reflection.Obfuscation. También hay algunas configuraciones que le permiten hacer cosas como excluir todos los métodos o todos los tipos serializables.
benteight

55
DotFuscator me citó $ 4999, que se redujo a $ 4500 debido a un descuento del 10%. ¡Esto fue para 1 licencias de desarrollo! En las discusiones se redujo a $ 2500 pero aún es demasiado caro.
Oliver

3
.NET Reactor ahora tiene un Editor de reglas de exclusión que permite excluir ciertas clases, métodos o propiedades de la ofuscación. Además, puede usar la casilla de verificación "Combinar solo" para excluir un dll específico de la ofuscación
avitenberg


18

He estado usando smartassembly. Básicamente, elige un dll y lo devuelve ofuscado. Parece funcionar bien y hasta ahora no he tenido problemas. Muy, muy fácil de usar.


66
Smartassembly es bastante inútil. Un cracker coloca su aplicación en DumbAssembly y toda la "protección" se elimina con un clic del mouse: woodmann.com/collaborative/tools/index.php/Dumbassembly
Elmue

2
A partir de ahora, la navegación segura de Google señala que el sitio de woodmann no es seguro. Además, el sitio de woodmann tiene un artículo completo sobre él sufriendo previamente una infección de malware, por lo que realmente no quiero navegar por su sitio cuando Google no confía en él.
Brian

10

He probado casi todos los ofuscadores en el mercado y SmartAssembly es el mejor en mi opinión.


66
Smartassembly es bastante inútil. Un cracker coloca su aplicación en DumbAssembly y toda la "protección" se elimina con un clic del mouse: woodmann.com/collaborative/tools/index.php/Dumbassembly
Elmue

3
A partir de ahora, la navegación segura de Google señala que el sitio de woodmann no es seguro. Además, el sitio de woodmann tiene un artículo completo sobre él sufriendo previamente una infección de malware, por lo que realmente no quiero navegar por su sitio cuando Google no confía en él.
Brian

9

También he estado usando SmartAssembly. Encontré que Ezrinz .Net Reactor es mucho mejor para mí en aplicaciones .net. Se ofusca, es compatible con Mono, combina conjuntos y también tiene un módulo de licencia muy bueno para crear una versión de prueba o vincular la licencia a una máquina en particular (muy fácil de implementar). El precio también es muy competitivo y cuando necesitaba ayuda, eran rápidos. Eziriz

Para ser claros, solo soy un cliente al que le gusta el producto y no está relacionado de ninguna manera con la empresa.


Tengo varios amigos que confían en .Net Reactor, aunque no en el sitio web de productos también hay un grupo de Google útil para el producto: groups.google.com/group/net-reactor-users?hl=es
Bittercoder

2
+1 para Eziriz. He tenido excelentes resultados con eso. Es lo mejor que hay en este momento, OMI.
Druida el

44
.NET Reactor apesta. Cambié mi computadora, envié un correo electrónico dos veces con respecto al archivo de licencia y no obtuve respuesta. Verá que la licencia de .NET Reactor está bloqueada por hardware.
O bien,

2
Eso es normal. ¿Cómo esperas que te crean? ¿Cómo saben que realmente cambiaste tu computadora y no intentas ejecutar una licencia de tu amigo en tu computadora? ¡Para eso es un bloqueo de hardware! Si pudiera usarse en varias computadoras, un bloqueo de hardware sería inútil.
Elmue

(PD. Elegimos Reactor en gran medida sobre la base de esta respuesta SO.)
Chris

7

La respuesta corta es que no puedes.

Existen varias herramientas que dificultarán que alguien lea su código, algunas de las cuales han sido señaladas por otras respuestas.

Sin embargo, todo esto hace que sea más difícil de leer: aumentan la cantidad de esfuerzo requerido, eso es todo. A menudo, esto es suficiente para disuadir a los lectores ocasionales, pero alguien que esté decidido a profundizar en su código siempre podrá hacerlo.


51
if (esfuerzos.Required> codeFromScratch.Costs) DoNoReverseEngineer ();
Nicolas Dorier

41
@NicolasDorier,Operator '>' cannot be applied to operands of type 'System.TimeSpan' and 'decimal'
Saeb Amini

21
@Saeb seguro de que pueden hacerlo, de lo que trata la mayoría de las empresas es de TimeSpan a dinero (decimal).
hultqvist

6

Tenemos una aplicación de varios niveles con una interfaz asp.net y winform que también admite la comunicación remota. No he tenido problemas con el uso de ningún ofuscador con la excepción del tipo de cifrado que genera un cargador que puede ser problemático en todo tipo de formas inesperadas y, en mi opinión, simplemente no vale la pena. En realidad, mi consejo sería más similar a "Evitar cifrar ofuscadores de tipo cargador como la peste". :)

En mi experiencia, cualquier ofuscador funcionará bien con cualquier aspecto de .net, incluyendo asp.net y control remoto, solo tiene que intimar con la configuración y aprender hasta dónde puede empujarlo en qué áreas de su código. Y tómese el tiempo para intentar realizar ingeniería inversa en lo que obtiene y ver cómo funciona con las diversas configuraciones.

Usamos varios a lo largo de los años en nuestras aplicaciones comerciales y nos instalamos en el ofuscador Spices de 9rays.net porque el precio es correcto, hace el trabajo y tienen un buen soporte, aunque realmente no lo hemos necesitado en años, pero para ser sincero. No creo que realmente importe qué ofuscador uses, los problemas y la curva de aprendizaje son todos los mismos si quieres que funcione correctamente con control remoto y asp.net.

Como otros han mencionado, todo lo que realmente está haciendo es el equivalente a un candado, mantener alejadas a las personas honestas y / o hacer más difícil simplemente recompilar una aplicación.

La licencia suele ser el área clave para la mayoría de las personas y, de todos modos, definitivamente debería utilizar algún tipo de sistema de certificado firmado digitalmente para la licencia. Su mayor pérdida vendrá del intercambio casual de licencias si no tiene un sistema inteligente, las personas que rompen el sistema de licencias nunca comprarían en primer lugar.

Es realmente fácil llevar esto demasiado lejos y tener un impacto negativo en sus clientes y su negocio, haga lo que sea simple y razonable y luego no se preocupe por eso.


5

Durante los últimos dos días he estado experimentando con Dotfuscator Community Edition Advanced (una descarga gratuita después de registrar el CE básico que viene incluido con Visual Studio).

Creo que la razón por la que más personas no usan la ofuscación como opción predeterminada es porque es una molestia grave en comparación con el riesgo. En proyectos de prueba más pequeños, pude ejecutar el código ofuscado con mucho esfuerzo. Implementar un proyecto simple a través de ClickOnce fue problemático, pero se logró después de firmar manualmente los manifiestos con mage. El único problema fue que, en caso de error, el seguimiento de la pila volvió ofuscado y el CE no tiene un desobuscador o clarificador empaquetado.

Intenté ofuscar un proyecto real basado en VSTO en Excel, con integración de Virtual Earth, muchas llamadas de servicio web y un contenedor IOC y mucha reflexión. Fue imposible.

Si la ofuscación es realmente un requisito crítico, debe diseñar su aplicación teniendo esto en cuenta desde el principio, probando las compilaciones ofuscadas a medida que avanza. De lo contrario, si se trata de un proyecto bastante complejo, terminarás con una gran cantidad de dolor.


5

Crypto Obfuscator aborda todas sus inquietudes y escenarios. Eso :

  1. Excluye automáticamente los tipos / miembros de la ofuscación según las reglas. Los tipos / campos serializados son uno de ellos.
  2. Se puede integrar en el proceso de compilación utilizando MSBUild.
  3. Soporta proyectos ASP.Net.

3
fyi @logicnp escribió Crypto.
CAD bloke

Crypto parece que ya no es compatible.
Carl

He intentado varios, "Crypto" parecía muy agresivo y útil, pero cuando ejecuté la DLL ofuscada en De4dot obtuve el código original ... Perdón por arruinar la fiesta ...
Dave Gahan

4

Recientemente he intentado conectar la salida de un ofuscador libre a otro ofuscador libre, a saber, Dotfuscator CE y el nuevo ofuscador Babel en CodePlex. Más detalles en mi blog .

En cuanto a la serialización, moví ese código a una DLL diferente y lo incluí en el proyecto. Razoné que no había secretos allí que no estén en el XML de todos modos, por lo que no necesitaba ofuscación. Si hay algún código serio en esas clases, el uso de clases parciales en el ensamblaje principal debería cubrirlo.


-1, porque "oye, te escuché como ofuscadores, así que ejecuté un ofuscador en la salida de un ofuscador ... ¿quieres saber más? Dame golpes de página". Pero el segundo párrafo me parece una muy buena sugerencia.
ANeves

3

Debe usar lo que sea más barato y mejor conocido para su plataforma y llamarlo por día. La ofuscación de lenguajes de alto nivel es un problema difícil, porque los flujos de código de operación de VM no sufren los dos problemas más grandes que tienen los flujos de código de operación nativos: identificación de función / método y alias de registro.

Lo que debe saber sobre la inversión de bytecode es que ya es una práctica estándar para los probadores de seguridad revisar el código X86 directo y encontrar vulnerabilidades en él. En X86 sin procesar, no necesariamente puede encontrar funciones válidas, y mucho menos rastrear una variable local a lo largo de una llamada de función. En casi ninguna circunstancia, los inversores de código nativo tienen acceso a nombres de funciones y variables, a menos que estén revisando el código de Microsoft, para lo cual MSFT proporciona esa información al público.

"Dotfuscation" funciona principalmente codificando funciones y nombres de variables. Probablemente sea mejor hacer esto que publicar código con información de nivel de depuración, donde Reflector está literalmente renunciando a su código fuente. Pero cualquier cosa que haga más allá de esto es probable que obtenga rendimientos decrecientes.



3

Puede usar "Dotfuscator Community Edition"; viene de forma predeterminada en Visual Studio 2008 Professional. Puedes leer sobre esto en:

http://msdn.microsoft.com/en-us/library/ms227240%28VS.80%29.aspx
http://www.preemptive.com/dotfuscator.html

La versión "profesional" del producto cuesta dinero pero es mejor.

¿Realmente necesitas ofuscar tu código? Por lo general, hay muy poco error con la descompilación de su aplicación, a menos que se utilice con fines de seguridad. Si le preocupa que las personas "roben" su código, no se preocupe; La gran mayoría de las personas que busquen su código serán con fines de aprendizaje. De todos modos, no existe una estrategia de ofuscación totalmente efectiva para .NET: alguien con suficiente habilidad siempre podrá descompilar / cambiar su aplicación.


+1 por esto. He probado casi todos los ofuscadores .NET gratuitos, y Dotfuscator fue el único que realmente ofuscó una proporción sustancial del MSIL en mis aplicaciones ASP.NET.
saille

@Saille, ¿has utilizado el Dotfuscator - Community Edition gratis para eso? Acabo de tener un chat de ventas y dicen que la edición pro cuesta 2000 EUR. :(
Houman

Dotfuscator no tiene valor.
user626528

3

Evitar Reactor. Es completamente inútil (y sí, pagué una licencia). Xenocode fue el mejor que encontré y también compré una licencia. El soporte fue muy bueno, pero no lo necesitaba mucho, ya que simplemente funcionó. Probé todos los ofuscadores que pude encontrar y mi conclusión es que xenocode fue de lejos el más robusto e hizo el mejor trabajo (también la posibilidad de publicar el proceso de tu .NET exe en un exe nativo que no vi en ningún otro lugar).

Hay dos diferencias principales entre el reactor y el xenocode. El primero es que Xenocode realmente funciona. El segundo es que la velocidad de ejecución de sus ensamblajes no es diferente. Con el reactor fue aproximadamente 6 millones de veces más lento. También tuve la impresión de que el reactor era una operación de un solo hombre.


.NET Reactor tiene muchas opciones. Algunos de ellos incluyen protección en tiempo de ejecución y ralentizarán un poco la aplicación, pero este es el precio por la seguridad adicional que obtienes. Sin embargo, dudo seriamente si habrá una desaceleración si solo usará la ofuscación de .NET Reactor, sin ninguna otra opción
avitenberg


2

He estado ofuscando código en la misma aplicación desde .Net 1, y ha sido un gran dolor de cabeza desde la perspectiva del mantenimiento. Como mencionó, se puede evitar el problema de serialización, pero es realmente fácil cometer un error y ofuscar algo que no desea ofuscar. Es fácil romper la compilación o cambiar el patrón de ofuscación y no poder abrir archivos antiguos. Además, puede ser difícil descubrir qué salió mal y dónde.

Nuestra elección fue Xenocode, y si volviera a tomar la decisión hoy, preferiría no ofuscar el código o usar Dotfuscator.



1

Estamos utilizando SmartAssembly en nuestro cliente de Windows. Funciona bien

Agrega algunos problemas adicionales también. La impresión de los nombres de sus clases en archivos de registro / excepciones tiene que ser ofuscada. Y, por supuesto, no puede crear una clase a partir de su nombre. Por lo tanto, es una buena idea echar un vistazo a su cliente y ver qué problemas puede obtener al ofuscarse.




1

Tuve que usar una protección de ofuscación / recurso en mi último proyecto y encontré Crypto Obfuscator como una herramienta agradable y fácil de usar. El problema de la serialización es solo una cuestión de configuración en esta herramienta.


@logicnp, esta es tu segunda publicación en este hilo que respalda este producto. Informe si tiene una relación con el desarrollador de este producto.
H2ONaCl

Lo sentimos, pero de4dot puede desobuscar eso. Yo recomendaría usar ConfuserEx .
newbieguy

1

Hay una buena versión de código abierto llamada Obfuscar. Parece funcionar bien. Tipos, propiedades, campos, métodos pueden ser excluidos. El original está aquí: https://code.google.com/p/obfuscar/ , pero como parece que ya no se actualiza


He echado un vistazo a esto hoy: ¡tenga en cuenta la fecha de mi comentario! - y es un poco complicado comenzar. También perdí la mayor parte de la hora tratando de volver a firmar el ensamblado utilizando un archivo .pfx. Lanzó un error ininteligible, indocumentado; parece que solo puedes firmar usando un .snk.
SteveCinq



0

SmartAssembly es genial, fui utilizado en la mayoría de mis proyectos



-1

Ofuscarse no es una protección real.

Si tiene un archivo .NET Exe, hay MUCHO mejor solución .

Yo uso themida y puedo decir que funciona muy bien.

El único inconveniente de Themida es que no puede proteger .NET Dlls. (También protege el código C ++ en Exe y DLL)

Themida es mucho más barato que los ofuscadores aquí mencionados y es el mejor en protección contra la piratería en el mercado. Crea una máquina virtual donde se ejecutan partes críticas de su código y ejecuta varios subprocesos que detectan la manipulación o los puntos de interrupción establecidos por un cracker. Convierte .NET Exe en algo que Reflector ya ni siquiera reconoce como un ensamblado .NET.

Lea la descripción detallada en su sitio web: http://www.oreans.com/themida_features.php


-2

He probado un producto llamado Rummage y hace un buen trabajo al darle algo de control ... Aunque carece de muchas cosas que ofrece Eziriz, pero el precio de Rummage es demasiado bueno ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.