2009-02-05 6 views
5

Estoy tratando de conseguir que el {eyestable} .NET ofuscador funcione con mi sistema. Actualmente almaceno los datos del usuario en una serie de clases de diccionarios serializados, y luego deserializo esas clases para recuperar los datos. Ya ignoro la información de la versión de ensamblaje, solo porque de esa manera le está haciendo daño a la vida. Ese código es adapted from MSDN:¿Cómo mantengo la compatibilidad de deserialización entre las versiones ofuscadas y depuradas?

//to avoid cross-versioning problems 
public sealed class CrossVersionDeserializationBinder : SerializationBinder { 
    public override Type BindToType(string assemblyName, string typeName) { 
     Type typeToDeserialize = null; 

     typeToDeserialize = Type.GetType(String.Format("{0}, {1}", 
      typeName, assemblyName)); 

     return typeToDeserialize; 
    } 
} 

El problema es que ahora mi aplicación ofuscado ignorará la información de versión, pero no puede leer los datos guardados por la aplicación no ofuscado, y viceversa. Tendremos que tener una versión no ofuscada para depurar la aplicación, por lo que este es un gran espectáculo para nosotros. ¿Alguna forma de evitar este problema? ¿Debo simplemente no ofuscar las clases de datos? Eso parece un agujero de seguridad bastante grande.

Respuesta

6

¿Quizás considere un serializador que no esté vinculado al tipo y nombres de campo? Por ejemplo, protobuf-net es un serializador binario, pero usa etiquetas numéricas establecidas (a través de un atributo) contra cada miembro. Esto significa:

  • serialización no está ligada a la versión de montaje en absoluto
  • la información del nombre de campo no está en el archivo serializado
  • (por lo anterior), no importará si el código está ofuscado
  • (y) el archivo no se puede utilizar para romper trivialmente la ofuscación (aunque los datos todavía podrían sugerir la intención menos cifrada)

Por ejemplo:

[ProtoContract] 
public class Foo { 
    [ProtoMember(1)] 
    public string Bar {get;set;} 
} 

Aquí, el 1 es todo lo que identificó al miembro en el archivo. La clave aquí es que es basado en un contrato, por lo que se puede deserializar más tarde con un tipo de relación:

[ProtoContract] 
public class a12 { 
    [ProtoMember(1)] 
    public string a {get;set;} 
} 

(lo cual está bien ya que preserva la ofuscación metadatos, IIRC).

Esto contrasta con otros serializadores basados ​​en contratos (como XmlSerializer o DataContractSerializer) - en el que se vería obligado a poner el nombre de miembro en los atributos, lo que haría más o menos la ofuscación sentido:

[DataContract] 
public class a12 { 
    [DataMember(Name="Bar")] 
    public string a {get;set;} 
} 
-1

La ofuscación no proporciona seguridad en primer lugar. Por lo tanto, es posible que desee considerar dejarlo caer, punto.

Las dos opciones que veo son:

  1. No ofuscar esos tipos. Esto hará que las cosas funcionen.
  2. Escriba su propio código de serializador.

Dado que no obtienes nada ofuscando, iría con el n. ° 1.

+0

I Es necesario que se ofusque para hacer funcionar un dongle, ya que sin ofuscación, será fácil eliminar las llamadas dongle. – mmr

+0

Newsflash: será muy fácil eliminar las llamadas de dongle incluso con la ofuscación. – MichaelGG

+0

Tal vez, incluso con todas las cosas específicas de la aplicación que vamos a poner en el dongle.No está destinado a detener al hacker dedicado, está destinado a detener al usuario que quita la clave y puede seguir usando el software. – mmr

Cuestiones relacionadas