Pregunta

Tengo una asamblea que debería no ser utilizado por cualquier aplicación que no sea el ejecutable designado.Por favor dame algunas instrucciones para hacerlo.

¿Fue útil?

Solución

Puede firmar el ensamblado y el ejecutable con la misma clave y luego marcar el constructor de las clases que desea proteger:

public class NotForAnyoneElse {
  public NotForAnyoneElse() {
    if (typeof(NotForAnyoneElse).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName().GetPublicKeyToken()) {
      throw new SomeException(...);
    }
  }
}

Otros consejos

En .Net 2.0 o superior, haga que todo sea interno y luego use Friend Assemblies

http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx

Esto no detendrá la reflexión.Quiero incorporar parte de la información de abajo.Si es absolutamente necesario evitar que alguien llame, probablemente la mejor solución sea:

  1. ILFusionar el .exe y el .dll
  2. ofuscar el .exe final

También puede verificar la pila de llamadas y obtener el ensamblado para cada persona que llama y asegurarse de que todos estén firmados con la misma clave que el ensamblado.

100% completamente imposible sin pasar por algunos obstáculos.

Una de las ventajas de usar .NET es la capacidad de usar la reflexión, es decir, cargar un ensamblaje e inspeccionarlo, llamar dinámicamente a métodos, etc.Esto es lo que hace posible la interoperabilidad entre VB.NET y F#.

Sin embargo, dado que su código está en un ensamblado administrado, eso significa que cualquiera puede agregar una referencia a su código e invocar sus métodos públicos o cargarlo usando la reflexión y llamar a métodos privados.Incluso si "ofuscas" tu código, las personas aún podrán usar la reflexión e invocar tu código.Sin embargo, dado que todos los nombres estarán enmascarados, hacer cualquier cosa es prohibitivamente difícil.

Si debe enviar su código .NET de una manera que impida que otras personas lo ejecuten, es posible que pueda NGEN su binario (compilarlo en x86) y enviar esos binarios.

No conozco los detalles de su situación, pero la ofuscación debería ser suficiente.

También puedes considerar usar el netz empacador y compresor ejecutable.

Esto toma sus ensamblados y su archivo .exe y los empaqueta en un único ejecutable para que no sean visibles para el mundo exterior sin investigar un poco.

Supongo que esto es suficiente para impedir el acceso a la mayoría de los programadores .net.

Una gran ventaja del enfoque .netz es que no requiere que cambie su código.Otro beneficio es que realmente simplifica el proceso de instalación.

Debería poder hacer que todo tenga un alcance interno y luego usar el InternosVisiblePara Atributo para otorgar solo a ese ensamblado acceso a los métodos internos.

El atributo de seguridad de acceso al código que @Carlos Graham menciona es Atributo de permiso de identidad de nombre fuerte

Como algunas personas han mencionado, use el atributo InternalsVisibleTo y marque todo como interno.Por supuesto, esto no protegerá contra la reflexión.

Una cosa que no se ha mencionado es fusionarse sus ensamblajes en su .exe/.dll/lo que sea principal, esto aumentará un poco la barrera de entrada (las personas no podrán ver su ensamblaje solo pidiendo que se haga referencia a él), pero no detendrá la ruta de reflexión. .

ACTUALIZAR:Además, IIRC, ilmerge tiene una característica donde puede internalizar automáticamente los ensamblajes fusionados, lo que significaría que no necesita usar InternalsVisibleTo en absoluto.

No estoy seguro de si esta es una vía disponible para usted, pero tal vez pueda alojar el ensamblado utilizando servicios web WCF o ASP.NET y utilizar algún tipo de esquema de autenticación (LDAP, pares de claves públicas/privadas, etc.) para garantizar Sólo los clientes permitidos se conectan.Esto mantendrá su ensamblaje físicamente fuera del alcance de cualquier otra persona y podrá controlar quién se conecta a él.Solo un pensamiento.

Es posible que pueda configurar esto en las políticas de seguridad de acceso al código en el ensamblaje.

Puedes utilizar la ofuscación.

Eso se convertirá:

int MySecretPrimeDetectionAlgorithm(int lastPrimeNumber);

En algo ilegible como:

int Asdfasdfasdfasdfasdfasdfasdf(int qwerqwerqwerqwerqwerqwer);

Otros aún podrán utilizar su ensamblaje, pero será difícil lograr algo sensato.

Parece que está buscando una herramienta de protección u ofuscación.Si bien no existe una solución milagrosa, la herramienta de protección que recomiendo es ensamblaje inteligente.Algunas alternativas son Ofuscador salamandra, fuscador de puntos, y Xenocódigo.

Desafortunadamente, si le das tus bytes a alguien para que los lea...Si tienen suficiente tiempo y esfuerzo, pueden encontrar una manera de cargar y llamar a su código.Para responder de forma preventiva a un comentario que veo que preguntas con frecuencia:Salamander evitará que su código se cargue directamente en la herramienta Reflector, pero lo he hecho mejor (es decir:más confiables) experiencias con smartassembly.

Espero que esto ayude.:)

Si el ensamblado fuera un servicio web, por ejemplo, podría asegurarse de que el ejecutable designado pase un valor secreto en el mensaje SOAP.

Solo requiere que se envíe un código de acceso mediante una llamada de función y, si no ha sido autorizado, nada funciona, como .setAuthorizeCode('123456') y luego, en cada lugar que se pueda usar, verifique si AuthorizeCode! = 123456 luego arroja un error o simplemente sale...No parece una buena respuesta para la reutilización, pero ese es exactamente el punto.

El único momento en que puede usarlo es usted y cuando codifica el código de autorización en el programa.

Sólo una idea, podría ser lo que estás buscando o podría inspirarte a algo mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top