Domanda

Sto cercando di ottenere il {} Smartassembly obfuscator NET per lavorare con il mio sistema. Io attualmente memorizzare i dati degli utenti in una serie di lezioni del dizionario serializzati, e quindi deserializzare le classi per ottenere i dati indietro. Sto già ignorando le informazioni sulla versione di montaggio, proprio perché in questo modo rendere la vita un dolore. Tale codice viene adattato da 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;
    }
}

Il problema è che ora la mia app offuscato ignorerà le informazioni sulla versione, ma non è in grado di leggere i dati salvati dal l'applicazione non offuscato, e viceversa. Avremo bisogno di avere una versione non offuscato, al fine di eseguire il debug dell'applicazione, quindi questo è un abbastanza grande showstopper per noi. Un modo per aggirare questo problema? Non dovrei solo offuscare le classi di dati? Che sembra una abbastanza grande buco di sicurezza.

È stato utile?

Soluzione

Forse considerare un serializzatore che non è legata al tipo e campo nomi? Ad esempio, protobuf-net è un serializzatore binario, ma utilizza tag numerici impostati (tramite un attributo) contro ogni membro. Ciò significa:

  • la serializzazione non è legato alla versione di montaggio a tutti
  • le informazioni sul nome campo non è nel file serializzato
  • (dal sopra) non importa se il codice è offuscato
  • (e) il file non può essere utilizzato per rompere banalmente l'offuscamento (anche se i dati potrebbero ancora suggerire intento a meno che non criptato)

Ad esempio:

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

Qui, il 1 è tutto ciò che ha identificato il membro nel file. La chiave qui è che è su base contrattuale, in modo da può essere deserializzato in seguito con un tipo non correlato:

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

(che va bene in quanto offuscamento conserva metadati, IIRC).

Contrasto questo per altri serializzatori contratto-based (come ad esempio XmlSerializer o DataContractSerializer) - in cui si sarebbe costretti a mettere il nome utente negli attributi, che sarebbe praticamente inutile rendere offuscamento:

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

Altri suggerimenti

L'offuscamento non fornisce la sicurezza in primo luogo. Quindi, si può prendere in considerazione di farlo cadere, punto.

Le due opzioni che vedo sono:

  1. Non offuscare quei tipi. Questo renderà le cose solo di lavoro.
  2. scrivere il proprio codice serializzatore.

Dal momento che si guadagna nulla da offuscando, mi piacerebbe andare con # 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top