Cómo proteger dlls?

¿Cómo protejo las dlls de mi proyecto de tal manera que no puedan ser referenciadas y utilizadas por otras personas?

Gracias

La respuesta corta es que más allá de las cosas obvias, no hay mucho que puedas hacer.

Las cosas obvias que podría considerar (más o menos en orden de dificultad creciente y plausibilidad decreciente) incluyen:

  • Enlace estático por lo que no hay una DLL para atacar.
  • Eliminar todos los símbolos.
  • Utilice un archivo .DEF y una biblioteca de importación para que solo las exportaciones anónimas se conozcan solo por sus ID de exportación.
  • Mantenga la DLL en un recurso y exponga en el sistema de archivos (bajo un nombre adecuadamente oscuro, tal vez incluso generado en tiempo de ejecución) solo cuando se ejecuta.
  • Ocultar todas las funciones reales detrás de un método de fábrica que intercambia un secreto (mejor, prueba de conocimiento de un secreto) para una tabla de indicadores de función para los métodos reales.
  • Utilice técnicas anti-depuración tomadas del mundo del malware para evitar la ingeniería inversa. (Tenga en cuenta que esto probablemente le proporcionará falsos positivos de las herramientas AV).

De todos modos, un usuario suficientemente determinado todavía puede encontrar maneras de usarlo. Un desensamblador decente proporcionará rápidamente toda la información necesaria.

Tenga en cuenta que si su DLL es realmente un objeto COM o, peor aún, un conjunto CLR, existe una gran cantidad de información sobre el tipo de tiempo de ejecución que no se puede quitar sin romper su uso previsto.

EDITAR: Ya que ha insistido en dar a entender que C # y .NET son el entorno en lugar de una DLL pura de Win32 escrita en C, entonces realmente debería revisar lo anterior a “No se puede, pero …”

Ha existido un mercado para las herramientas de ofuscación durante mucho tiempo para tratar con entornos donde la entrega de fonts comstackbles es obligatoria, pero no desea entregar una fuente útil. Hay productos C # que juegan en ese mercado, y parece que al menos uno ha intervenido.

Debido a que cargar un ensamblaje requiere tanto esfuerzo del marco, es probable que haya bits de permiso que ejerzan cierto control para los proveedores honestos y los consumidores de ensamblajes. No he visto ninguna discusión sobre la seguridad real proporcionada por estos métodos y simplemente no sé cuán efectivos son contra un ataque determinado.

Mucho dependerá de tu caso de uso. Si simplemente desea evitar el uso ocasional, probablemente pueda encontrar una solución que funcione para usted. Si desea proteger los valiosos secretos comerciales de la ingeniería inversa y la reutilización, puede que no sea tan feliz.

Estás enfrentando el mismo problema que los defensores de DRM.

Si su progtwig (que desea poder ejecutar el DLL) es ejecutable por alguna cuenta de usuario, entonces no hay nada que pueda detener a un progtwigdor suficientemente determinado que pueda iniciar sesión como ese usuario al aislar el código que realiza el descifrado y el uso eso para descifrar tu DLL y ejecutarlo.

Por supuesto, puede hacer que sea inconveniente realizar esta ingeniería inversa, y eso puede ser suficiente.

Eche un vistazo a StrongNameIdentityPermissionAttribute . Le permitirá declarar el acceso a su ensamblaje. Combinado con una buena herramienta de protección de código (como CodeVeil (descargo de responsabilidad vendo CodeVeil)) estará bastante contento.

Puede incrustarlo en su ejecutable y extraer y cargar la biblioteca en tiempo de ejecución y llamar a ella. O puede usar algún tipo de clave compartida para cifrar / descifrar el archivo adjunto y hacer lo mismo anteriormente.

Supongo que ya ha considerado soluciones como comstackrla si realmente no quiere que se comparta. Si alguien realmente quiere llegar a él, hay muchas maneras de hacerlo.

Bueno, podría marcar todas sus clases “públicas” como “internas” o “internas protegidas”, luego marcar sus ensamblajes con [assembly: InternalsVisibleTo (“”)] Attribute y nadie más que los ensamblajes marcados pueden ver los contenidos.

¿Has probado el reactor .Net? Recientemente lo encontré. Algunas personas dicen que es genial, pero aún lo estoy probando.

Puede estar interesado en la siguiente información acerca de los ensamblados de amigos: http://msdn.microsoft.com/en-us/library/0tke9fxk(VS.80).aspx