Pregunta

Estoy intentando que el ofuscador .NET {smartassembly} funcione con mi sistema.Actualmente almaceno datos de usuario en una serie de clases de diccionario serializadas y luego deserializa esas clases para recuperar los datos.Ya estoy ignorando la información de la versión ensambladora, solo porque de esa manera me hace la vida más complicada.ese codigo es adaptado de MSDN:

//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 ofuscada ignorará la información de versión, pero no puede leer los datos guardados por la aplicación no ofuscada, y viceversa.Necesitaremos tener una versión no ofuscada para poder depurar la aplicación, por lo que esto es un gran obstáculo para nosotros.¿Alguna forma de solucionar este problema?¿Debería simplemente no ofuscar las clases de datos?Parece un agujero de seguridad bastante grande.

¿Fue útil?

Solución

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

  • la serialización no está ligada en absoluto a la versión ensambladora
  • la información del nombre del 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 aún pueden sugerir una intención a menos que estén cifrados)

Por ejemplo:

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

Aquí el 1 es todo lo que identifica al miembro en el expediente.La clave aquí es que está basado en contrato, por lo que se puede deserializar más tarde con un tipo no relacionado:

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

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

Compare esto con otros serializadores basados ​​en contratos (como XmlSerializer o DataContractSerializer) - donde se vería obligado a poner el nombre del miembro en los atributos, lo que prácticamente haría que la ofuscación fuera inútil:

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

Otros consejos

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

Las dos opciones que veo son:

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

Ya que no gana nada por ofuscar, me gustaría ir con # 1.

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